连字符 & --》 &;
主方法才try...catch,子方法只需throws
主方法中调用多个方法,这些子方法,通过throws 异常来处理,可以保证主方法调用时,出现异常,后续程序不会继续运行
主方法中统一try...catch
1.什么叫数据库事务?
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
> 一组逻辑操作单元:一个或多个DML操作。需要保证这多个DML操作作为一个整体,有异常就回溯
2.事务处理的原则:
保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。 当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存 下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
3.数据一旦提交,就不可回滚
4.哪些操作会导致数据的自动提交?
>DDL操作一旦执行,都会自动提交。
>set autocommit = false 对DDL操作失效
>DML默认情况下,一旦执行,就会自动提交。
>我们可以通过set autocommit = false的方式取消DML操作的自动提交。
>默认在关闭连接时,会自动的提交数据
1. 每个DML操作不关闭连接conn
2. 每个DML操作前,取消自动提交,操作后,手动提交;中间有异常就在catch中conn.rollback回溯
针对每个操作默认关闭连接,导致无法回滚-----------操作不关闭连接conn
update2.0()
testupdate2.0()
针对DML操作本身就会自动提交-------取消自动提交
关闭自动提交,事务操作完成后,如果conn连接还没有关闭,需要恢复conn的自动提交功能setAutoCommit(true)
在两次事务操作间,如果出现异常导致操作失败,需要回溯到异常前------在catch中执行回滚
脏读:T1读取T2临时修改未提交的数据,T2回滚,数据消失,T1数据也消失,变成现在T2的数据
不可重复读: T1读取数据,T2更新该数据,T1再次读取,数据改变
幻读: T1读取数据,T2插入新数据,T1再次读取,数据多出
级别:
READ UNCOMMITTED (读取未提交的) (都避免不了,临时的读的到、修改的读的到、新添加的读的到)
READ COMMITED (读取已提交的) (可以避免脏读,临时的读不到,修改的读的到,新添加的读的到)
REPEATABLE READ(可重复读) (可以避免脏读重复读,临时的读不到,修改的读不到,新添加的读的到)各自管理临时表
SERIALIZABLE(串行化) (全都避免,临时的读不到,修改的读不到,新添加的读不到)
read uncommitted
reas commited
repeatable read
serializable
mysql默认为 可重复读 REPEATABLE READ
mysql8 更名为 select @@transaction_isolation;
Java代码实现数据库隔离级别
数据表user_tableCC项balance为4000
![](https://i-blog.csdnimg.cn/blog_migrate/6721371ae68e02024b182c2a5cea072c.png)
线程一:查询
返回1,当前为read uncommttied
线程二:更新,操作持续15秒
两个DML操作都取消自动提交,由于事务隔离等级为可读未提交的数据,在更新操作期间变为5000,读取操作读取的是临时的5000,15秒结束,程序停止,再次启动读取操作,读的是数据库的4000。
更新8.0.20驱动,连接配置文件修改
![](https://i-blog.csdnimg.cn/blog_migrate/2609360deacc27d90cf19274412874f6.png)
DAO及其实现类
要对响应的表操作,就需要定义对应的一套接口,及其实现类,在实现类中,使用DAO中的方法,俩实现接口方法
具体表的DAO-----是接口
通用DAO是实际操作的-----------通用增删改查方法
实例
实现类中,定义sql语句,通过具体的通用方法,执行sql
创建一个实现类对象
测试具体方法
优化----查询方法-----不用传入class(已经通过创建指定表接口,知道了操作哪个表)
![](https://i-blog.csdnimg.cn/blog_migrate/2d3021796376b7094087395f6656d164.png)
构造代码块
查询操作优化-------去掉class 参数 ,并且返回值,需要跟类的泛型一致
实现类优化---------继承父类时,设置具体泛型(就是需要获取该具体泛型的class)
实现类的重写的方法调用具体通用操作方法,不传入具体class参数
静态代码块 > 构造代码块
C3P0d 的方式---创建连接池---获取连接
===============================================================================
导入jar包
创建XML文件,添加获取连接的4个基本信息,及连接池管理的信息
=====================================================================================
XML文件中,标签之间的url 连接 必须使用 & 来连接
DBCP方式-----创建连接池---获取连接
dbcp连接池常用基本配置属性
1.initialSize : 连接池启动时创建的初始化连接数量(默认值为0)
2.maxActive : 连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
3.maxIdle: 连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
4.minIdle: 连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
5.maxWait : 最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)
6.poolPreparedStatements: 开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
7.maxOpenPreparedStatements: 开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
8.minEvictableIdleTimeMillis : 连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
9.removeAbandonedTimeout : 超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
10.removeAbandoned : 超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)
==========================================================================
导入jar包
设置配置文件4个基本连接信息
使用配置文件,创建连接池
BasicDataSource 中没有返回值为connection 且 参数含有 propertis的方法
------> 用BasicDataSourceFactory 的静态方法 创建DataSource对象,传入参数为properties
=================================================================================
测试:===》
导入jar包
测试===》
直接用druid的jar包,Class QueryRunner ,创建QueryRunner对象
直接用QueryRunner 对象的update方法,增删改
使用QueyRunner测试添加表中数据 的操作
![](https://i-blog.csdnimg.cn/blog_migrate/b1c9a298e951dd561197ccfad52b850a.png)
查询操作,需要QueyRunner的方法 query() ,参数---------ResultSetHandler<T>
需要传入的是接口实现类对象
BeanHandler、BeanListHandler、MapHandler、MapListHandler
使用QueyRunner查询表中一条或多条记录
实现类BeanHandler<T>---返回一条记录
实现类BeanListHandler<T>---返回多条记录
实现类MapHandler<T>---返回一条记录
实现类MapListHandler<T>---返回多条记录
使用QueryRunner查询特殊字符查询
实现类ScalarHandler-----------用于查询
注意:BaseDAO里面的通用 增删改 、查、特殊都可以直接使用dbutils
自定义ResultSetHandler的实现类完成查询操作------------匿名内部类---实现接口
关闭资源------使用DBUtils的方法
使用close方法
使用使用closeQuietly方法
复习
BaseDao抽象类,使用和不使用dbutils,编写通用查询方法
不使用dbutils
使用dnutils