注意:我们在使用有参的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 }