明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

C3P0連接池的詳細介紹

[摘要]C3P0連接池創(chuàng)建C3P0連接池的工具類 * 連接的規(guī)范接口: * javax.sql.DataSource接口 * 接口的實現(xiàn)類對象 * ComboPooledDataSource * 成...
C3P0連接池

創(chuàng)建C3P0連接池的工具類
* 連接的規(guī)范接口:
* javax.sql.DataSource接口
* 接口的實現(xiàn)類對象
* ComboPooledDataSource
* 成員位置創(chuàng)建ComboPooledDataSource對象
* 使用靜態(tài)代碼塊給ComboPooledDataSource設置4大數(shù)據(jù)量連接信息
* 創(chuàng)建一個靜態(tài)方法返回Connection對象
* 創(chuàng)建一個靜態(tài)方法釋放資源

 1 public class C3P0Utils { 2     //成員位置創(chuàng)建ComboPooledDataSource對象 3     private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); 4      5     //使用靜態(tài)代碼塊給ComboPooledDataSource設置4大數(shù)據(jù)量連接信息 6     static{ 7         try { 8             dataSource.setDriverClass("com.mysql.jdbc.Driver"); 9             dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");10             dataSource.setUser("root");11             dataSource.setPassword("root");12         } catch (Exception e) {13             throw new RuntimeException("設置連接信息失敗!");14         }15     }16     17     //創(chuàng)建一個靜態(tài)方法返回Connection對象18     public static Connection getConnection(){19         try {20             return dataSource.getConnection();21         } catch (SQLException e) {22             throw new RuntimeException("獲取數(shù)據(jù)庫連接信息失敗!");23         }24     }25     26     //定義一個釋放資源的方法27         public static void close(ResultSet rs,Statement stat,Connection conn){28             if(rs!=null){29                 try {30                     rs.close();31                 } catch (SQLException e) {32                     e.printStackTrace();33                 }34             }35             if(stat !=null){36                 try {37                     stat.close();38                 } catch (SQLException e) {39                     e.printStackTrace();40                 }41             }42             if(conn != null){43                 try {44                     conn.close();45                 } catch (SQLException e) {46                     e.printStackTrace();47                 }48             }49         }50 }

創(chuàng)建讀取XML配置文件的C3P0工具類

 1 public class C3P0UtilsReadXML { 2     //成員位置創(chuàng)建ComboPooledDataSource對象 3     private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); 4      5     //使用靜態(tài)代碼塊給ComboPooledDataSource設置4大數(shù)據(jù)量連接信息 6     /*static{ 7         try { 8             dataSource.setDriverClass("com.mysql.jdbc.Driver"); 9             dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");10             dataSource.setUser("root");11             dataSource.setPassword("root");12         } catch (Exception e) {13             throw new RuntimeException("設置連接信息失敗!");14         }15     }*/16     17     //創(chuàng)建一個返回ComboPooledDataSource的方法18     public static DataSource getDataSource(){19         return dataSource;20     }21     22     //創(chuàng)建一個靜態(tài)方法返回Connection對象23     public static Connection getConnection(){24         try {25             return dataSource.getConnection();26         } catch (SQLException e) {27             throw new RuntimeException("獲取數(shù)據(jù)庫連接信息失敗!");28         }29     }30     31     //定義一個釋放資源的方法32         public static void close(ResultSet rs,Statement stat,Connection conn){33             if(rs!=null){34                 try {35                     rs.close();36                 } catch (SQLException e) {37                     e.printStackTrace();38                 }39             }40             if(stat !=null){41                 try {42                     stat.close();43                 } catch (SQLException e) {44                     e.printStackTrace();45                 }46             }47             if(conn != null){48                 try {49                     conn.close();50                 } catch (SQLException e) {51                     e.printStackTrace();52                 }53             }54         }55 }

DBCP連接池

創(chuàng)建DBCP連接池的工具類
* 連接的規(guī)范接口:
* javax.sql.DataSource接口
* 接口的實現(xiàn)類對象
* BasicDataSource
* 重寫getConnection方法

 1 public class DBCPUtils { 2     //創(chuàng)建連接池的實現(xiàn)類對象 3     private static BasicDataSource dataSource = new BasicDataSource(); 4      5     //設置連接數(shù)據(jù)庫的4大變量,使用BasicDataSource中的set方法設置 6     static{ 7         //設置注冊的驅動信息 8         dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 9         //設置Url10         dataSource.setUrl("jdbc:mysql://localhost:3306/mybase4");11         //設置用戶名12         dataSource.setUsername("root");13         //設置密碼14         dataSource.setPassword("root");15         //可選信息16         //dataSource.setInitialSize(100);17         //dataSource.setMaxActive(1000);18     }19     20     //創(chuàng)建獲取數(shù)據(jù)庫連接對象的方法21     public static Connection getConnection(){22         try {23             return dataSource.getConnection();24         } catch (SQLException e) {25             throw new RuntimeException("獲取數(shù)據(jù)庫連接對象失敗");26         }27     }28     29     //定義一個釋放資源的方法30     public static void  close(ResultSet rs,Statement stat,Connection conn){31         if(rs!=null){32             try {33                 rs.close();34             } catch (SQLException e) {35                 e.printStackTrace();36             }37         }38         if(stat !=null){39             try {40                 stat.close();41             } catch (SQLException e) {42                 e.printStackTrace();43             }44         }45         if(conn != null){46             try {47                 conn.close();48             } catch (SQLException e) {49                 e.printStackTrace();50             }51         }52     }53 }

讀取配置文件的方式

 1 /* 2  * 創(chuàng)建DBCP連接池工具類 3  * 使用讀取配置文件的方式 4  * DBCP中有一個工廠類BasicDataSourceFactory 5  * 工廠類中有一個靜態(tài)方法 6  * static DataSource createDataSource(Properties prop) 7  * 此方法返回的就是DataSource接口的實現(xiàn)類對象BasicDataSource 8  * 
 9  * 創(chuàng)建Propertis集合+IO技術讀取配置文件10  * 把配置文件傳入BasicDataSourceFactory靜態(tài)方法createDataSource中11  */12 public class DBCPUtilsReadConfig {13     //創(chuàng)建DataSource變量14     private static DataSource dataSource;15     16     static{17         try {18             //創(chuàng)建Propertis集合+IO技術讀取配置文件19             //使用類加載器,掃描包下的文件20             InputStream is = DBCPUtilsReadConfig.class.getClassLoader()21                     .getResourceAsStream("dbcpconfig.properties");22             //創(chuàng)建Propertis集合23             Properties prop = new Properties();24             prop.load(is);25             //把配置文件傳入BasicDataSourceFactory靜態(tài)方法createDataSource中26             dataSource = BasicDataSourceFactory.createDataSource(prop);27         } catch (Exception e) {28             throw new RuntimeException("讀取配置文件失敗");29         }30     }31     32     //創(chuàng)建獲取數(shù)據(jù)庫連接對象的方法33     public static Connection getConnection(){34         try {35             return dataSource.getConnection();36         } catch (SQLException e) {37             throw new RuntimeException("獲取數(shù)據(jù)庫連接對象失敗");38         }39     }40     41     //定義一個釋放資源的方法42     public static void  close(ResultSet rs,Statement stat,Connection conn){43         if(rs!=null){44             try {45                 rs.close();46             } catch (SQLException e) {47                 e.printStackTrace();48             }49         }50         if(stat !=null){51             try {52                 stat.close();53             } catch (SQLException e) {54                 e.printStackTrace();55             }56         }57         if(conn != null){58             try {59                 conn.close();60             } catch (SQLException e) {61                 e.printStackTrace();62             }63         }64     }65 }


* 使用DBUtils工具類對數(shù)據(jù)庫表進行增刪改查
* DBUtils工具類作用:簡化JDBC的開發(fā)(6步)
*
* DBUtils有3個核心類
* 1.QueryRunner:使用QueryRunner中的方法對數(shù)據(jù)庫進行增刪改查
* 2.DbUtils:提供了大量的釋放資源的方法
* 3.ResultSetHandler接口:提供了處理查詢結果集的方法
*
* QueryRunner類
* 構造方法:
* QueryRunner() 空參數(shù)構造方法
* 調用更新和查詢方法的時候,需要傳入Connection對象
* QueryRunner(DataSource ds) 帶DataSource數(shù)據(jù)庫連接池的構造方法
* 調用更新和查詢方法的時候QueryRunner會自動從DataSource實現(xiàn)類對象中獲取數(shù)據(jù)庫連接對象,使用完畢會自動歸還
* 成員方法:
* 執(zhí)行執(zhí)行增刪改的成員方法
* int update(Connection conn, String sql, Object... params)用來執(zhí)行增刪改的SQL
* int update(String sql, Object... params) 用來執(zhí)行增刪改的SQL
* 參數(shù):
* Connection conn:數(shù)據(jù)庫連接對象
* String sql:拼接的sql語句,可以使用?占位符
* Object... params:?占位符的實際參數(shù),可以使用Object[]
* 返回值:
* int:執(zhí)行的有效行數(shù)
* 執(zhí)行執(zhí)行查詢的成員方法
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
* 參數(shù):
* Connection conn:數(shù)據(jù)庫連接對象
* String sql:拼接的sql語句,可以使用?占位符
* Object... params:?占位符的實際參數(shù),可以使用Object[]
* ResultSetHandler<T> rsh:用來存儲查詢之后的結果集,可以傳入ResultSetHandler9種實現(xiàn)類對象
* 返回值:
* <T> T:傳入的ResultSetHandler實現(xiàn)類不同,返回的結果集也不同,使用泛型,傳入什么結果集,就返回對應的類型

 1 public class Demo01DBUtils { 2     //創(chuàng)建QueryRunner對象,構造方法中傳入連接池的實現(xiàn)類對象 3     QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource()); 4      5     /* 6      * 使用QueryRunner,對數(shù)據(jù)庫表進行刪除數(shù)據(jù) 7      */ 8     @Test 9     public void delete(){10         try {11             //拼接增加的sql語句12             String sql = "DELETE FROM category WHERE cid=?";13             //調用QueryRunner中update方法執(zhí)行sql語句14             //創(chuàng)建對象數(shù)據(jù),儲存?占位符的實際參數(shù)15             //Object[] parmars = {"洗",10};16             int row = qr.update(sql, 7);17             System.out.println(row);18         } catch (Exception e) {19             System.out.println(e);20         }21     }22     23     /*24      * 使用QueryRunner,對數(shù)據(jù)庫表進行修改數(shù)據(jù)25      */26     @Test27     public void update(){28         try {29             //拼接增加的sql語句30             String sql = "UPDATE category SET cname=? WHERE cid=?";31             //調用QueryRunner中update方法執(zhí)行sql語句32             //創(chuàng)建對象數(shù)據(jù),儲存?占位符的實際參數(shù)33             Object[] parmars = {"洗",10};34             int row = qr.update(sql, parmars);35             System.out.println(row);36         } catch (Exception e) {37             System.out.println(e);38         }39     }40     41     /*42      * 使用QueryRunner,對數(shù)據(jù)庫表進行增加(插入)數(shù)據(jù)43      */44     @Test45     public void insert(){46         try {47             //拼接增加的sql語句48             String sql = "INSERT INTO category(cname) VALUES(?)";49             //調用QueryRunner中update方法執(zhí)行sql語句50             int row = qr.update(sql, "玩具");51             System.out.println(row);52         } catch (Exception e) {53             System.out.println(e);54         }55     }56 }

使用QueryRunner對數(shù)據(jù)庫表進行查詢的九種查詢方式

  1 /*  2  * 使用QueryRunner對數(shù)據(jù)庫表進行查詢  3  * <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)    
  4  */  5 public class Demo02DBUtils {  6     //創(chuàng)建QueryRunner對象,構造方法中傳入數(shù)據(jù)庫連接池的實現(xiàn)類  7     QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());  8       9     /* 10      * 第九種查詢方式:使用KeyedHandler(Map嵌套Map) 11      * KeyedHandler會把結果集的每一行數(shù)據(jù)封裝到Map集合中 12      *     key:字符串類型列名 13      *     value:列名對應的值(不同的列,數(shù)據(jù)類型不同,value使用Object類型) 14      * 多個Map集合存儲到另外一個Map集合中 15      *     key:指定的字符串列名,不指定則默認使用第一列 16      *     value:傳入存儲每行數(shù)據(jù)的Map集合 17      * 
 18      * 構造方法: 19      *     KeyedHandler() 不指定列名 20      *     KeyedHandler(int columnIndex) 指定列號1,2,3,4 21      *     KeyedHandler(String columnName) 指定字符串格式列名 22      */ 23     @Test 24     public void keyedHandler(){ 25         try { 26             //拼接sql語句 27             String sql = "SELECT * FROM category"; 28             //調用QueryRunner中的query方法,結果集使用KeyedHandler 29             //Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cid")); 30             Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cname")); 31             //遍歷Map集合取出存儲每一行數(shù)據(jù)的Map集合 32             for (Object obj: mapmap.keySet()) { 33                 //根據(jù)key取出值存儲每一行數(shù)據(jù)的Map集合 34                 Map<String,Object> map = mapmap.get(obj); 35                 //遍歷Map集合 36                 for(String key : map.keySet()){ 37                     System.out.print(obj+":"+key+"..."+map.get(key)+"\t"); 38                 } 39                 //打印完每一行數(shù)據(jù)之后換行 40                 System.out.println(); 41             } 42         } catch (Exception e) { 43             System.out.println(e); 44         } 45     } 46      47     /* 48      * 第八種查詢方式:使用ScalarHandler(重點) 49      * ScalarHandler用于執(zhí)行返回單個數(shù)據(jù)的sql語句 50      * 使用聚合函數(shù)查詢的結果都是單個數(shù)據(jù) 51      * 或者查詢某一行的某一個字段 52      */ 53     @Test 54     public void scalarHandler(){ 55         try { 56             //拼接sql語句 57             String sql = "SELECT SUM(cid) FROM category"; 58             sql = "SELECT cname FROM category WHERE cid=?"; 59             //調用QueryRunner中的query方法,結果集使用ScalarHander 60             //返回的值的數(shù)據(jù)類型不確定,使用Object類型 61             Object obj = qr.query(sql, new ScalarHandler(),2); 62             System.out.println(obj); 63         } catch (Exception e) { 64             System.out.println(e); 65         } 66     } 67      68     /* 69      * 第七種查詢方式:使用MapListHandler 70      * 1.MapListHandler會把多條數(shù)據(jù),存儲到多個Map集合中 71      *     key:字符串類型列名 72      *     value:列名對應的值(不同的列,數(shù)據(jù)類型不同,value使用Object類型) 73      * 2.會把多個Map集合存儲List集合中 74      */ 75     @Test 76     public void mapListHandler(){ 77         try { 78             //拼接查詢sql語句 79             String sql = "SELECT * FROM category"; 80             //調用QueryRunner中的query方法執(zhí)行查詢sql語句,結果集傳入MapListHandler 81             List<Map<String,Object>> list = qr.query(sql, new MapListHandler()); 82             //遍歷List集合,取出Map集合 83             for (Map<String, Object> map : list) { 84                 //遍歷Map集合 85                 for(String key: map.keySet()){ 86                     System.out.print(key+"..."+map.get(key)+"\t"); 87                 } 88                 System.out.println();//打印完每行數(shù)據(jù)之后換行 89             } 90         } catch (Exception e) { 91             System.out.println(e); 92         } 93     } 94      95     /* 96      * 第六種查詢方式:使用MapHandler 97      * MapHandler把結果集的第一行數(shù)據(jù)存儲Map集合中 98      *     key:字符串類型列名 99      *     value:列名對應的值(不同的列,數(shù)據(jù)類型不同,value使用Object類型)100      */101     @Test102     public void mapHandler(){103         try {104             //拼接查詢sql語句105             String sql = "SELECT * FROM category";106             //調用QueryRunner中的query方法執(zhí)行查詢sql語句,結果集傳入MapHandler107             Map<String,Object> map = qr.query(sql, new MapHandler());108             //使用keySet遍歷Map集合109             Set<String> set = map.keySet();110             for (String key : set) {111                 //通過key使用get方法獲取value112                 Object value = map.get(key);113                 System.out.print(key+"..."+value+" ");114             }115         } catch (Exception e) {116             System.out.println(e);117         }118     }119     120 121     /*122      * 第五種查詢方式:使用ColumnListHandler123      * ColumnListHandler會把結果集中指定列的數(shù)據(jù)封裝到一個List集合中124      * 如果不指定列,則默認使用第一列數(shù)據(jù)存儲到List集合中125      * ColumnListHandler() 
126      * ColumnListHandler(int columnIndex) 列號1,2,3,4127      * ColumnListHandler(String columnName) 列名128      */129     @Test130     public void columnListHandler(){131         try {132             //拼接查詢sql語句133             String sql = "SELECT * FROM category";134             //調用QueryRunner中的query方法執(zhí)行查詢sql語句,結果集傳入ColumnListHandler135             //返回一個List集合,因為列的數(shù)據(jù)類型不同,所有元素使用Object類型136             List<Object> list = qr.query(sql, new ColumnListHandler("cname"));137             for (Object object : list) {138                 System.out.println(object);139             }140         } catch (Exception e) {141             System.out.println(e);142         }143     }144     145     /*146      * 第四種查詢方式:使用BeanListHandler(重點)147      * BeanListHandler會把多個條數(shù)據(jù)封裝到多個JavaBean對象中148      * 多個JavaBean對象存儲到List集合中149      * 
150      * 注意:151      *      JavaBean中必須有空參數(shù)構造方法152      */153     @Test154     public void beanListHandler(){155         try {156             //拼接查詢sql語句157             String sql = "SELECT * FROM category";158             //調用QueryRunner中的query方法執(zhí)行查詢sql語句,結果集傳入BeanListHandler159             List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));160             //遍歷存儲Category的list集合161             for (Category category : list) {162                 System.out.println(category);163             }164         } catch (Exception e) {165             System.out.println(e);166         }167     }168     169     /*170      * 第三種查詢方式:使用BeanHandler(重點)171      * BeanHandler會把結果集的第一條數(shù)據(jù),封裝到指定的JavaBean對象中172      * 構造方法:173      *     BeanHandler(Class<T> type) 傳遞JavaBean對象的class文件對象174      *         BeanHandler內部會根據(jù)傳遞的class文件對象使用反射技術創(chuàng)建JavaBean對象,把查詢的結果集中第一行數(shù)據(jù)存儲到JavaBean中175      *     相當于176      *         Category c = new Category();177      *         c.setXXX(xxx);178      *         c.setXXX(xxx);179      *         c.setXXX(xxx);180      *  注意:181      *      JavaBean中必須有空參數(shù)構造方法182      */183     @Test184     public void beanHandler(){185         try {186             //拼接查詢sql語句187             String sql = "SELECT * FROM category";188             //調用QueryRunner中的query方法執(zhí)行查詢sql語句,結果集傳入BeanHandler189             Category cate = qr.query(sql, new BeanHandler<>(Category.class));190             System.out.println(cate);191         } catch (Exception e) {192             System.out.println(e);193         }194     }195     196     /*197      * 第二種查詢方式:使用ArrayListHandler198      * ArrayListHandler中會把多條結果封裝到多個對象數(shù)組中199      * 一個對象數(shù)組封裝一行數(shù)據(jù)200      * 多個對象數(shù)組需要存儲到list集合中201      */202     @Test203     public void arrrayListHandler(){204         try {205             //拼接查詢sql語句206             String sql = "SELECT * FROM category where cid = ?";207             sql = "SELECT * FROM category where cid in(?,?)";208             //調用QueryRunner中的query方法執(zhí)行查詢sql語句,傳入ArrayListHandler結果集209             List<Object[]> list = qr.query(sql, new ArrayListHandler(), 1,3);210             //遍歷集合211             for (Object[] objects : list) {212                 //遍歷對象數(shù)組213                 for (Object obj : objects) {214                     System.out.print(obj+" ");215                 }216                 System.out.println();//換行217             }218         } catch (Exception e) {219             System.out.println(e);220         }221     }222     223     /*224      * 第一種查詢方式:使用ArrayHandler225      * ArrayHandler會把結果集第一條數(shù)據(jù)封裝到一個對象(Object)數(shù)組中226      * 數(shù)組中的每一個元素,就是第一條數(shù)據(jù)數(shù)據(jù)的每一列的值227      */228     @Test229     public void arrayHandler(){230         try {231             //拼接查詢sql語句232             String sql = "SELECT * FROM category";233             //調用QueryRunner中的query方法執(zhí)行查詢sql語句,傳入ArrayHandler結果集234             Object[] objs = qr.query(sql, new ArrayHandler());235             //遍歷數(shù)組236             for (Object obj : objs) {237                 System.out.print(obj+" ");238             }239         } catch (Exception e) {240             System.out.println(e);241         }242     }243 }

以上就是C3P0連接池的詳細介紹的詳細內容,更多請關注php中文網其它相關文章!


學習教程快速掌握從入門到精通的SQL知識。