dbcp最终版本

注意:我们在使用有参的queryrunner的时候,不需要关闭connection和DataSource 这些都queryrunner 都替我们完成。我们不需要关系资源释放。

工具类:

 1 package com.jd.lastVersonJdbc;
 2 
 3 
 4 import org.apache.commons.dbcp2.BasicDataSource;
 5 import org.apache.commons.dbcp2.BasicDataSourceFactory;
 6 import org.junit.Test;
 7 
 8 import javax.sql.DataSource;
 9 import java.util.Properties;
10 
11 
12 public class JdbcUtils {
13 
14       static   DataSource  getMyDataSource() throws  Exception{
15         Properties prop=new Properties();
16         prop.load(JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
17         System.out.println(prop);
18         BasicDataSource ds=BasicDataSourceFactory.createDataSource(prop);//自动解析properites文件。
19 
20         ds.setMaxIdle(2);
21         ds.setMaxTotal(12);
22         ds.setInitialSize(6);
23     return ds;
24 }
25 }

工厂函数可以直接处理properties文件,但是配置文件需要配置和creatDatasource内设置的属性名字要一致:

需要一一对应否则 无法处理properties文件.

1 driverClassName=com.mysql.jdbc.Driver
2 url=jdbc:mysql://192.168.147.146/homework_day13
3 username=test
4 password=123456

测试:

 1 package com.jd.lastVersonJdbc;
 2 
 3 import org.apache.commons.dbcp2.BasicDataSource;
 4 import org.apache.commons.dbutils.QueryRunner;
 5 import org.apache.commons.dbutils.handlers.MapListHandler;
 6 
 7 
 8 import javax.sql.DataSource;
 9 import java.lang.reflect.Constructor;
10 import java.sql.Connection;
11 import java.util.List;
12 import java.util.Map;
13 
14 public class testJdbc {
15     public  static void  main(String ... args)throws Exception{
16         BasicDataSource ds= JdbcUtils.getMyDataSource();
17         Connection con=ds.getConnection();
18         QueryRunner qr=new QueryRunner(ds);
19         String  sql="select *  from system_user";
20         MapListHandler mp=new MapListHandler();
21         List<Map<String,Object>>  rest=qr.query(sql,mp);
22 
23         for(Map<String,Object> pbj:rest){
24             System.out.println(pbj.get("username"));
25         }
26         con.close();//归还连接池。
27     }
28 }

 记住在使用完连接的时候,需要归还连接池,因为在通过DataSource获取的connection 是被装饰之后的close方法被重新定义,归还连接池。

二、带事务的jdbc工具:

 1 package jd.com.tool_jdbc;
 2 
 3 import org.apache.commons.dbcp2.BasicDataSource;
 4 import org.apache.commons.dbcp2.BasicDataSourceFactory;
 5 
 6 
 7 import java.io.InputStream;
 8 import java.sql.Connection;
 9 import java.sql.PreparedStatement;
10 import java.sql.SQLException;
11 import java.util.Properties;
12 
13 
14 
15 public   class ds_tool {
16     private  static BasicDataSource ds=null;
17     private static Connection con=null;
18     private static ThreadLocal<Connection> threadLocal=new ThreadLocal<>();
19     public   static  BasicDataSource getDs(){
20         try {
21             InputStream inp= ds_tool.class.getClassLoader().getResourceAsStream("database.properties");
22             Properties  pro=new Properties();
23             pro.load(inp);
24             ds=new BasicDataSourceFactory().createDataSource(pro);
25             ds.setInitialSize(4);
26             ds.setMaxTotal(8);
27             ds.setMaxIdle(2);
28             return  ds;
29         }catch (Exception ex){
30             throw  new RuntimeException("初始化数据库失败"+ex);
31         }
32 
33     }
34     //给当前线程绑定变量。
35     public  static  BasicDataSource setDs(){
36         try {
37             if(con==null){
38                 ds=getDs();
39                 con=ds.getConnection();
40                 threadLocal.set(con);
41             }else{
42                 threadLocal.set(con);
43             }
44             return  ds;
45         }catch (Exception ex){
46             ex.printStackTrace();
47             throw  new RuntimeException("初始化错误"+ex);
48         }
49 
50     }
51     //开启事务
52     public static void  openEven(){
53         try {
54             setDs();
55             con=threadLocal.get();
56             con.setAutoCommit(false);
57         }catch (Exception ex){
58             ex.printStackTrace();
59         }
60 
61     }
62     //提交事务
63     public static void  commEven(){
64         try {
65             con=threadLocal.get();
66             con.commit();
67         }catch (Exception ex){
68             ex.printStackTrace();
69         }
70 
71     }
72     //回滚事务
73     public static  void  rollbackEvent(){
74         try {
75             con=threadLocal.get();
76             System.out.println(con);
77             con.rollback();
78         }catch (Exception ex){
79             ex.printStackTrace();
80         }
81 
82     }
83     public  static  void closedDs(BasicDataSource ds, PreparedStatement pre){
84         try {
85             ds.close();   这个不需要关闭。
86             pre.close();  不需要操作。都是datasource帮忙处理。
87             threadLocal.remove();
88         }catch (Exception ex){
89             ex.printStackTrace();
90         }
91 
92     }
93 
94 }
原文地址:https://www.cnblogs.com/evilliu/p/8516940.html