java学习笔记(二十五) - JDBC
java学习笔记(二十五) - JDBC
执笔JDBC概述
介绍
- 作用:为访问不同的数据库提供了统一的接口
- JDBC API是Java提供一套基于数据库操作的接口API
原理
JDBC程序编写步骤
注册驱动
- 加载Driver类
1 | /* |
获取连接
- 得到Connection
1 | //2. 得到连接 |
执行DML语句(增删改查)
- 发送sql语句给mysql执行
1 | //3. 执行sql |
释放资源
- 关闭相关连接
1 | //4. 关闭连接资源 |
连接数据库的方式
获取Driver实现类对象
1 | // 方式1获取Driver实现类对象 |
通过反射
1 | // 方式2 -- 通过反射 |
使用DriverManager 替代Driver
1 | //方式3 使用DriverManager 替代Driver 进行统一管理 |
使用Class.forName 自动完成注册驱动
- 推荐使用
- mysql驱动5.1.6可以无需Class.forName(“com.mysql.jdbc.Driver”);
- 从jdk1.5以后使用了jdbc4,不再需要显示调用class.forName(),注册驱动而是自动调用驱动jar包下的META-INTF\services\java.sql.Driver文本中的类名去注册
1 | //方式4 使用Class.forName 自动完成注册驱动 简化代码 |
class.froName 和 配置文件
1 | //方式5 ,在方式4的基础改进 增加配置文件,让mysql更加灵活 |
resultSet结果集
表示数据库结果集的数据表
ResultSet对象保持一个光标指向其当前的数据行。最开始光标位于第一行之前
next方法将光标移动到下一行,ResultSet对象中没有更多行时返回false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40public class ResultSet_ {
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
//获取配置文件中的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
//1. 加载Driver驱动
Class.forName(driver);
//2. 获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3. 得到Statement
Statement statement = connection.createStatement();
//4. sql语句
String sql = "select * from actor";
ResultSet resultSet = statement.executeQuery(sql);
//5. while 取出数据
while(resultSet.next()) { //光标向后移动,没有更多行就返回 false
int id = resultSet.getInt(1);//获取该列第1行
String name = resultSet.getString(2);//获取该列第2行
String sex = resultSet.getString(3);
Date date = resultSet.getDate(4);
String phone = resultSet.getString(5);
System.out.println(id + "\t" + name + "\t" + sex + "\t" + date + "\t" + phone );
}
//6. 关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
sql注入
- Statement对象用于执行静态SQL语句并返回其生成的结果的对象
- 在连接建立后,需要对数据库进行访问,执行命名或是SQL语句可以通过 Statement[存在SQL注入]、PreparedStatement[预处理]、CallableStatement [存储过程]
- Statement对象执行SQL语句,存在SQL注入风险
- SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库
- 要防范SQL注入,只要用PreparedStatement(从Statement扩展而来)取代 Statement就可以了
1 | public class Statement_ { |
PreparedStatement 预处理
- PreparedStatement 执行的SQL语句中的参数用问号?)来表示,调用PreparedStatement对象的setXxx()方法来设置这些参数. setXxx()方法有两个参数,第一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值
- 调用executeQuery(),返回ResultSet 对象
- 调用executeUpdate():执行更新,包括增、删、修改
executeQuery() 执行查询操作
1 | public class PreparedStatement_ { |
executeUpdate() 执行DML操作
1 | public class PreparedStatementDML { |
JDBC API
事务
- JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务,每执行一个SQL语句,如果执行成功,就会像数据库自动提交,而且不能回滚
- JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务
- 调用Connection的setAutoCommit(false) 可以取消自动提交事务
- 在所有的SQL语句都执行成功后,调用Connection的commit()方法提交事务
- 在其中某个操作失败或者异常时,调用Connection的rollBack()方法回滚事务
1 | public class Transaction_ { |
批处理
- 当需要成批插入或者更新记录时,可以采用Java的批量更新机制
- 如果要使用批处理功能,JDBC连接Mysql时,需要在url中添加参数?rewriteBatchedStatements=true
1 | url=jdbc:mysql://localhost:3306/study?rewriteBatchedStatements=true |
- 批处理通常和PreparedStatement一起搭配使用,可以减少编译次数,减少运行次数,提高效率
1 | //批处理方法 |
1 | public class Batch_ { |
数据库连接池
概念
JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource是一个接口,通常由第三方实现
预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕后在放回去
- 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是从新建立一个
- 当应用程序相连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列
分类
C3P0
- 速度相对较慢,稳定性不错(hiberbate、spring)
1 | public class C3P0_ { |
配置文件
1 | <c3p0-config> |
DBCP
- 速度相对C3P0较快,但不稳定
Proxool
- 有监控连接池状态的功能,稳定性相对c3p0差一点
BoneCP
- 速度快
Druid(德鲁伊)
- 是阿里提供的数据库连接池,集DBCP、C3P0、Proxool优点于一身的数据库连接池(推荐使用)
1 | public class Druid_ { |
JDBCUtilsByDruid
1 | public class JDBCUtilsByDruid { |
Apache-DButils工具类
- commons-dbutils是 Apache组织提供的一个开源JDBC工具类库,它是对JDBC的封装,使用dbutils能极大简化jdbc编码的工作量。
DbUtils类
- QueryRunner类:该类封装了SQL的执行,是线程安全的。可以实现增、删、改、查、批处理
- 使用QueryRunner类实现查询
- ResultSetHandler接口:该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式
1 | ArrayHandler//把结果集中的第一行数据转成对象数组。 |
1 | public class DBUtils_USE { |
表和JavaBean的类型映射关系
JavaBean又称domain、pojo
DAO
- DAO:data access object数据访问对象
BasicDAO
- 这样的通用类,称为 BasicDao,是专门和数据库交互的,即完成对数据库(表)的crud操作。
- 在BaiscDao的基础上,实现一张表对应一个Dao,更好的完成功能,比如 Customer表-Customer.java类(javabean)-CustomerDao.java
案例
domain
1 | /** |
DAO
BasicDAO
1 | /** |
ActorDAO
1 | /** |
TestDAO
1 | public class TestDAO { |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果