JDBC

连字符 &  --》 &

 




主方法才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

线程一:查询

         
         返回1,当前为read uncommttied
        
        

线程二:更新,操作持续15秒

两个DML操作都取消自动提交,由于事务隔离等级为可读未提交的数据,在更新操作期间变为5000,读取操作读取的是临时的5000,15秒结束,程序停止,再次启动读取操作,读的是数据库的4000。

 

更新8.0.20驱动,连接配置文件修改

        

 

 

DAO及其实现类



要对响应的表操作,就需要定义对应的一套接口,及其实现类,在实现类中,使用DAO中的方法,俩实现接口方法

具体表的DAO-----是接口
通用DAO是实际操作的-----------通用增删改查方法

实例


             
            
            
            


            



实现类中,定义sql语句,通过具体的通用方法,执行sql

 




 


创建一个实现类对象

测试具体方法

 

 

优化----查询方法-----不用传入class(已经通过创建指定表接口,知道了操作哪个表)


          
构造代码块
          

查询操作优化-------去掉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测试添加表中数据 的操作




 


 

 

 

 

 

查询操作,需要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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值