JavaSE入门级-第十四课-java持久化API
前言
软件需要持久层,数据需要持久化,java需要持久化的技术,在没有持久化之前我们做的登入是这样的:

解析:上图是一个程序片段,我们能看到用户登入校验用户名和密码,我们是通过字符串的硬性匹配去获得,这是行不通的
我们需要一个数据库访问的接口,它能够帮助我们访问数据库
JDBC基础
JDBC全称是 Java DataBase Connectivity,译为 java数据库连接,是允许在java程序中动态访问数据库的技术,是一组 API
ü API:Application Programming Interface 别人写好的类
l JDBC-API的功能:
- 建立数据库连接
- 发送并执行SQL语句
- 获得SQL执行后的结果
JDBC的固定步骤
JDBC是一组API,使用API有固定步骤,使用示意图如下:

l 使用步骤文字总结
ü 第一步:加载驱动
SUN公司只是提供了一套标准,真正的接口实现交给了不同数据库厂商,所以 在使用JDBC之前必须要加载驱动,才能使用API
ü 第二步:获得连接对象
数据库和研发本机往往不在同一台电脑上,所以我们需要使用网络手段连接到对应的数据库服务器,这个功能由 某个类负责
ü 第三步:发送并执行SQL语句
JDBC的主要目的就是解决持久化问题,在java程序运行的过程中把sql语句发送到数据库,并且拿回执行结果
ü 第四步:获取处理结果
SQL语句执行可以分成两种情况:
- DML语句,新增,修改,删除 这类语句执行结果是 受影响行数
- DQL语句,查询 这类语句的执行结果是一个 视图
ü 第五步:关闭数据库资源
JDBC-API在使用的时候会创建多个对象,这些对象不会被GC扫描,如果不把他手动摧毁,可能就永久的处在活动中,所以需要关闭
连接数据库
加载驱动
l 加载驱动需要使用固定代码

ü 注意:其实驱动只需要加载一次,所以可以尝试使用静态代码段 static{ }
获得连接

java.sql.Connection
JDBC的操作接口类都在 java.sql.* 下导包的时候要额外注意不要选到 mysql下面了
url:表示 数据库所在位置,标准格式,协议://IP:端口/数据库名称?参数=参数值
user:表示 mysql用户名
password:表示 mysql密码
校验是否获取成功

l 注意:需要关闭资源
发送并执行语句
发送语句使用 java.sql.Statement
DML语句
l 包括 新增,修改,删除,查询
使用 Connection 获取语句对象 Statement,写好 SQL语句,String类型

l 使用 executeUpdate 执行

l 返回值是 受影响行数,我们可以使用它来判断语句是否执行成功
l 注意操作完之后需要关闭资源
练习:
l 现在数据库中创建表,在java中使用JDBC连接数据库,DML操作
DQL语句
l 包括 简单查询,复杂查询
使用Connection 获取 Statement对象,写好SQL语句

l 使用executeQuery 执行

ü ResultSet 是结果集对象,是一个虚拟视图对应的数据集合
ü rs.next() 指针往下移动一格,并且判断是否存在元素
ü rs.getXXX 获取指定单元格的数据
l 注意操作完之后需要关闭资源
练习:
l 将数据表中的数据,查询遍历打印出来
java.sql.PreparedStatement
PreparedStatement 是 Statement的子类,意味着拥有父类所有的方法,更强大,它支持预编译语句
l Connection 获得 PreparedStatement 对象,需要 sql语句

ü sql语句中未知的数据可以使用 ? 代替
ü 需要将语句作为参数才能获得预编译语句对象
ü 特别注意:这时语句是一个模版,并且已经发送到数据库
l 后续代码如下:

PreparedStatement 和 Statement的区别
l 首先 PreparedStatement 继承Statement
l 前者为预编译语句,需要 sql语句作为参数,后者直接获取
l 单条sql语句,预编对象需要发送2次,分别是模版部分和数据部分,但是往后的执行只需要发送数据部分
SQL语句注入问题
l PreparedStatement可以防止SQL语句的注入问题

ü 第一次出现SQL语句注入问题,是一次金融犯罪
练习:
ü 模拟sql语句注入问题
处理结果
使用Statement的方法executeUpdate,和executeQuery能够运行DML语句和DQL语句,获得的返回值不同
ü executeUpdate
运行sql语句获得受影响行数,受影响函数指的是sql语句对数据表造成的改动有多少行,我们一般使用它来判断数据库语句是否执行成功
ü executeQuery
运行sql语句获得ResultSet,着是一个和查询视图对应的数据对象集合,我们需要提取数变成java对象
ü 认识ORM思想
ORM 指的是 Object Relation Mapping,译为对象关系映射,其实指的是 java中的数据对象,Object,和数据库中的关系表,Relation,一一对应的现象
对应关系如下:
|
Java中 |
数据库中 |
|
类名 |
表名 |
|
属性名 |
字段名 |
|
对象 |
记录 |
|
对象属性值 |
记录字段值 |
在java中这种和数据库实体能够完全一一对应的类我们称为,实体类(Entity)
关闭资源
jdbc的资源对象是不会被gc扫描的,在使用结束之后需要关闭资源,关闭的顺序必须保持依赖性:ResultSet Statement Connection
实例代码:

事务管理
数据库事务是一组相互依赖的sql语句,其实非常像我们java中的代码块,sql语句一条一条执行,但是有时候多条sql语句是一个整体,这时候可以使用事务,这样能够保证他们的原子性(一个事务中的sql语句要么同时成功要么同时失败)
代码实例:

l 使用 Connection 去管理事务
ü 关闭自动提交事务
conn.setAutoCommit(false);
ü 提交事务,和回滚事务
conn.commit(); // 提交事务
conn.rollback(); // 回滚事务
事务的特性
事务 tansaction 特性有4个特性:
原子性:一个事务不能在拆分,它就是最小执行单位,一起成功一起失败
一致性:一个事务内的操作数据维持总量不变,数据守恒
隔离性:事务之间相互独立,不能访问事务未处理完的数据
持久性:事务一旦提交,永久生效
事务操作语句
事务对于语句操作必须遵循以下规则:
一个事务操作,一组DML语句
一个事务操作,一条DQL语句
一个事务操作,一条DCL语句
(提醒:在研发中我们只考虑DML的事务问题,很少考虑DQL所以说DQL没有事务)
动态SQL语句模版
在大多数业务业务系统中,sql语句模版是不能确定的,可能会根据用户输入的数据决定

我们可以使用Sting拼接语句,或者StringBuilder拼接语句
ü 注意:where 1=1 不是语法错误,是一个编码技巧,保证后续的and连接词正确
JDBC 总结
ü JDBC是java的最基本持久化操作,负责连接数据库,发送语句并执行
ü JDBC操作有固定的步骤,会发生 SQLException 异常
ü JDBC常用API 都属于java.sql.* 包下
l com.mysql.jdbc.Driver
mysql驱动,在使用JDBC时必须加载成功,需要显示try-catch
l DriverManager
驱动管理,依赖它获取Connection连接
l Connection
数据库连接对象,能够获取语句对象,以及控制事务
l Statement
语句对象,发送语句并执行,常用方法 executeUpdate
l PreparedStatement
语句预编译对象,发送语句预编译,再执行,是Statement的子类
l ResultSet
结果集对象,对应查询视图,hasNext(),getString(),getObject(),常用方法
练习:
l 设计实现部门员工系统

浙公网安备 33010602011771号