关于JDBC Service层的事务控制---JDBC_day4

一. JDBC开发的核心流程
1.创建表
2.搭配环境(导jar包,导工具类,导入配置文件)
3.封装实体类
4.编写DAO接口,编写DAO的实现类
5.编写Service接口,编写Service的实现类

二.三层架构的思想
1.理解:一种编程思想,在逻辑上将应用程序分为三层,本着各司其职的思想划分
2.组成:
①DAO层:数据模型层
–主要负责与数据库的交互,完成增删改查(CRUD)
–接受Service层传递的数据
②Service层:(BIZ)业务逻辑层
–主要完成业务逻辑功能
–必须做事务控制
–调用DAO层的方法
–接收视图层传递的数据,并做相应的运算数据
③View层:视图层(表显层)
–主要完成与用户交互
–接收用户输入的信息
–调用Service层
–将Service层完成的功能,返回数据展示给用户
3.基于三层架构开发的好处:
①各司其职, 解耦和
② 利于协同开发
③利于项目的维护升级

三.Service层的事务控制:
1.理解Service:称为业务,主要作用是给用户提供具体的功能(通俗一点说,就是把我们需要的能用一个或多个Dao方法体现出来。或许还要添加一些循环分支等算法)
2.JDBC中的事务
①JDBC中默认 事务是一条sql语句, 自成一个事务, 自动提交。Connection 对象管理事务。
Connection conn=JdbcUtil.getConnection(); //默认为true,即代表事务是自动提交 boolean autoCommit=conn.getAutoCommit();

②事务控制
(1)autoCommit的默认为true,即代表事务是自动提交,一条sql语句提交一次,无法控制事务的原子操作(例如转账系统,一方的账户余额减钱,另一方由于某种原因断电等无法进行事务的原子操作账户余额没增加)
解决:a. 在业务操作开始:设置autoCommit为false 即conn.setAutoCommit(false);
b.业务操作完毕:- 手动提交: conn.commit();
- 手动回滚: conn.rollback();
(2)新的问题:
手动控制事务, 没控制住的原因: Service与Dao使用的不是同一个Connection对象,因为Dao的方法和Service的方法每次声明使用都会重新声明一个Connection对象,此 对象又和其他对象相互独立,所以在声明手动控制事务后并不能真正的做到“一个提交, 全部提交,一个回滚,全部回滚
解决:
Service与DAO使用同一个连接,只创建一个Connection对象,由Service创建 并将Connection对象作为参数传入Dao的方法中,这样能避免在同一Service的方法中 调用Connection对象不为同一个的缺陷。

(3)新的问题:
每执行完一个Dao的方法Connection对象根据close方法会关闭,在 同一个Service方法中,由于所有Dao都用的时同一个Connection对象,所以如果前面 的Dao的方法执行完毕并关闭,那么此Service方法中的Connection对象就完全关闭, 后面如果还有其他Dao的方法就无法使用Connection对象,所以要将Dao的方法中所 有的关于conn的关闭全部去除,改为从Service的方法中调用close方法,在所有Dao 的方法结束后再进行调用。
弊端:这种方法虽然能做到控制事务,但是会形成API入侵,一般不会把Connection对象作为参数进行使用
解决:如何保证DAO与Service 使用同一个连接-------------线程

1.分析:每一次的主线程的执行所有的调用都处于同一个线程,在当前线程里面存储资源,那么这些资源被在线程上执行的多个程序流程所共享。
2. ThreadLocal对象
①主要作用:将一个对象绑定到当前线程
②基本使用:
- 创建 : ThreadLocal tol = new ThreadLocal();
- 向当前线程存值: tol.set(T value);
- 取值 :T t = tol.get();
- 从当前线程移除一个值: tol.remove();
③注意: 一个ThreadLocal只能 向当前线程绑定一个对象 。
通过ThreadLocal绑定到当前线程的对象, 不能被其他线程共享的。
④ThreadLocal原理:

       Thread t=Thread.currentThread();   //获取当前线程对象
       ThreadLocalMap map=getMap(t);   //根据当前线程对象获取到当前线程的ThreadLocalMap区
       if(map!=null){
           map.set(this,value);
       }
}
    

⑤使用ThreadLocal对工具类的优化

四.补充:日期类型:
1.Java中的日期类型:

      java.util.Date
     java.sql.Date: 向数据库中字段类型为date的属性添加数据时使用

2.String ---->java.util.Date转换

      String strDate="1998-09-01";
      SimpleDateFormat sdf=new SimpleDateFormat ("yyyy-MM-dd");
      Date utilDate=sdf.parse(strDate);
      System.out.println(utilDate);      

3.java.util.Date---->java.sql.Date

       Long time =utilDate.getTime();
       System.out.println(time);
       java.sql.Date sqlDate=new Jva.sql.Date(time);
       System.out.println("sqlDate:"+sqlDate);

4.java.util.Date---->String

    Date CurrentDate=new Date();
    SimpleDateFormat sdf2=new SimpleDateFormat ("yyyy-MM-dd");
    String str=sdf2.format(CurrentDate);
    System.out.println("日期转字符串:"+str);
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值