JDBC中的事务

  简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败。

  1、事务控制的位置

    在Service中的业务方法内进行事务控制。

  2、事务控制的代码

    a、注意:JDBC会自动把一条增、删、改的操作加入事务。(这样非常不好,因为有些情况是不需要添加事务的,容易产生问题)。

    b、推荐:手工控制事务:

      

 connection.setAutoCommit(false);    //将JDBC的自动事务关闭
 connection.commit();    //手工提交事务
 connection.rollback();    //手工回滚事务

    仅仅在Service层中写入这些代码是完全不行的,因为JDBC事物的控制代码依托于Connection对象,而Connectoin对象有JDBCUtil工具类获取,每次调用JDBCUtil.getConnection()方法的时候,JDBC都会返回一个新的Connection对象。而我们在DAO层和Service层需要用同一个Connection对象,单纯的用JDBCUtil工具类来获得Connection对象是不可取的。因为我们每次都是通过JDBCUtil来获取connection对象的,所以我们应该想办法,让在DAO和Service层利用JDBCUtil获取到同一个Connection对象。JDBCUtil代码如下:

    

public class JDBCUtil{
    static{    private static ThreadLocal tl = new ThreadLocal();    Class.forName("com.mysql.jdbc.Driver");
  }    //创建连接
    public static Connection getConnection(){
        Connection conn = tl.get();
        //加载驱动
        if(conn==null){

            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","12345678");
        }
        return conn;
    }

    //关闭资源
    public static void close(Conection conn,PreparedStatement pstmt,ResultSet rs){
        if(rs!=null){
            rs.close();
        }
        if(pstmt!null){
            pstmt.close();
        }
        if(conn!=null){
            conn.close();
        }
}

    ThreadLocal对象实现对象的线程绑定,tl.get()获得该线程中存的对象,tl.set()是将该对象存入该线程中。由此可以看出,通过ThreadLocal进行线程绑定的对象,只要是同一个线程,便能获得同一个对象。而之前我们需要在DAO和Service中使用同一个Connection对象,所以我们可以将Connection对象进行线程绑定。这样,代码在run的过程中,同一功能层面的DAO和Service调用的便是同一个Connection对象。

    ps、启用事务之后,JDBC的Connection资源应该在Service层关闭,其他资源在DAO中关闭。

浅谈JDBC(二)的更多相关文章

  1. Android开发-浅谈架构(二)

    写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...

  2. 浅谈JDBC编程

    一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...

  3. 浅谈JDBC(一)

    一.JDBC技术引言 1.什么是JDBC技术 提供了一套接口规范,利用java代码进行数据库操作. 2.JDBC技术的核心思想 对于程序员来说,代码访问数据库分为三个步骤:1.通过数据库的账号密码.2 ...

  4. 浅谈JDBC访问MySQL数据库

    经过我自己的总结后,其实很简单,只需要记住四个步骤,JDBC这部分的学习就可以掌握差不多了,请多多指教. 加载注册JDBC驱动: 打开数据库: 创建向数据库发送sql语句的statement: Res ...

  5. Qt浅谈之二十七进程间通信之QtDBus

    一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DB ...

  6. Qt浅谈之二十App自动重启及关闭子窗口

    一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...

  7. Qt浅谈之二十App自动重启及关闭子窗口(六种方法)

    一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...

  8. 浅谈Struts2(二)

    一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...

  9. 浅谈JSP(二)

    一.EL表达式 作用:从作用域(pageContext,request,session,application)中取值,并显示在页面中. 本质:用于替换输出脚本(<%= %>). 1.从作 ...

随机推荐

  1. 如何在程序中动态设置墙纸(使用IActiveDesktop接口)

    大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸: ::SystemParameter ...

  2. 运用JavaScript构建你的第一个Metro式应用程序(onWindows 8)(二)

    原文 http://blog.csdn.net/zhangxin09/article/details/6793330 先前的学习中,我们已经了解了 Metro式的 JavaScript 应用程序大致如 ...

  3. C++ 栈的实现

    #ifndef _STACK_H #define _STACK_H #pragma once template< class T >class Stack{public: Stack( v ...

  4. 用sqlserver处理excel表格

    本来最近在研究微信公众平台的,老大临时交我个任务,把excel表格里的数据导入sql数据库,我想这so easy嘛. 没想都在上面消磨了两天... 把情况介绍下:在数据库中有如下这样结构的表(A表) ...

  5. C++中顶层const和底层const

    1. 顶层 const 与底层 const 概念 指针本身是一个对象,由于,指针实际相应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个 ...

  6. C++编程技术之 异常处理(上)

    增强错误恢复能力是提高代码健壮性的最有力途径之一 之所以平时编写代码的时候不愿意去写错误处理,主要是由于这项工作及其无聊并可能导致代码膨胀,导致的结果就是本来就比较复杂的程序变得更加复杂.当然了,前面 ...

  7. 微软URLRewriter.dll的url重写在.net简单使用

    最近在做一个cms的网站 打算做成伪静态,从博客园上差了很多人的资料,终于实验成功了,原理就不讲了,附上在本地的配置,IIS的配置遇到后在发布. 文章最后附上源码 步骤如下 1.新建网站,添加URLR ...

  8. poj 1469(二分图 最大匹配)

    这道题让我认识到了c++cin,cout确实会使其超时,还是我用的c printf吧 #include<cstdio> #include<iostream> #include& ...

  9. Hibernate学习

    一.Hibernate与触发器协同工作 Hibernate与数据库中的触发器协同工作,会造成两类问题 ----触发器使Session的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中 ...

  10. html5 input的type属性启动数字输入法

    html5 input的type属性启动数字输入法   当文本框只能输入数字是一个很常见的需求,比如电话号码,身份证号,卡号, 数量....等等只允许数字输入,为了更好的用户体验性,直接写出 启动数字 ...