文章目录
- JDBC本质
- 版本
- 使用
- 核心API
- Driver
- DriverManager
- 驱动注册
- 连接对象获取
- Connection
- 获取执行对象
- 事务管理
- Statement
- 概述
- ResultSet
- 概述
JDBC本质
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
主要由接口组成。
组成 JDBC 的2个包:
java.sql
javax.sql
开发 JDBC 应用需要以上 2 个包的支持外,还需要导入相应 JDBC 的数据库实现 (即数据库驱动)。第三方根据java的jdbc完成具体的实现驱动代码
版本
Connector/J版本 | 驱动类型 | JDBC版本 | MySQL服务器版本 | 状态 |
---|---|---|---|---|
5.1 | 4 | 3.0, 4.0, 4.1, 4.2 | 5.6, 5.7, 8.0* | 一般可用性 |
8.0 | 4 | 4.2 | 5.6, 5.7, 8.0 | 一般可用性,推荐版本 |
使用
到mysql官网https://dev.mysql.com/downloads下载驱动jar包
核心API
Driver
每个驱动程序类必须实现的接口
以前是需要手动将这个驱动程序类加载到java内存中,但是从jdbc4.0规范开始可以省略不写!
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager
Jdbc 程序中的 DriverManager 用于加载驱动,并创建与数据库的链接,这个 API 的常用方法:
- DriverManager.registerDriver(new Driver())
- DriverManager.getConnection(url, user, password),
驱动注册
注意:在实际开发中并不推荐采用 registerDriver 方法注册驱动。原因有二:
1、查看 Driver 的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个 Driver 对象。
2、程序依赖 mysql 的 api,脱离 mysql 的 jar 包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。
推荐方式:Class.forName(“com.mysql.cj.jdbc.Driver”);
采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
连接对象获取
根据指定的数据库服务访问路径,用户名,密码来获取一个实现了 Connection 接口的实现对象(不需要关注), 这个实现对象肯定实现了 Connection 接口中的所有抽象方法,所以 Java 程序只需要面向接口编程即可。
url的格式 : jdbc:mysql://ip地址:端口号/数据库名称
Connection
Connection(数据库连接对象)作用:
- 获取执行 SQL 的对象
- 管理事务
获取执行对象
-
普通执行SQL对象
Statement createStatement()
入门案例中就是通过该方法获取的执行对象。
-
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
通过这种方式获取的
PreparedStatement
SQL语句执行对象是我们一会重点要进行讲解的,它可以防止SQL注入。 -
执行存储过程的对象
CallableStatement prepareCall(sql)
通过这种方式获取的
CallableStatement
执行对象是用来执行存储过程的,而存储过程在MySQL中不常用。
事务管理
MySQL事务管理的操作:
- 开启事务 : BEGIN; 或者 START TRANSACTION;
- 提交事务 : COMMIT;
- 回滚事务 : ROLLBACK;
MySQL默认是自动提交事务
JDBC事务管理的方法。
Connection接口中定义了3个对应的方法:
-
开启事务
void setAutoCommit(boolean autoCommit);
参与autoCommit 表示是否自动提交事务,true表示自动提交事务,false表示手动提交事务。而开启事务需要将该参数设为为false。
-
提交事务
commit();
-
回滚事务
rollBack();
Statement
概述
Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。
-
执行DDL、DML语句
int executeUpdate(String sql);//传入的DML语句 insert,update,delete
-
执行DQL语句
ResultSet executeQuery(String sql);//传入的sql - DQL语句
该方法涉及到了
ResultSet
对象
ResultSet
概述
ResultSet(结果集对象)作用:
- 封装了SQL查询语句的结果。
而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:
ResultSet executeQuery(sql):执行DQL 语句,返回 ResultSet 对象
那么我们就需要从 ResultSet
对象中获取我们想要的数据。ResultSet
对象提供了操作查询结果数据的方法,如下:
boolean next()
- 将光标从当前位置向前移动一行
- 判断当前行是否为有效行
方法返回值说明:
- true : 有效行,当前行有数据
- false : 无效行,当前行没有数据
xxx getXxx(参数):获取数据
xxx : 数据类型;如: int getInt(参数) ;String getString(参数)
参数
- int类型的参数:列的编号,从1开始
- String类型的参数: 列的名称
Xxx是Java的数据类型 Java的数据类型需要和MySQL数据库中的类型对应 String varchar char int int double double Date date
一开始光标指定于第一行前,指向于表头行。当我们调用了 next()
方法后,光标就下移到第一行数据,并且方法返回true,此时就可以通过 getInt("id")
获取当前行id字段的值。如果想获取下一行的数据,继续调用 next()
方法,以此类推。
//1. 连接数据库
// DataSource 数据源
String driverClassName = "com.mysql.cj.jdbc.Driver";
String url =
String username =
String password =
Class.forName(driverClassName);
Connection conn = DriverManager.getConnection(url , username, password)
try{
//2. 创建 PreparedStatement : 执行SQL语句
PreparedStatement pstmt = conn.createPreparedStatement();
// 3. 执行SQL语句
String sql = "insert into student (?,?,?,?,?)";
// executeUpdate(): DML (insert , update ,delete) + DDL ,返回的是 数据库表中受影响的行数
pstmt.setInt(....)
pstmt.setString(....)
int rows = pstmt.executeUpdate(sql); //
//4. 处理结果
if(rows>0)
sout("添加数据成功")
else
sout("添加数据失败");
}catch(...){
}finally{ //5. 释放资源,节省内存
pstmt.close()
conn.close()
}