JavaSE入门级-第十四课-java持久化API

 

前言

软件需要持久层,数据需要持久化,java需要持久化的技术,在没有持久化之前我们做的登入是这样的:

 

 

 

  解析:上图是一个程序片段,我们能看到用户登入校验用户名和密码,我们是通过字符串的硬性匹配去获得,这是行不通的

  我们需要一个数据库访问的接口,它能够帮助我们访问数据库

 

JDBC基础

JDBC全称是 Java DataBase Connectivity,译为 java数据库连接,是允许在java程序中动态访问数据库的技术,是一组 API

ü  API:Application Programming Interface 别人写好的类

 

JDBC-API的功能:

  1. 建立数据库连接
  2. 发送并执行SQL语句
  3. 获得SQL执行后的结果

 

JDBC的固定步骤

  JDBC是一组API,使用API有固定步骤,使用示意图如下:

 

 

 

 

 

使用步骤文字总结

ü  第一步:加载驱动

SUN公司只是提供了一套标准,真正的接口实现交给了不同数据库厂商,所以 在使用JDBC之前必须要加载驱动,才能使用API

 

ü  第二步:获得连接对象

数据库和研发本机往往不在同一台电脑上,所以我们需要使用网络手段连接到对应的数据库服务器,这个功能由 某个类负责

 

ü  第三步:发送并执行SQL语句

JDBC的主要目的就是解决持久化问题,在java程序运行的过程中把sql语句发送到数据库,并且拿回执行结果

 

ü  第四步:获取处理结果

SQL语句执行可以分成两种情况:

  1. DML语句,新增,修改,删除 这类语句执行结果是 受影响行数
  2. DQL语句,查询 这类语句的执行结果是一个 视图

 

ü  第五步:关闭数据库资源

JDBC-API在使用的时候会创建多个对象,这些对象不会被GC扫描,如果不把他手动摧毁,可能就永久的处在活动中,所以需要关闭

 

连接数据库

加载驱动

l  加载驱动需要使用固定代码

 

 

 

 

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

获得连接

 

 

 

 

 

java.sql.Connection

JDBC的操作接口类都在 java.sql.* 下导包的时候要额外注意不要选到 mysql下面了

url:表示 数据库所在位置,标准格式,协议://IP:端口/数据库名称?参数=参数值

user:表示 mysql用户名

password:表示 mysql密码

 

校验是否获取成功

 

 

 

 

注意:需要关闭资源

 

发送并执行语句

发送语句使用 java.sql.Statement

DML语句

包括 新增,修改,删除,查询

使用 Connection 获取语句对象 Statement,写好 SQL语句,String类型

 

 

 

 

 

使用 executeUpdate 执行

 

 

 

 

l  返回值是 受影响行数,我们可以使用它来判断语句是否执行成功

注意操作完之后需要关闭资源

 

练习:

l  现在数据库中创建表,在java中使用JDBC连接数据库,DML操作

 

DQL语句

包括 简单查询,复杂查询

使用Connection 获取 Statement对象,写好SQL语句

 

 

 

 

 

使用executeQuery 执行

 

 

 

 

ü  ResultSet 是结果集对象,是一个虚拟视图对应的数据集合

ü  rs.next() 指针往下移动一格,并且判断是否存在元素

ü  rs.getXXX 获取指定单元格的数据

注意操作完之后需要关闭资源

 

练习:

l  将数据表中的数据,查询遍历打印出来

 

 

java.sql.PreparedStatement

PreparedStatement 是 Statement的子类,意味着拥有父类所有的方法,更强大,它支持预编译语句

Connection 获得 PreparedStatement 对象,需要 sql语句

 

 

 

 

ü  sql语句中未知的数据可以使用 ? 代替

ü  需要将语句作为参数才能获得预编译语句对象

ü  特别注意:这时语句是一个模版,并且已经发送到数据库

l  后续代码如下:

 

 

 

 

PreparedStatement 和 Statement的区别

l  首先 PreparedStatement 继承Statement

l  前者为预编译语句,需要 sql语句作为参数,后者直接获取

l  单条sql语句,预编对象需要发送2次,分别是模版部分和数据部分,但是往后的执行只需要发送数据部分

 

SQL语句注入问题

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语句要么同时成功要么同时失败)

  代码实例:

 

 

 

使用 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  设计实现部门员工系统

 

posted @ 2021-07-22 08:41  二娃千里眼  阅读(122)  评论(0)    收藏  举报