JDBC工具类封装v2.0

JDBC工具类封装v2.0

 1 package com.atsyc.api.utils;
 2 
 3 /*
 4  * TODO:
 5  *      利用线程本地变量,存储连接信息,确保一个线程的多个方法可以获取同一个connection
 6  *      优势:事务操作的时候 service 和 dao 属于同一个线程,不用再传递参数了
 7  *      大家都可以调用getConnection自动获取的是相同的连接池
 8  */
 9 
10 import com.alibaba.druid.pool.DruidDataSourceFactory;
11 
12 import javax.sql.DataSource;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.sql.Connection;
16 import java.sql.SQLException;
17 import java.util.Properties;
18 
19 public class JdbcUtilsV2 {
20     private static DataSource dataSource = null;//连接池对象
21 
22     //创建一个线程本地变量
23     private static ThreadLocal<Connection> tl = new ThreadLocal<>();
24 
25     static {
26         //初始化连接池对象
27         Properties properties = new Properties();
28         InputStream ips = JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties");
29         try {
30             properties.load(ips);
31         } catch (IOException e) {
32             throw new RuntimeException(e);
33         }
34 
35         try {
36             dataSource = DruidDataSourceFactory.createDataSource(properties);
37         } catch (Exception e) {
38             throw new RuntimeException(e);
39         }
40     }
41 
42     /*
43      * 对外提供连接的方法
44      * @return
45      */
46 
47     public static Connection getConnection() throws SQLException {
48 
49         //先查看线程本地变量是否存在
50         Connection connection = tl.get();
51 
52         //第一次查看没有,则从连接池获取
53         if(connection == null){
54             connection = dataSource.getConnection();
55             tl.set(connection);
56         }
57 
58         return connection;
59     }
60 
61     //回收连接的方法
62     public static void freeConnection() throws SQLException {
63 
64         Connection connection = tl.get();
65         if(connection != null){
66             tl.remove();//清空线程本地变量数据
67             connection.setAutoCommit(true);//事务状态回顾false
68             connection.close();//回收到连接池即可
69         }
70 
71     }
72 }

在BankDao中工具类的使用

 1 package com.atsyc.api.transactionnew;
 2 
 3 //bank表的数据库操作方法存储类
 4 
 5 import com.atsyc.api.utils.JdbcUtils;
 6 import com.atsyc.api.utils.JdbcUtilsV2;
 7 
 8 import java.sql.Connection;
 9 import java.sql.PreparedStatement;
10 
11 public class BankDao {
12     /*
13      * 加钱的数据库操作方法(jdbc)
14      * account 加钱的账号
15      * money 加钱的金额
16      */
17     public void add(String account,int money) throws Exception {
18 
19         Connection connection = JdbcUtilsV2.getConnection();
20 
21         String sql = "UPDATE t_bank SET money = money + ? WHERE account = ? ;";
22         PreparedStatement statement = connection.prepareStatement(sql);
23         statement.setObject(1,money);
24         statement.setObject(2,account);
25         statement.executeUpdate();
26         statement.close();
27         System.out.println("加钱成功!");
28     }
29 
30     /*
31      * 减钱的数据库操作方法(jdbc)
32      * account 减钱的帐号
33      * money 减钱的金额
34      */
35     public void sub(String account,int money) throws Exception {
36 
37         Connection connection = JdbcUtilsV2.getConnection();
38 
39         String sql = "UPDATE t_bank SET money = money - ? WHERE account = ? ;";
40         PreparedStatement statement = connection.prepareStatement(sql);
41         statement.setObject(1,money);
42         statement.setObject(2,account);
43         statement.executeUpdate();
44         statement.close();
45         System.out.println("减钱成功!");
46     }
47 }

在BankService中工具类的使用

 1 package com.atsyc.api.transactionnew;
 2 
 3 //银行卡业务方法,调用dao方法
 4 
 5 import com.atsyc.api.transaction.BankDao;
 6 import com.atsyc.api.utils.JdbcUtilsV2;
 7 import org.junit.Test;
 8 
 9 import java.sql.Connection;
10 import java.sql.DriverManager;
11 
12 /*
13  * TODO:
14  *      事物添加是在业务方法中
15  *      利用try catch代码块,开启事务和提交事务,还有事务回滚
16  *      将connection传入dao层即可,dao只负责使用,不要close();
17  */
18 
19 public class BankService {
20 
21     @Test
22     public void start() throws Exception {
23         transfer("user1","user2",500);
24     }
25 
26     public void transfer(String addAccount,String subAccount,int money) throws Exception {
27         BankDao bankDao = new BankDao();
28 
29         Connection connection = JdbcUtilsV2.getConnection();
30 
31         //一个事务的最基本要求,必须是同一个连接对象connection
32 
33         //一个转账方法属于一个事务(加钱,减钱)
34 
35         try{
36             //开启事务(从业务层开启)
37 
38             //关闭事务提交
39             connection.setAutoCommit(false);
40 
41             //执行数据库动作
42             bankDao.add(addAccount,money);
43             System.out.println("----------");
44             bankDao.sub(subAccount,money);
45 
46             //事务提交
47             connection.commit();
48         }catch (Exception e) {
49             //事务回滚
50             connection.rollback();
51             //抛出异常信息
52             throw e;
53         }finally {
54             {
55                 JdbcUtilsV2.freeConnection();
56             }
57         }
58     }
59 }

 

posted @ 2024-03-06 19:30  白茶花约  阅读(28)  评论(0)    收藏  举报