C3P0連接池的詳細介紹
發(fā)表時間:2023-07-27 來源:明輝站整理相關軟件相關文章人氣:
[摘要]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知識。