目录
1、事务
1.1 概述
数据库的事务(
Transaction
)是一种机制、一个操作序列,包含了
一组数据库操作命令
。
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令
要么同时成功,要么同时失败
。
事务是一个不可分割的工作逻辑单元。
1.2 语法
开启事务
START TRANSACTION ;或者BEGIN ;
提交事务
commit ;
回滚事务
rollback ;
1.3 代码验证
环境准备
DROP TABLE IF EXISTS account;
-- 创建账户表
CREATE TABLE account(
id int PRIMARY KEY auto_increment,
name varchar(10),
money double(10,2)
);
-- 添加数据
INSERT INTO account(name,money) values('张三',1000),('李四',1000);
不加事务演示问题
-- 转账操作
-- 1. 查询李四账户金额是否大于500
-- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = '李四';
出现异常了... -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = '张三';
整体执行结果肯定会出问题,我们查询账户表中数据,发现李四账户少了
500
。
添加事务sql如下:
-- 开启事务
BEGIN;
-- 转账操作
-- 1. 查询李四账户金额是否大于500
-- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = '李四';
出现异常了... -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = '张三';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
上面
sql
中的执行成功进选择执行提交事务,而出现问题则执行回滚事务的语句。以后我们肯定不可能这样操作,而是在
java
中进行操作,在
java
中可以抓取异常,没出现异常提交事务,出现异常回滚事务。
1.4 事务的四大特征
原子性(
Atomicity
)
:
事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(
Consistency
)
:
事务完成时,必须使所有的数据都保持一致状态
隔离性(
Isolation
)
:
多个事务之间,操作的可见性
持久性(
Durability
)
:
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
说明:
mysql
中事务是自动提交的。
也就是说我们不添加事务执行
sql
语句,语句执行完毕会自动的提交事务。
可以通过下面语句查询默认提交方式:
SELECT @@autocommit ;
查询到的结果是1 则表示自动提交,结果是0表示手动提交。当然也可以通过下面语句修改提交方式
set @@autocommit = 0;
2、JDBC概述
2.1 JDBC概念
JDBC
就是使用
Java
语言操作关系型数据库的一套
API ,全称:( Java DataBase Connectivity ) Java
数据库连接
2.2 JDBC本质
官方(
sun
公司)定义的一套操作所有关系型数据库的规则,即接口。
各个数据库厂商去实现这套接口,提供数据库驱动
jar
包。
我们可以使用这套接口(
JDBC
)编程,真正执行的代码是驱动jar包中的实现类。
2.3 JDBC好处
各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发。
可随时替换底层数据库,访问数据库的
Java
代码基本不变。
3、JDBC快速入门
第一步:编写Java代码。
第二步:Java代码将SQL发送到MySQL服务端。
第三步:
MySQL
服务端接收到
SQL
语句并执行该
SQL
语句。
第四步:将
SQL
语句执行的结果返回给
Java
代码。
4、JDBC API详解
4.1 DriverManager
DriverManager(驱动管理类)作用:
注册驱动
==提示:==
MySQL 5之后的驱动包,可以省略注册驱动的步骤
自动加载
jar
包中
META-INF/services/java.sql.Driver
文件中的驱动类
获取数据库连接
url : 连接路径
语法:
jdbc:mysql://ip
地址
(
域名
):
端口号
/
数据库名称
?
参数键值对1&
参数键值对
2…
示例:
jdbc:mysql://127.0.0.1:3306/db1
==
细节:
==
如果连接的是本机
mysql
服务器,并且
mysql
服务默认端口是3306
,则
url
可以简写为:
jdbc:mysql:///
数 据库名称?
参数键值对
配置
useSSL=false
参数,禁用安全连接方式,解决警告提示
user
:用户名
poassword
:密码
4.2 Connection
Connection(数据库连接对象)作用:
获取执行 SQL 的对象
管理事务
4.2.1
获取执行对象
普通执行
SQL
对象
Statement createStatement()
入门案例中就是通过该方法获取的执行对象。
预编译
SQL
的执行
SQL
对象:防止
SQL
注入
PreparedStatement prepareStatement(sql)
通过这种方式获取的
PreparedStatement
SQL
语句执行对象是我们一会重点要进行讲解的,它可以防止SQL
注入。
执行存储过程的对象
CallableStatement prepareCall(sql)
通过这种方式获取的
CallableStatement
执行对象是用来执行存储过程的,而存储过程在MySQL
中不常用,所以这个我们将不进行讲解。
4.2.2
事务管理
先回顾一下
MySQL
事务管理的操作:
开启事务 :
BEGIN;
或者
START TRANSACTION;
提交事务 :
COMMIT;
回滚事务 :
ROLLBACK;
MySQL
默认是自动提交事务
开启事务
参与
autoCommit
表示是否自动提交事务,
true
表示自动提交事务,false
表示手动提交事务。而开启事务需要将该参数设为为
false
。
提交事务
回滚事务
4.3 Statement
Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。
4.4 ResultSet
ResultSet(结果集对象)作用:==封装了SQL查询语句的结果。
4.5 PreparedStatement
PreparedStatement作用:预编译SQL语句并执行:预防SQL注入问题 。
5,数据库连接池
5.1 数据库连接池简介
数据库连接池是个容器,负责分配、管理数据库连接 (Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处
资源重用
提升系统响应速度
避免数据库连接遗漏
5.2 数据库连接池实现
标准接口:
==DataSource==
官方
(SUN)
提供的数据库连接池标准接口,由第三方组织实现此接口。该接口提供了获取连接的功能:
Connection getConnection ()
那么以后就不需要通过
DriverManager
对象获取
Connection对象,而是通过连接池(DataSource
)获取
Connection
对象。
常见的数据库连接池
DBCP
C3P0
Druid
我们现在使用更多的是
Druid
,它的性能比其他两个会好一些。
Druid
(德鲁伊)
Druid
连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是
Java
语言最好的数据库连接池之一
5.3 Driud使用
导入jar包 druid-1.1.12.jar
定义配置文件
加载配置文件
获取数据库连接池对象
获取连接