【后端开发】05-JDBC核心技术

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. 基本步骤

  1. 注册驱动:导入数据库驱动程序(jar包)并注册
  2. 获取连接:设置数据库URL、用户、密码并获取连接
  3. 创建语句:编写SQL语句并创建语句对象
  4. 执行语句:发送SQL语句并获取返回结果
  5. 解析结果:解析语句的执行结果
  6. 销毁资源:销毁结果集、语句和连接对象
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
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:参数列表,以键值对格式给出(键值对之间使用&隔开)

    keyvalue可选
    user数据库用户名×
    password数据库密码×
    serverTimezone服务器时区√(8.0.25+)
    useUnicode是否使用Unicode编码√(8.0+)
    characterEncoding字符编码格式√(8.0+)
    useSSL是否使用SSL加密√(8.0+)
    rewriteBatchedStatements是否重写批量语句
2.1.3. 创建语句

调用Connection对象的实例方法创建语句对象

静态SQL语句

使用步骤

  1. 编写SQL语句,拼接动态值
  2. 调用连接的createStatement()方法创建语句实例
  3. 发送SQL语句并获取返回结果

存在问题

  • 注入攻击)动态值可能改变语句结构,从而影响查询结果

预编译SQL语句

使用步骤

  1. 编写SQL语句结构,其中动态值用?占位(仅替代值,不能替代关键字和容器名)
  2. 调用连接的preparedStatement(sql)方法创建语句实例
  3. 调用语句的setXxx(index, value)方法填充动态值(索引从1开始)
  4. 发送SQL语句并获取返回结果

自增键值回显

  • 创建语句实例时,传入第二个参数Statement.RETURN_GENERATED_KEYS1
  • 语句执行后,调用实例方法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. 使用步骤
  1. 创建并配置连接池
  2. 获取连接:调用连接池的实例方法getConnection()
  3. 执行数据库操作
  4. 回收连接:调用连接的实例方法close()
3.1.2. Druid连接池

Druid连接池是阿里提供的第三方数据库连接池,使用时需导入.jar

创建并配置连接池

  • 硬编码方式

    1. 调用构造器创建连接池对象

      dataSource
      
    2. 设置必须参数(用户名、密码、URL)和非必须参数

  • 软编码方式(推荐

    1. 添加连接池配置文件.properties
    2. 读取连接池配置
    3. 调用工厂方法创建连接池对象

常用配置

字段说明必须
username数据库用户名
password数据库密码
url数据库的URL
driverClassName数据库驱动全类名,支持根据URL自动识别×
initialSize初始连接数量×
maxActive最大连接数量×

4. 扩展

4.1. 线程本地变量

线程本地变量用于存储某线程的共享变量,其定义在java.lang.ThreadLocal

常用方法

方法说明
T get()返回当前线程共享变量的值
void set(T value)设置当前线程共享变量的值
void remove()删除当前线程共享变量的值

参考资料

  1. 尚硅谷JDBC实战教程(一套掌握jdbc,JDK17+MySQL8)
  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值