初谈JDBC
引言
jdbc java语言操作数据库的技术
简介
jdbc 一套java访问数据库的接口 ,通过访问接口 ,可以访问任何数据库

常用的API
常见的接口
java.sql.Connection 数据库连接 ,只有获得Connection对象,才能连上数据库
java.sql.PrepareStatement 发送SQL语句的工具 具备发送SQL的功能(方法)
java.sql.Resultset 结果集 接受数据库执行查询SQL的返回结果
java.sql.Driver 驱动类 不同的数据库会自动提供具体的实现接口
java.sql.DriverManager 管理多个驱动
编程思想
创建一个表 ,在数据库中 通过java代码向数据库表中添加数据

JDBC访问数据库的步骤
1 加载驱动 【.....不同数据库驱动不一样】
2 建立连接 【获取数据库连接 Connection】
3 创建SQL发送的工具 【PrepareStatement 发送SQL的工具】
4预加载SQL语句 【 将准备的SQL语句发送 不是在代码中执行 是在数据库中执行】
5 处理结果集 【在发送select语句 会有结果返回 ResultSet】
6 释放资源 【反向关闭 ResultSet PrepareStatement Connection 】
实际案例
需求 向t_person 表中添加一条数据
![]()
思路


以Oracle数据库为例
ResultSet 结果集 存放查询结果
获取结果集的方法
-
next() 移动resultSet的游标,下移一位, 并且通过返回值确定当前行是否有数据.
-
getXxxx("查询结果列名")---获得rs游标指向的当前行, 列名对应的数据.
-
getXxxx(列序号)---获得rs游标指向的当前行,列序号对应的数据


解析驱动加载
// 管理驱动
public class DriverManager{
//存放多个driver对象.
private static List<Driver> drivers = new CopyOnWriteArrayList<>();
//真正的注册驱动的代码.
public static void registDriver(Driver driver){
drivers.add(driver);
}
public static Connection getConnection(String url,String user,String password){
//...
}
}
驱动加载
// 表面书写: Class.forName("oracle.jdbc.OracleDriver")
// 如何实现驱动加载?
public class OracleDriver implements Driver{
//加载驱动
static{
//创建驱动
Driver driver = new oracle.jdbc.OracleDriver();
//添加驱动对象, 注册驱动, 加载驱动
DriverManager.registDriver(driver);
}
}
动态参数
方式一 SQL字符串拼接
将变量中的值 通过字符串拼接 绑定在SQL语句中
优点 可以动态的绑定非数据的部分 应用场景 排序方式的动态拼接
缺点 SQL注入
方式二 pstm 动态参数
优点 防止SQL注入
缺点 只能动态绑定数据/值得部分
不能动态绑定 SQL的关键词 ,列名
步骤
-
创建SQL允许将值,用? 站位:
delete from t_person where name = ??在sql只能表示值 数据
pstm = conn.prepareStatement("delete from t_person where name = ?");
// insert into t_person values(?,?,?,?,?); -
绑定参数
对?站位的值,进行替换,绑定.
pstm.setXxxx(?的序号从1开始,要绑定的具体值);// 将数据绑定在指定的?位置.
pstm.setInt(); //绑定整数类型的值
pstm.setString() //绑定字符串的值
pstm.setDouble();// 绑定double的值
pstm.setDate();//绑定日期. -
发送sql(执行)
pstm.executeUpdate();//执行增删改
pstm.executeQuery();//执行查询.

实例代码

开发应用
如果SQL语句要拼接数据 ,使用pstm的?占位符
如果SQL语句要拼接非数据 ,使用字符串拼接
pstm预编辑原理
SQL语句的执行过程

pstm预编译的执行原理

批更新(BatchUpdate)【重要】
核心 PreparedStatement
-
将绑定的参数,缓存在java本地.
pstm.addBatch() -
将缓存在java本地的多组参数,一次性发送给Oracle.
pstm.executeBatch()
实现思路

实例代码

编码优化
思路 将通用代码封装到一个函数内部 需要的时候调用
作用 简化代码开发 提高代码的可维护性
版本1 
版本2
在代码中写死连接值 不方便后续维护 采用配置文件
前置小知识
properties的配置文件
1 ****.properties结尾
2 格式内容 name=value
Properties对象
map集合 key 和 value 都是string
作用 加载properties配置文件中的内容 到Properties对象内部
1. load(输入流);//根据文件输入流给定的文件,加载信息到Properties对象中.
2. getProperty("key");//根据key 获得value
问题 上面的JDBCUtil中 存在以后需要修改的字符串常量配置 (数据库连接相关的)
解决思路 将常量配置转义配置到配置文件中 提高可维护性

获取类加载的输入流 类名.class.getReasourceAsStream(“文件的相对路径”)
作用 :读取配置文件
最终版
加载配置文件的操作只需要操作一次即可 所以放在静态代码块中



项目实战设计模型
ORM 面向对象思想 将数据库中的一行数据映射成一个java对象 封装数据库数据

标准实例代码
表

实体类

作用 将数据库中的数据封装成java对象 便于管理

DAO模型设计
职责 封装数据库访问的所有数据

JDBC控制事务
核心思想:
-
一个功能对应service的一个方法
-
service一个方法就是不可分割的执行单元
-
service每个方法的代码都要放在事务控制之内.
Connection事务相关方法:
setAutoCommit(false)--开启事务 将事务控制设置为手动提交.
commit()--提交事务
rollback()--回滚事务
事务控制问题
service 和 dao 使用的不是同一个连接
解决1 将service的conn通过传递参数的方法传递给dao
注意 dao接受到service的conn ,dao不能关 service 最后关
缺点 所有的dao都需要添加Connection参数 代码污染
解决2 使用线程池 都从线程池中取连接
时间问题 草草收尾 以后有时间再补。。。。。


浙公网安备 33010602011771号