JDBC创建流程
1.加载驱动
2.获取连接
3.处理数据
4.释放资源
数据库环境已经搭建完成
在数据库中存在名称为 mydb 的数据库,其中存在一个user表,存放了一些信息,具体如下:
一 加载驱动
方法1:
DriverManager.registerDriver(new Driver())
此方法可以加载驱动
package com.mysql.cj.jdbc;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
但是使用此方法的时候会产生弊端
方法缺点:
1.内存中会产生两个Driver对象,一次是Driver类加载的时候通过静态代码块创建的,还有一个是方法本身创建的。这样虽然没有错误,但是会造成内存浪费。
2.new Driver() 对象是使用MySQL定义的方法调用的,一旦脱离MySQL的jar包,会导致代码失效。
package com.mysql.cj.jdbc;
解决办法:直接加载类而不创建对象,如何解决?
利用反射即可
方法 2:
Class.forName("com.mysql.cj.jdbc.Driver");
通过此方法也可以注册驱动,不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
二 获取连接
获取连接的方法是:
Connection conn = DriverManager.getConnection(url, "username", "password");
此方法三个参数,分别是协议、用户名和密码。
方法的返回值类型为Connection对象。
关于用户名和密码是指数据库的用户名和密码;
url:
统一资源定位符。具体可参照
URL_百度百科
String url = "jdbc:mysql://localhost:3306/mydb"; // 5的版本
上面的代码中
jdbc: 是JDBC连接协议
mysql:// 是mysql数据库连接协议,JDBC子协议
localhost:3306 主机和端口
mydb 数据库
MySQL驱动版本5.xxx只需要上述内容即可。
升级到8之后,需要在原来的基础上增加参数列表(?参数=值&参数=值)。
增加服务时间区域和字符集
String url ="jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8"; //8的版本
获取连接的代码
String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8"; // 8的版本
Connection conn = DriverManager.getConnection(url, "root", "123456");
完成以上代码即可获取数据库和Java程序之间的连接,接下来就可以通过Java程序对数据库中的内容进行操作了
三 处理数据
1 首先需要得到要对数据库执行的操作的方法
操作方法分为两种
1.1 对数据库数据进行查询操作,即:采用select语句
String sql = "select * from user;";
1.2 对数据库数据进行更新操作
String sql = "insert into user values(null, 'xiaoqi', '123', '[email protected]');";
2 有了操作如何让操作进行运行呢?
2.1首先需要一个执行对象
Java中的Connection类中提供方法,通过Connection对象来获取一个执行对象
Statement stmt = conn.createStatement();
statement执行对象的作用
作用1:将Java字符串转换成SQL指令
作用2:将SQL指令交给MySQL底层执行
2.2有了执行对象以后就可以执行对数据库的操作命令了
根据方法返回结果的不同可采用三种方法操作数据库的数据
2.2.1 executeQuery(sql) – 返回值类型为ResultSet集合
此方法一般用于对数据进行查询(select)操作
源码:
ResultSet executeQuery(String sql) throws SQLException;
执行代码:
ResultSet rs = stmt.executeQuery(sql);
此方法的结果是一个ResultSet集合,需要通过遍历集合的方法来查看结果
next() 判断数据,结果为boolean类型。判断数据库是否下一行存在数据
ResultSet既然用于封装执行结果的,所以该对象提供的大部分方法都是用于获取数据的get方法
获取任意类型的数据
getObject(int index) – 通过光标位置获取
getObject(string columnName) – 通过指定列名获取
获取指定类型的数据,参考下表:
代码演示
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " : " + username + " : " + password + " : " + email);
}
2.2.2 executeUpdate(sql) – 返回值类型为int类型
此方法一般用于对数据库进行更新(insert、delete、update)操作
源码:
int executeUpdate(String sql) throws SQLException;
执行代码
int count = stmt.executeUpdate(sql);
此方法返回的是int类型整数,表示的是对数据库进行修改的行数数量
代码演示
String sql = "update user set username='赵六', email='[email protected]' where id = 4;";
stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println("count = " + count);
2.2.3 execute(sql) – 返回值类型为boolean类型
使用此方法一般分为两种情况
第一种: 执行一个你已知返回多个结果会的存储过程,即:只需要执行代码,结果已知
第二种: 动态执行的未知SQL字符串。
源码:
boolean execute(String sql) throws SQLException;
此方法的返回值为true表示对数据库的进行查询操作
方法的返回值为false表示的是对数据库进行更改操作
获取连接
代码演示(1):
String sql = "select * from user;";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " : " + username + " : " + password + " : " + email);
}
代码演示(2):
String sql = "update user set username='赵六', email='[email protected]' where id = 4;";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println("count = " + count);
四 释放资源
dbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。
特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。
Connection的使用原则是尽量晚创建,尽量早的释放。
rs.close();
stmt.close();
conn.close;
全部代码:
@Test
public void test3() throws Exception {
// 1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立连接
String url = "jdbc:mysql://localhost:3306/day04?serverTimezone=UTC&characterEncoding=utf-8";
Connection conn = DriverManager.getConnection(url, "root", "123456");
// 3. 操作数据
// String sql = "insert into user values(null,'zhaoliu','123','[email protected]');";
// String sql = "update user set username = '赵六', password = '123', email = '[email protected]' where id = 4;";
String sql = "delete from user where username = '赵六';";
Statement stmt = conn.createStatement();
int updateCount = stmt.executeUpdate(sql);
System.out.println("updateCount = " + updateCount);
// 4. 释放资源
stmt.close();
conn.close();
}