学习笔记 - JDBC知识点总结
文章目录
- 第一章 JDBC概述
- 第1节 基本概念
- 掌握编写JDBC程序的基本步骤
- 学习实现数据库连接操作的关键技术
- 掌握编写能够实现数据库操作的应用程序所需的基本技能
- 熟悉使用JDBC所需的各种Java标准库包及其功能特点
- 理解并掌握关键API集合的设计与实现原理
- 掌握数据库连接URL的标准格式表示方法以及相关注意事项
- 学习驱动管理类(DriverManager)的具体应用方法与实践技巧
基于预编译元组集体存取操作实现增删改查功能
-
三、Jdbc数据库事务操作
-
- 3.1 使用到的API
- 3.2 使用步骤
- 3.3 回滚点
- 3.4 自动提交的情况
-
四章 DAO体系
-
4.1 DAO的定义与作用解析
-
4.2 基础Dao类的功能实现
-
4.3 根据不同表定制的Dao与DaoImpl设计
-
第五章 数据存储解决方案
- 第五章小节 数据存储解决方案概述
- 第五章小节中的常见问题分析
- 第五章小节中的主流应用场景与解决方案
- 第五章小节中的深入探讨不同的配置策略与优化方案
- 第五章小节 数据存储解决方案概述
-
六、采用Apache-Query进行增删改查操作流程
- 6.1 Apache-Query概述
- 6.2 使用Apache-Query进行增删改查操作实践
- 6.1 Apache-Query概述
-
七、批量处理机制和Mysql中的Blob字段
-
- 7.1 数据类型转换表
-
- 7.2 向Mysql中注入Blob字段
-
- 7.3 批量插入数据机制
一、JDBC简介
1.1 定义
基于标准SQL语言设计的统一访问与操作公共接口(API),为应用程序提供了通过Java类库访问 databases的能力。JDBC是Java语言中实现 databases访问的标准规范。各 software developers根据各自支持的数据通信 format开发相应的 data connection drivers.这些 data connection drivers通常由 software developers提供.

1.2 编写JDBC程序的步骤
1 加载Java Classpath资源 2 基于JDBC-ODBC桥梁的全Java驱动方法 3 启动并注册数据库驱动 4 建立与数据库的连接 5 生成预设语义参数对象并执行SQL指令 6 释放相关资源
Note: 载荷JDBC驱动需要通过调用Class类的静态方法,并向该方法传递欲加载的JDBC驱动类名;Driver类内部包含一个静态代码块,在该块中完成对JDBC驱动进行注册的动作。
底层代码: java.sql.DriverManager.registerDriver(new Driver());
1.3 编写连接数据库的代码
外部配置文件properties(连接sqlserver数据库)

外部配置文件properties(连接mysql8.0数据库)

连接代码

1.4 使用jdbc过程中会使用到的包
| 包名 | 作用 |
|---|---|
| java.sql | 所有与 JDBC 访问数据库相关的接口和类 |
| javax.sql | 数据库扩展包,提供数据库额外的功能。如:连接池 |
| 数据库驱动 | 由数据库厂商提供,是对 JDBC 接口实现的类 |
1.5 JDBC 的核心 API
| 接口或类 | 作用 |
|---|---|
| DriverManager | 管理和注册数据库驱动、得到数据库连接对象 |
| Connection | 连接对象, 可用于创建Statement和preparedStatement对象 |
| Statement | sql语句对象, 用于将sql语句发送给数据库服务器 |
| PreparedStatement | sql语句对象, 是Statement的子接口 |
| ResultSet | 结果集对象 |
1.6 连接数据库的url格式
连接数据库的 URL 地址格式:协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值
1.7 DriverManager类
| 方法名 | 描述 |
|---|---|
| getConnection(url,user,password) | 通过三个参数获取数据库连接对象conn |
| getConnection(url,info) | 通过外部properties文件的key(user,password)的值和url来获取数据库连接对象conn |
二、使用PreparedStatement实现增删改查操作
2.1 关于PreparedStatement
Statement的子接口, 用来预编译SQL语句, 效率高, 可以防止SQL注入问题
2.2 PreparedStatement和Statement的区别
- PreparedStatements运行得更快。DBServer会对预编 compilation statements提供性能上的优化。因为相同的PreparedStatements可能会被反复使用,在执行这些语句时DBServer会将它们缓存起来。从而避免了重复的编译过程。
- 每次Statement被使用的时候都会被重新解析一次。
- PreparedStatements能够有效防止SQL注入攻击。
2.3 SQL注入问题
是指某些系统没有对用户的输入充分检查, 用户输入部分SQL语句或命令时, 利用非法的SQL语句进行恶意操作的行为。
2.4 PreparedStatement的执行原理

