首页 > 图灵资讯 > 技术篇>正文

Apache_DBUtils框架教程学习笔记(二)_事务处理

2023-04-16 09:27:25

  三、Dbutils类使用说明

  DbUtils :提供关闭连接、装载JDBC驱动程序等常规工作的工具,所有方法都是静态的。主要方法如下:   public static void close(…) throws java.sql.SQLException: Dbutils类提供了三种关闭重载的方法。检查这些方法提供的参数是否为NULL,如果没有,它们将关闭Conection、Statement和ResultSet。   public static void closeQuietly(…): 这种方法不仅可以在Conection中使用、Statement和ResultSet避免在NULL的情况下关闭,也可以隐藏一些在程序中抛出的SQLeception。   public static void commitAndCloseQuietly(Connection conn): 用于提交连接,然后关闭连接,关闭连接时不要抛出SQL异常。   public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功,则返回true。使用这种方法,您不需要捕捉这种异常Clasnotfoundexception。 四、JDBC开发中的事务处理

  在开发过程中,在更新数据库的多个表或一个表中的多个数据时,应确保多个更新操作同时成功或不成功,这涉及到多个更新操作的交易管理问题。例如,在银行业务中的转账问题中,A用户向B用户转账100元。假设A用户和B用户的资金存储在Acount表中,A用户向B用户转账涉及同时更新Acount表中A用户的资金和B用户的资金。SQL表示: 1 update account set money=money-100 where name='A' 2 update account set money=money+100 where name='B' 4.1、在数据访问层(Dao)中处理事务

  对于同时更新一个表中多个数据的操作,必须保证同时成功或不成功,因此需要保证这两个update操作在同一事务中进行。在开发过程中,我们可能会在accountdao中写一个转账处理方法,如下: /** * @Method: transfer * @Description:该方法用于处理两个用户之间的转账业务 * DAO层的职责应该只涉及CRUD, * 而这种transfer方法是处理两个用户之间的转账业务,已经涉及到具体的业务操作,在业务层面做,DAO层不应出现在DAO层 * 因此,DAO层在开发中出现这种业务处理方法是完全错误的 * * @param sourceName * @param targetName * @param money * @throws SQLException */ public void transfer(String sourceName,String targetName,float money) throws SQLException{ Connection conn = null; try{ conn = JdbcUtils.getConnection(); //开始事务 conn.setAutoCommit(false); /** * 在创建QueryRunner对象时,为了保证这两个SQL在同一事务中进行,不要将数据源传输给它, * 我们手动获取数据库连接,然后让这两个SQL连接到同一个数据库 */ QueryRunner runner = new QueryRunner(); String sql1 = "update account set money=money-100 where name=?"; String sql2 = "update account set money=money+100 where name=?"; Object[] paramar1 = {sourceName}; Object[] paramar2 = {targetName}; runner.update(conn,sql1,paramAr1; ///模拟程序异常导致事务回滚 int x = 1/0; runner.update(conn,sql2,paramAr2; ///sql正常执行后,提交事务 conn.commit(); }catch (Exception e) { e.printStackTrace(); if(conn!=null){ ///出现异常后,回滚事务 conn.rollback(); } }finally{ ///关闭数据库连接 conn.close(); } }

  然后我们在Accountservice中写一个同名方法,在方法内部调用Accountdaotransfer方法处理转账业务,如下: 1 public void transfer(String sourceName,String targetName,float money) throws SQLException{ 2 AccountDao dao = new AccountDao(); 3 dao.transfer(sourceName, targetName, money); 4 }

  Accountdao的transfer方法可以处理转账业务,并确保在同一事务中进行。但是,accountdao的transfer方法是处理两个用户之间的转账业务,涉及到具体的业务操作,应该在业务层面进行,不应该出现在dao层面。在开发中,dao层的职责只涉及基本的crud。不涉及具体的业务操作,因此DAO层的业务处理方法在开发中是一种糟糕的设计。

  Apache_DBUTils框架教程学习笔记(3)_事务处理

  Apache_DBUTils框架教程学习笔记(4)_事务处理

  Apache_dbutils框架教程学习笔记(5)_filter处理事务

上一篇 Apache_DBUtils框架教程学习笔记(三)_事务处理
下一篇 Apache_DBUtils框架教程学习笔记(一)_CRUD

文章素材均来源于网络,如有侵权,请联系管理员删除。