JDBC核心技术
文章目录
1. 概述
JDBC(Java Database Connectivity)是Java程序连接数据库技术的缩写,主要包括Java提供的接口规范和数据库厂商提供的**驱动程序(.jar包)**两部分
1.1. 核心类/接口
类/接口 | 作用 |
---|---|
Java.sql.DriverManager | 注册驱动程序;获取数据库连接 |
Java.sql.Connection | 获取执行SQL的语句对象 |
Java.sql.Statement | 请求数据库执行SQL语句 |
Java.sql.Result | 存储DQL语句的执行结果 |
2. 基础部分
2.1. 基本步骤
- 注册驱动:导入数据库驱动程序(jar包)并注册
- 获取连接:设置数据库URL、用户、密码并获取连接
- 创建语句:编写SQL语句并创建语句对象
- 执行语句:发送SQL语句并获取返回结果
- 解析结果:解析语句的执行结果
- 销毁资源:销毁结果集、语句和连接对象
2.1.1. 注册驱动
注册驱动是指将Driver类加载到内存中的过程
实现方式
-
方式一:DriverManager注册
DriverManger.registerDriver(new Driver());
-
方式二:反射机制加载类(推荐)
Class.forName(className)
说明
- 注册过程使用的类在不同MySQL版本之间存在差别
- MySQL 8+版本驱动的全类名为
com.mysql.cj.jdbc.Driver
- MySQL 5+版本驱动的全类名为
com.mysql.jdbc.Driver
- MySQL 8+版本驱动的全类名为
2.1.2. 获取连接
调用
java.sql.DriverManager
类的静态方法获取连接
方法 | 说明 |
---|---|
static Connection getConnection(String url) | 使用url创建数据库连接 |
static Connection getConnection(String url, Properties info) | 使用url和info创建数据库连接 |
static Connection getConnection(String url, String user, String password) | 使用url、user和password创建数据库连接 |
URL格式
jdbc:vendor://host:port/db_name?params
-
vendor:数据库类型名
-
host:主机即IP地址或域名,若为本主机可省略
-
port:数据库的端口号,若为默认端口可省略
-
db_name:访问的数据库名
-
params:参数列表,以键值对格式给出(键值对之间使用&隔开)
key value 可选 user 数据库用户名 × password 数据库密码 × serverTimezone 服务器时区 √(8.0.25+) useUnicode 是否使用Unicode编码 √(8.0+) characterEncoding 字符编码格式 √(8.0+) useSSL 是否使用SSL加密 √(8.0+) rewriteBatchedStatements 是否重写批量语句 √
2.1.3. 创建语句
调用Connection对象的实例方法创建语句对象
静态SQL语句
使用步骤
- 编写SQL语句,拼接动态值
- 调用连接的
createStatement()
方法创建语句实例 - 发送SQL语句并获取返回结果
存在问题
- (注入攻击)动态值可能改变语句结构,从而影响查询结果
预编译SQL语句
使用步骤
- 编写SQL语句结构,其中动态值用
?
占位(仅替代值,不能替代关键字和容器名) - 调用连接的
preparedStatement(sql)
方法创建语句实例 - 调用语句的
setXxx(index, value)
方法填充动态值(索引从1开始) - 发送SQL语句并获取返回结果
自增键值回显
- 创建语句实例时,传入第二个参数
Statement.RETURN_GENERATED_KEYS
或1
- 语句执行后,调用实例方法
getGeneratedKeys()
获取生成键的结果集
2.1.4. 执行语句
编写SQL语句,调用语句对象的相关方法发送到数据库并获取语句执行的结果
- 调用语句对象的executeQuery方法
- 执行DQL语句:返回查询结果集(非null)
- 调用语句对象的executeUpdate方法
- 执行DML语句:返回影响的行数
- 执行无返回值的SQL语句:返回0
2.1.5. 解析结果
解析结果主要用于处理DQL语句的执行结果集ResultSet(二维表格),其中
- 每行表示一条记录,包括多个字段
- 记录使用光标指向,默认光标指向第一条记录之前
移动游标
方法 | 说明 |
---|---|
boolean next() | 将光标移到下一条记录并返回是否到达末尾之后 |
获取字段
java.sql.ResultSet
类
方法 | 说明 |
---|---|
ResultSetMetaData getMetaData() | 获取结果集的元数据(列信息) |
xxx getXxx(int columnIndex) | 获取指定列索引的xxx类型字段(索引从1开始) |
xxx getXxx(String columnLabel) | 获取指定列名的xxx类型字段 |
java.sql.ResultMetaData
类
方法 | 说明 |
---|---|
int getColumnCount() | 获取结果集的列数 |
String getColumnName(int column) | 获取指定列的列名 |
String getColumnLabel(int column) | 获取指定列的别名(默认)或列名 |
2.2. 事务处理
事务由连接控制,故事务内的操作需要使用同一个连接处理
- 开启事务:调用连接的
setsetAutoCommit(false)
方法,关闭自动提交 - 提交事务:调用连接的
commit()
方法(正常结束) - 回滚事务:调用连接的
rollback()
方法(发生异常)
2.2.1. 常用结构
try{
... // 开启、处理、提交事务
} catch(ExceptionType e) {
... // 回滚事务与异常处理
} finally {
... // 关闭资源
}
2.3. 批处理
2.3.1. 批量插入
- 创建连接时,添加参数
rewriteBatchedStatements=true
- 编写SQL语句时,使用
VALUES
替代VALUE
且句尾不添加;
- 占位符赋值后,调用预编译语句的
addBatch()
方法添加记录(未执行) - 执行语句时,调用预编译语句的
executeBatch()
方法批量添加
3. 高级部分
3.1. 连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序复用现有的数据库连接,以提高使用率,减少资源浪费,相应的规范定义在
javax.sql.DataSource
接口中
3.1.1. 使用步骤
- 创建并配置连接池
- 获取连接:调用连接池的实例方法
getConnection()
- 执行数据库操作
- 回收连接:调用连接的实例方法
close()
3.1.2. Druid连接池
Druid连接池是阿里提供的第三方数据库连接池,使用时需导入
.jar
包
创建并配置连接池
-
硬编码方式
-
调用构造器创建连接池对象
dataSource
-
设置必须参数(用户名、密码、URL)和非必须参数
-
-
软编码方式(推荐)
- 添加连接池配置文件
.properties
- 读取连接池配置
- 调用工厂方法创建连接池对象
- 添加连接池配置文件
常用配置
字段 | 说明 | 必须 |
---|---|---|
username | 数据库用户名 | √ |
password | 数据库密码 | √ |
url | 数据库的URL | √ |
driverClassName | 数据库驱动全类名,支持根据URL自动识别 | × |
initialSize | 初始连接数量 | × |
maxActive | 最大连接数量 | × |
4. 扩展
4.1. 线程本地变量
线程本地变量用于存储某线程的共享变量,其定义在
java.lang.ThreadLocal
中
常用方法
方法 | 说明 |
---|---|
T get() | 返回当前线程共享变量的值 |
void set(T value) | 设置当前线程共享变量的值 |
void remove() | 删除当前线程共享变量的值 |