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 }
标签:JDBC,封装,money,v2.0,connection,statement,sql,import,public From: https://www.cnblogs.com/IrVolcano/p/18057384