1. JDBC 概述
① JDBC 为访问不同的数据库提供了统一的接口,
为使用者屏蔽了细节问题
② Java 程序员使用 JDBC,可以连接任何提供了
JDBC 驱动程序的数据库系统,从而完成对数据库
的各种操作
③ JDBC 是 Java 提供一套用于数据库操作的接口 API,
Java 程序员只需要面向这套接口编程即可,不同的
数据库厂商,需要针对这套接口,提供不同实现
2. JDBC 程序编写步骤
① 注册驱动 - 加载 Driver 类
Driver driver = new Driver();
② 获取连接 - 得到 Connection
String url = "jdbc:mysql://localhost:3306/db02";
// jdbc:mysql:// 规定好表示协议,
// 通过 jdbc 的方式连接 mysql
// localhost 主机,可以是 ip 地址
// 3306 表示 mysql 监听的端口
// db02 连接到 mysql dbms 的哪个数据库
// mysql 的连接本质就是 socket 连接
Properties properties = new Properties();
// 将用户名和密码放入到 Properties 对象
properties.setProperty("user", "root");
properties.setProperty("password", "123");
// user 和 password 后面的值可更改
Connection connection =
driver.connection(url, properties);
③ 执行增删改查 - 发送 SQL 给 mysql 执行
String sql = "insert into actor values(null,
'杨超越', '女', '2002-10-06', '13512531251')";
// Statement 用于执行静态SQL语句并返回// 其生成的结果的对象
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql);// 如果是 dml 语句,返回的就是影响行数
System.out.println(rows > 0 ? "成功" : "失败");④ 释放资源 - 关闭相关连接
statement.close();
connect.close();
(2) 数据库连接 5 种方式·
(3) ResultSet 底层
① 表示数据库结果集,通常通过执行查询
数据库的语句生成
② ResultSet 对象保持一个光标指向其当前
的数据行。最初,光标位于第一行之前
③ next 方法将光标移动到下一行,并且由
于在 ResultSet 对象中没有更多行时返回
false,因此可以在 while 循环中使用循环
来遍历结果集
(4) Statement
① Statement 对象,用于执行静态SQL语句
并返回其生成的结果的对象
② 在连接建立后,需要对数据库进行访问,
执行 命名或是SQL语句,可以通过
Statement [存在SQL注入]
PreparedStatement [预处理]
CallableStatement [预处理]
③ Statement 对象执行SQL语句,存在SQL注入风险
④ SQL注入是利用某些系统没有对用户输入的数据进
行充分的检查,而在用户输入数据中注入非法的
SQL语句段或命令,恶意攻击数据库
⑤ 要防范SQL注入,只要用 PreparedStatement (从
Statement 扩展而来) 取代 Statement 就可以了
2) PreparedStatement (预处理)
① PreparedStatement 执行的SQL语句中的参数
用问号(?)来表示,调用 PreparedStatement 对
象的 setXxx() 方法来设置这些参数.setXxx() 方
法有两个参数,第一个参数是要设置的 SQL 语
句中的参数的索引(从 1 开始),第二个是设置的
SQL 语句中的参数的值
② 调用 executeQuery(),返回 ResultSet 对象
③ 调用 executeUpdate(),执行更新,包括增、
删、修改
预处理的好处
① 不再使用+ 拼接sql语句,减少语法错误
② 有效的解决了sql注入问题
③ 大大减少了编译次数,效率较高
3. JDBC API
JDBC API 是一系列的接口,它统一和规范了应用程序与数据库
的连接、执行 SQL 语句,并得到返回结果等各类操作,相关类
和接口在 java.sql 与 javax.sql 包中
JDBC 的相关API小结
① DriverManager 驱动管理类
getConnection(url, user, pwd):获取连接
② Connection 接口
createStatement():生成命令对象
prepareStatement(sql):生成预编译命令对象
③ Statement 接口
executeUpdate(sql):执行dml语句,返回影响的行数
executeQuery(sql):执行查询,返回 ResultSet 对象
execute(sql):执行任意的sql,返回布尔值
④ PreparedStatement 接口
executeUpdate(sql):执行dml语句,返回影响的行数
executeQuery(sql):执行查询,返回 ResultSet 对象
execute(sql):执行任意的sql,返回布尔值
setXxx(占位符索引,占位符的值):解决SQL注入
setObject(占位符索引,占位符的值)
⑤ Result(结果集)
next():向下移动一行,同时如果没有下一行,返回false
previous():向上移动一行
getXxx(列的索引 | 列名):返回对应列的值,接收类型
是Xxx
getObject(列的索引 | 列名):返回对应列的值,接收类型
为Object
4. JDBCUtils
(1) 封装JDBCUtils工具类
(2) 使用工具类JDBCUtils
5. 事务
① JDBC程序中当一个 Connection对象创建时,
默认情况下是自动提交事务:每次执行一个
SQL语句时,如果执行成功,就会向数据库
自动提交,而不能回滚
② JDBC程序中为了让多个 SQL语句作为一个
整体执行,需要使用事务
③ 调用 Connection的 setAutoCommit(false)
可以取消自动提交事务
④ 在所有的 SQL语句都成功执行后,调用
commit();方法提交事务
⑤ 在其中某个操作失败或出现异常时,调用
rollback();方法回滚事务
6. 批处理
① 当需要成批插入或者更新记录时,可以采用
Java的批量更新机制,这一机制允许多条语
句一次性提交给数据库批量处理。
通常情况下比单独提交处理更有效率
② JDBC的批量处理语句包括下面方法:
addBatch():添加需要批量处理的SQL语句
或参数
executeBatch():执行批量处理语句
clearBatch():清空批处理包的语句
③ JDBC连接MySQL时,如果要使用批处理功
能,请在url中加参数
?rewriteBatchedStatements=true
④ 批处理往往和 PreparedStatement 一起搭配
使用,可以既减少编译次数,又减少运行次
数,效率大大提高
7. 连接池
(1) 传统获取Connection问题分析
① 传统的JDBC数据库连接使用 DriverManager
来获取,每次向数据库建立连接的时候都要将
Connection 加载到内存中,再验证IP地址,
用户名和密码(0.05s~1s时间)。
需要数据库连接的时候,就向数据库要求一个,
频繁的进行数据库连接操作将占用很多的系统
资源,容易造成服务器崩溃
② 每一次数据库连接,使用完后都得断开,如果
程序出现异常而未能关闭,将导致数据库内存
泄漏,最终将导致重启数据库
③ 传统获取连接的方式,不能控制创建的连接数
量,如连接过多,也可能导致内存泄漏,MySQ
L崩溃
④ 解决传统开发中的数据库连接问题,可以采用
数据库连接池技术 (connection pool)
(2) 数据库连接池基本介绍
① 预先在缓冲池中放入一定数量的连接,
当需要建立数据库连接时,只需从 "缓
冲池" 中取出一个,使用完毕之后再放
回去
② 数据库连接池负责分配、管理和释放
数据库连接,它允许应用程序重复使用
一个现有的数据库连接,而不是重新建
立一个
③ 当应用程序向连接池请求的连接数超
过最大连接数量时,这些请求将被加入
到等待队列中
(3) 数据库连接池种类
① JDBC 的数据库连接池使用 javax.sql.Da
taSource 来表示,DataSource 只是一个
接口,该接口通常由第三方提供实现
[提供 .jar]
② C3P0 数据库连接池,速度相对较慢,稳
定性不错 (hibernate,spring)
③ DBCP 数据库连接池,速度相对 c3p0 较
快,但不稳定
④ Proxool 数据库连接池,有监控连接池状
态的功能,稳定性较 c3p0 差一点
⑤ BoneCP 数据库连接池,速度快
⑥ Druid(德鲁伊) 是阿里提供的数据库连接池,
集 DBCP、C3P0、Proxool 优点于一身的数
据库连接池
1) C3P0 连接池
2) Druid(德鲁伊) 连接池
2) 基于 druid 数据库连接池的工具类
8. Apache-DBUtils
(1) 返回 resultSet 问题
① 关闭 connection 后,resultSet 结果集无法使用
② resultSet 不利于数据的管理 [只能用一次]
③ 使用返回信息也不方便
(2) Apache-DBUtils
commonds-dbutils 是 Apache 组织提
供的一个开源JDBC工具类库,它是对
JDBC的封装,使用 dbutils 能极大简化
jdbc 编码的工作量
2) DbUtils 类
① QueryRunner 类:该类封装了SQL的执行,
是线程安全的,可以实现增、删、改、查、
批处理
② 使用 QueryRunner 类实现查询
③ ResultSetHandler 接口:该接口用于处理
java.sql.ResultSet,将数据按要求转换为另
一种形式
ArrayHandler:把结果集中的第一行数据转成
对象数组
ArrayListHandler:把结果集中的每一行数据都
转成一个数组,再存放到List中
BeanHandler:将结果集中的第一行数据封装到
一个对应的JavaBean实例中
BeanListHandler:将结果集中的每一行数据都
封装到一个对应的JavaBean
实例中,存放到List里
ColumnListHandler:将结果集中的某一列的数据
存放到List中
KeyedHandler(name):将结果集中的每行数据都
封装到Map里,再把这些
map再存放到一个map里,
其key为指定的key
MapHandler:将结果集中的第一行数据封装到一
个Map里,key是列名,values就是
对应的值
MapListHandler:将结果集中的每一行数据都封装
到一个Map里,然后再存放到List
9. DAO 增删改查-BasicDao
apache-abutils+Druid 简化了JDBC开发,
但还有不足:
① SQL语句是固定的,不能通过参数传入,
通用性不好,需要进行改进,更方便执行
增删改查
② 对于 select 操作,如果有返回值,返回
类型不能固定,需要使用泛型
③ 将来的表很多,业务需求复杂,不可能
只靠一个Java类完成
④ 引出=》BasicDAO
(2) BasicDAO 基本说明
① DAO:data access object 数据访问对象
② 这样的通用类,称为 BasicDAO,是专门
和数据库交互的,即完成对数据库(表)的
crud 操作
③ 在BasicDAO的基础上,实现一张表对应一
个DAO,更好的完成功能,比如 Customer
表-Customer.java 类(javabean)-CustomerD
ao.java
com.hhh.dao_.utils //工具类
com.hhh.dao_.domain //javabean
com.hhh.dao_.dao //存放XxxDAO 和 BasicDAO
com.hhh.dao_.test //写测试类