JDBC是什么
数据库有很多,如果想通过JAVA访问数据库,那么需要通过JDBC接口,借用厂商提供的数据库JDBC驱动来访问数据库
JDBC驱动其实就是实现了JAVA接口的一组jar包
JDBC执行流程
JDBC API简介
建立数据源连接
- DriverManager 完全由JDBC API实现的驱动管理类
- DataSource 更灵活,由JDBC驱动程序提供
- ConnectionPoolDataSource 支持缓存和复用Connection对象,这样能够在很大程度上提升应用性能和伸缩性。
- XADataSource 该实例返回的Connection对象能够支持分布式事务。
执行SQL语句
调用ResultSet对象的getMetaData()方法获取结果集元数据信息。该方法返回一个ResultSetMetaData对象,我们可以通过ResultSetMetaData对象获取结果集中所有的字段名称、字段数量、字段数据类型等信息
java.sql包

Wrapper
许多JDBC驱动程序提供超越传统JDBC的扩展,为了符合JDBC API规范,驱动厂商可能会在原始类型的基础上进行包装,Wrapper接口为使用JDBC的应用程序提供访问原始类型的功能,从而使用JDBC驱动中一些非标准的特性
- unwrap()方法用于返回未经过包装的JDBC驱动原始类型实例,我们可以通过该实例调用JDBC驱动中提供的非标准的方法
- isWrapperFor()方法用于判断当前实例是否是JDBC驱动中某一类型的包装类型
例如:
1 |
|
javax.sql包
- DataSource接口
无需像DriverManager似的硬编码 - PooledConnection接口
连接复用 - XADataSource、XAResource和XAConnection接口
分布式事务支持 - RowSet接口
RowSet就相当于数据库表数据在应用程序内存中的映射
示例
通过JDBC访问MySql
环境声明:
- mysql数据库地址:10.88.88.2:3306
- mysql版本(
select version()):8.0.26
前期准备
1.新建一个空的maven工程,pom中引入最新的mysql-connector-java
1 | <dependency> |
2.数据库初始化
1 | -- 创建数据库learjdbc: |
3.测试连接
1 | String JDBC_URL = "jdbc:mysql://10.88.88.2:3306/learnjdbc?useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true"; |
4.问题解决
- Public Key Retrieval is not allowed
连接后面添加allowPublicKeyRetrieval=true
MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
- Access denied for user ‘learn‘@’172.17.0.1’ (using password: YES)
密码错了,仔细检查java代码中的密码
JDBC查询
1 | ResultSet resultSet = null; |
这里使用PreparedStatement,这样它会自动帮我们进行’转义’功能,防止SQL注入
JDBC更新
JDBC插入
- 插入时附带主键id
1 | try (Connection conn = DriverManager.getConnection(JDBCConstant.JDBC_URL, JDBCConstant.JDBC_USER, JDBCConstant.JDBC_PASSWORD); |
- 使用数据库自动生成id
1 | try (Connection conn = DriverManager.getConnection(JDBCConstant.JDBC_URL, JDBCConstant.JDBC_USER, JDBCConstant.JDBC_PASSWORD); |
JDBC更新
1 | try (Connection conn = DriverManager.getConnection(JDBCConstant.JDBC_URL, JDBCConstant.JDBC_USER, JDBCConstant.JDBC_PASSWORD); |
JDBC删除
1 | try (Connection conn = DriverManager.getConnection(JDBCConstant.JDBC_URL, JDBCConstant.JDBC_USER, JDBCConstant.JDBC_PASSWORD); |
JDBC事务
1 | PreparedStatement ps = null; |
JDBC Batch
1 | try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (name, gender, grade, score) VALUES (?, ?, ?, ?)")) { |
JDBC 连接池
这里使用HikariCP
1 | <dependency> |
1 | ResultSet resultSet = null; |
参考
1.JDBC编程
2.MyBatis源码解析大合集
3.MyBatis 3源码深度解析/江荣波