首页 > 其他分享 >JDBC工具类封装v2.0

JDBC工具类封装v2.0

时间:2024-03-06 19:46:40浏览次数:18  
标签:JDBC 封装 money v2.0 connection statement sql import public

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

相关文章

  • JDBC工具类封装v1.0
    JDBC工具类封装1.0版1privatestaticDataSourcedataSource=null;//连接池对象23static{4//初始化连接池对象5Propertiesproperties=newProperties();6InputStreamips=JdbcUtils.class.getClassLoader().getResour......
  • a-modal使用hooks封装状态逻辑并添加全屏切换效果
    /hooks/useModal.jsimport{nextTick,ref}from'vue'import{isFunction}from"lodash-es";exportfunctionuseModal(){ //标题 //执行ok、cancel方法 constvisible=ref(false) constloading=ref(false) consthideModal=()=>{......
  • (持续更新)c++中的继承、封装、多态
    c++面向对象的三大特性为:继承、封装和多态c++认为万事万物都皆为对象,对象上有其属性和行为例如:人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌⋯车也可以作为对象,属性有轮胎、方向盘、车灯…行为有载人、放音乐、放空调…具有相同性......
  • Golang(Go语言)字符串转时间格式封装以及填坑
    先看代码:packagemainimport( "fmt" "time")funcmain(){ timeStr:="2021-05-2100:00:00" utcTime,_:=time.Parse(time.DateTime,timeStr) fmt.Println(utcTime)fmt.Println(utcTime.Local())}执行结果:从这里可以看出,字符串转换为时......
  • JDBC中的数据库事务实现
    1packagecom.atsyc.api.transaction;23//银行卡业务方法,调用dao方法45importorg.junit.Test;67importjava.sql.Connection;8importjava.sql.DriverManager;910/*11*TODO:12*事物添加是在业务方法中13*利用trycatch代码块,......
  • jdbc 国产
    国产化人大金仓数据库jdbc驱动8.6.0版本_基于国产数据库DM4的JDBC3.0开发......
  • list集合转map 封装
    //list转map很多情况下,需要遍历2层for循环,时间复杂度为O(n的平方),可以借助转map,遍历循环一层for循环,需要的从map中取数据,提升速度,//map的时间复杂度为O(1)可忽略不计,一下是对list转map的封装publicstatic<T,K>Map<K,T>list2Map(List<T>list,Function<?superT......
  • jymusic V2.0 前台XSS漏洞
    JYmusic是一款开源的跨平台音乐管理系统。有着清新的界面和强大的功能。jymusic界面在2.0版本中发现了一个可以打管理员cookie的漏洞利用条件1.登录会员2.认证音乐人上传音乐时,抓包,修改name或者cover_url参数值为:XSS"><script>alert(document.cookie)</script>>此时......
  • KBU808-ASEMI整流桥KBU808参数、尺寸、封装
    编辑:llKBU808-ASEMI整流桥KBU808参数、尺寸、封装型号:KBU808品牌:ASEMI封装:KBU-4正向电流(Id):8A反向耐压(VRRM):800V正向浪涌电流:300A正向电压(VF):1.10V引脚数量:4芯片个数:4芯片尺寸:MIL功率(Pd):中小功率工作温度:-55°C~150°C类型:插件整流桥KBU808整流桥描述:ASEMI品牌KBU8......
  • vite项目使用websocket通讯封装
    项目使用vue3+piniaimport{defineStore}from'pinia';import{getCurrentInstance}from'vue';exportconstuseSocketStore=defineStore('socket',()=>{const{proxy}=getCurrentInstance();constwsUrl=proxy.$......