2.5 使用PreparedStatement的步骤
-
建立数据库连接操作。
-
生成SQL语句代码。
-
调用prepareStatement方法并传递sql参数。
-
替换占位符内容。
-
执行生成的SQL语句操作。
-
进行数据库连接建立操作。
-
编制完整的SQL指令代码。
-
调用prepareStatement方法并传递所需sql参数。
-
替换所有的占位符内容。
-
执行生成的完整SQL指令操作。
PreparedStatement的方法
| 方法名 | 作用 |
|---|---|
| excute | 执行SQL语句 |
| excuteQuery | 返回ResultSet结果集对象 |
| excuteUpdate | 返回数据库中受影响的记录数 |
ResultSet的方法
| 方法名 | 作用 |
|---|---|
| next | 往下查询结果, 返回布尔值 |
| getXXX(“id/value”) | 获取结果集中指定值 |
三、Jdbc数据库事务操作
3.1 使用到的API
| Connection接口中与事务有关的方法 | 说明 |
|---|---|
| void setAutoCommit(boolean result) | 设置是否自动提交 |
| void commit() | 提交事务 |
| void rollback() | 回滚事务 |
3.2 使用步骤
- 建立数据库连接
- 将事务自动提交功能禁用
- 获取预设参数集句柄
- 执行SQL语句操作
- 在常规情况下提交当前事务
- 遇到异常时回滚当前未提交的事务
- 最后确保释放所有资源,并恢复自动提交设置
3.3 回滚点
conn.setSavepoint() 设置回滚点
conn.rollback(sp) 返回回滚点
3.4 自动提交的情况
什么时候自动提交?
- 当创建连接对象时,默认情况下会自动生成提交请求(每当执行一次SQL语句且成功后都会触发此操作)。
- 一旦关闭数据库连接,后续的数据操作将直接返回结果集。
- 数据一旦被提交就无法回滚。
四、DAO
4.1 什么是DAO?作用是什么?
Dao: Date Access Object访问数据信息的类和接口, **包括了对数据的CURD(create,update,retrival,delete), 而不包含任何业务相关的信息**, 也称为: BaseDAO
作用: 为了实现功能的模块化, 更有利于代码的维护和升级
4.2 BaseDao代码演示
获取BaseDao的子类继承的父类的泛型

通用的增删改

通用的单/多记录查询


查询特殊值

4.3 针对具体表的Dao和Daoimpl
对于具体的目标表的DAO用于定义该表的一些规范, 实现类则通过DAOImpl来实现CustomerDAO演示界面

CustomerDaoimpl演示

五、数据库连接池
5.1 数据库连接池介绍
传统jdbc连接数据库的弊端:
1. 数据库的连接资源没有得到比较好的重复利用
2. 对于每一次数据库连接, 使用完都要断开
3. 不能控制被创建的连接对象数量
数据库连接池的思想
为数据库连接建立一个“缓冲池”, 预先在缓冲池中放入一定数量的连接, 当需要建立数据库连接时, 只要从池中取出, 使用完毕后再放回来。
数据库连接池允许应用程序重复使用一个现有的数据库连接, 而不是重新建立一个。
5.2 常见的数据库连接池
c3p0、Druid、DBCP
5.3 几种数据库连接池的使用
C3p0数据库连接池
使用方式一

使用方式二: 使用xml配置文件


Druid数据库连接池
使用方式一

使用方式二: 使用配置文件

DBCP数据库连接池
使用方式一

使用方式二: 使用配置文件

六、使用Apache-Query进行增删改查操作
6.1 Apache-Query简介
commons-dbutils是Apache组织提供的一个开源的jdbc工具类类库, 是对jdbc的简单封装
API介绍:
commons.dbutils.QueryRunner
commons.dbutils.ResultSetHandler
commons.dbutils.Dbutils
所需jar包: commons-dbutils
6.2 使用Apache-Query进行增删改查操作演示
增删改演示

查询演示




七、批量处理机制和Mysql中的Blob字段
7.1 数据类型转换表
| SQL类型 | jdbc对应方法 | 返回类型 |
|---|---|---|
| bit(n) | getBoolean() | boolean |
| TINYINT | getByte() | byte |
| SMALLINT | getShort() | short |
| INT | getInt() | int |
| BIGINT | getLong() | long |
| CHAR VARCHAR | getString() | String |
| Text(Clob) Blob | getBlob() / getClob() | Clob Blob |
| DATE | getDate() | java.sql.Date |
| TIME | getTime() | java.sql.Time |
| TIMESTAMP | getTimestamp() | java.sql.Timestamp |
7.2 往Mysql中插入Blob字段
*Mysql中,在MySQL数据库中,Blob是一种二进制大型对象,并且具备存储大量数据的能力。
在MySQL中插入 Blob 类型的数据必须使用预编译语句,并且此类数据无法通过字符串拼接操作进行处理。
- Mysql中的四种blob类型
| 类型 | 大小 |
|---|---|
| TinyBlob | 最大255 |
| Blob | 最大65k |
| MediumBlob | 最大16M |
| LongBlob | 最大4G |
往数据库中插入Blob字段示例

从数据库中读取Blob字段示例

7.3 批量插入数据机制
注意: MySQL服务器默认情况下会禁用批次处理功能。在遇到错误时,请在配置文件url后添加?rewriteBatchedStatements=true这一参数即可启用批次处理功能。
| 方法 | 作用 |
|---|---|
| ps.addBatch | 攒SQL语句,加入Batch |
| ps.excuteBatch | 执行Batch |
| ps.clearBatch | 清空Batch |
示例: 事务和批处理演示


