• 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 }
  • 相关阅读:
    Rock the Tech Interview
    k-d Tree in TripAdvisor
    Randomized QuickSelect
    Kth Smallest Element in Unsorted Array
    Quick Sort
    LRU Cache 解答
    Implement Queue using Stacks 解答
    Implement Stack using Queues 解答
    ListNode Review ReverseListNode
    BackTracking
  • 原文地址:https://www.cnblogs.com/evilliu/p/8516940.html
Copyright © 2020-2023  润新知