C3P0連接池 創建C3P0連接池的工具類 * 連接的規範介面: * javax.sql.DataSource介面 * 介面的實現類對象 * ComboPooledDataSource * 成員位置創建ComboPooledDataSource對象 * 使用靜態代碼塊給ComboPooledData ...
C3P0連接池
創建C3P0連接池的工具類
* 連接的規範介面:
* javax.sql.DataSource介面
* 介面的實現類對象
* ComboPooledDataSource
* 成員位置創建ComboPooledDataSource對象
* 使用靜態代碼塊給ComboPooledDataSource設置4大數據量連接信息
* 創建一個靜態方法返回Connection對象
* 創建一個靜態方法釋放資源
1 public class C3P0Utils { 2 //成員位置創建ComboPooledDataSource對象 3 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); 4 5 //使用靜態代碼塊給ComboPooledDataSource設置4大數據量連接信息 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 //創建一個靜態方法返回Connection對象 18 public static Connection getConnection(){ 19 try { 20 return dataSource.getConnection(); 21 } catch (SQLException e) { 22 throw new RuntimeException("獲取資料庫連接信息失敗!"); 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 }
創建讀取XML配置文件的C3P0工具類
1 public class C3P0UtilsReadXML { 2 //成員位置創建ComboPooledDataSource對象 3 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); 4 5 //使用靜態代碼塊給ComboPooledDataSource設置4大數據量連接信息 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 //創建一個返回ComboPooledDataSource的方法 18 public static DataSource getDataSource(){ 19 return dataSource; 20 } 21 22 //創建一個靜態方法返回Connection對象 23 public static Connection getConnection(){ 24 try { 25 return dataSource.getConnection(); 26 } catch (SQLException e) { 27 throw new RuntimeException("獲取資料庫連接信息失敗!"); 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連接池
創建DBCP連接池的工具類
* 連接的規範介面:
* javax.sql.DataSource介面
* 介面的實現類對象
* BasicDataSource
* 重寫getConnection方法
1 public class DBCPUtils { 2 //創建連接池的實現類對象 3 private static BasicDataSource dataSource = new BasicDataSource(); 4 5 //設置連接資料庫的4大變數,使用BasicDataSource中的set方法設置 6 static{ 7 //設置註冊的驅動信息 8 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 9 //設置Url 10 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 //創建獲取資料庫連接對象的方法 21 public static Connection getConnection(){ 22 try { 23 return dataSource.getConnection(); 24 } catch (SQLException e) { 25 throw new RuntimeException("獲取資料庫連接對象失敗"); 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 * 創建DBCP連接池工具類 3 * 使用讀取配置文件的方式 4 * DBCP中有一個工廠類BasicDataSourceFactory 5 * 工廠類中有一個靜態方法 6 * static DataSource createDataSource(Properties prop) 7 * 此方法返回的就是DataSource介面的實現類對象BasicDataSource 8 * 9 * 創建Propertis集合+IO技術讀取配置文件 10 * 把配置文件傳入BasicDataSourceFactory靜態方法createDataSource中 11 */ 12 public class DBCPUtilsReadConfig { 13 //創建DataSource變數 14 private static DataSource dataSource; 15 16 static{ 17 try { 18 //創建Propertis集合+IO技術讀取配置文件 19 //使用類載入器,掃描包下的文件 20 InputStream is = DBCPUtilsReadConfig.class.getClassLoader() 21 .getResourceAsStream("dbcpconfig.properties"); 22 //創建Propertis集合 23 Properties prop = new Properties(); 24 prop.load(is); 25 //把配置文件傳入BasicDataSourceFactory靜態方法createDataSource中 26 dataSource = BasicDataSourceFactory.createDataSource(prop); 27 } catch (Exception e) { 28 throw new RuntimeException("讀取配置文件失敗"); 29 } 30 } 31 32 //創建獲取資料庫連接對象的方法 33 public static Connection getConnection(){ 34 try { 35 return dataSource.getConnection(); 36 } catch (SQLException e) { 37 throw new RuntimeException("獲取資料庫連接對象失敗"); 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工具類對資料庫表進行增刪改查
* DBUtils工具類作用:簡化JDBC的開發(6步)
*
* DBUtils有3個核心類
* 1.QueryRunner:使用QueryRunner中的方法對資料庫進行增刪改查
* 2.DbUtils:提供了大量的釋放資源的方法
* 3.ResultSetHandler介面:提供了處理查詢結果集的方法
*
* QueryRunner類
* 構造方法:
* QueryRunner() 空參數構造方法
* 調用更新和查詢方法的時候,需要傳入Connection對象
* QueryRunner(DataSource ds) 帶DataSource資料庫連接池的構造方法
* 調用更新和查詢方法的時候QueryRunner會自動從DataSource實現類對象中獲取資料庫連接對象,使用完畢會自動歸還
* 成員方法:
* 執行執行增刪改的成員方法
* int update(Connection conn, String sql, Object... params)用來執行增刪改的SQL
* int update(String sql, Object... params) 用來執行增刪改的SQL
* 參數:
* Connection conn:資料庫連接對象
* String sql:拼接的sql語句,可以使用?占位符
* Object... params:?占位符的實際參數,可以使用Object[]
* 返回值:
* int:執行的有效行數
* 執行執行查詢的成員方法
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
* 參數:
* Connection conn:資料庫連接對象
* String sql:拼接的sql語句,可以使用?占位符
* Object... params:?占位符的實際參數,可以使用Object[]
* ResultSetHandler<T> rsh:用來存儲查詢之後的結果集,可以傳入ResultSetHandler9種實現類對象
* 返回值:
* <T> T:傳入的ResultSetHandler實現類不同,返回的結果集也不同,使用泛型,傳入什麼結果集,就返回對應的類型
1 public class Demo01DBUtils { 2 //創建QueryRunner對象,構造方法中傳入連接池的實現類對象 3 QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource()); 4 5 /* 6 * 使用QueryRunner,對資料庫表進行刪除數據 7 */ 8 @Test 9 public void delete(){ 10 try { 11 //拼接增加的sql語句 12 String sql = "DELETE FROM category WHERE cid=?"; 13 //調用QueryRunner中update方法執行sql語句 14 //創建對象數據,儲存?占位符的實際參數 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,對資料庫表進行修改數據 25 */ 26 @Test 27 public void update(){ 28 try { 29 //拼接增加的sql語句 30 String sql = "UPDATE category SET cname=? WHERE cid=?"; 31 //調用QueryRunner中update方法執行sql語句 32 //創建對象數據,儲存?占位符的實際參數 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,對資料庫表進行增加(插入)數據 43 */ 44 @Test 45 public void insert(){ 46 try { 47 //拼接增加的sql語句 48 String sql = "INSERT INTO category(cname) VALUES(?)"; 49 //調用QueryRunner中update方法執行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對資料庫表進行查詢的九種查詢方式
1 /* 2 * 使用QueryRunner對資料庫表進行查詢 3 * <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) 4 */ 5 public class Demo02DBUtils { 6 //創建QueryRunner對象,構造方法中傳入資料庫連接池的實現類 7 QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource()); 8 9 /* 10 * 第九種查詢方式:使用KeyedHandler(Map嵌套Map) 11 * KeyedHandler會把結果集的每一行數據封裝到Map集合中 12 * key:字元串類型列名 13 * value:列名對應的值(不同的列,數據類型不同,value使用Object類型) 14 * 多個Map集合存儲到另外一個Map集合中 15 * key:指定的字元串列名,不指定則預設使用第一列 16 * value:傳入存儲每行數據的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集合取出存儲每一行數據的Map集合 32 for (Object obj: mapmap.keySet()) { 33 //根據key取出值存儲每一行數據的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 //列印完每一行數據之後換行 40 System.out.println(); 41 } 42 } catch (Exception e) { 43 System.out.println(e); 44 } 45 } 46 47 /* 48 * 第八種查詢方式:使用ScalarHandler(重點) 49 * ScalarHandler用於執行返回單個數據的sql語句 50 * 使用聚合函數查詢的結果都是單個數據 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 //返回的值的數據類型不確定,使用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會把多條數據,存儲到多個Map集合中 71 * key:字元串類型列名 72 * value:列名對應的值(不同的列,數據類型不同,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方法執行查詢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();//列印完每行數據之後換行 89 } 90 } catch (Exception e) { 91 System.out.println(e); 92 } 93 } 94 95 /* 96 * 第六種查詢方式:使用MapHandler 97 * MapHandler把結果集的第一行數據存儲Map集合中 98 * key:字元串類型列名 99 * value:列名對應的值(不同的列,數據類型不同,value使用Object類型) 100 */ 101 @Test 102 public void mapHandler(){ 103 try { 104 //拼接查詢sql語句 105 String sql = "SELECT * FROM category"; 106 //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入MapHandler 107 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方法獲取value 112 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 * 第五種查詢方式:使用ColumnListHandler 123 * ColumnListHandler會把結果集中指定列的數據封裝到一個List集合中 124 * 如果不指定列,則預設使用第一列數據存儲到List集合中 125 * ColumnListHandler() 126 * ColumnListHandler(int columnIndex) 列號1,2,3,4 127 * ColumnListHandler(String columnName) 列名 128 */ 129 @Test 130 public void columnListHandler(){ 131 try { 132 //拼接查詢sql語句 133 String sql = "SELECT * FROM category"; 134 //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入ColumnListHandler 135 //返回一個List集合,因為列的數據類型不同,所有元素使用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會把多個條數據封裝到多個JavaBean對象中 148 * 多個JavaBean對象存儲到List集合中 149 * 150 * 註意: 151 * JavaBean中必須有空參數構造方法 152 */ 153 @Test 154 public void beanListHandler(){ 155 try { 156 //拼接查詢sql語句 157 String sql = "SELECT * FROM category"; 158 //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入BeanListHandler 159 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會把結果集的第一條數據,封裝到指定的JavaBean對象中 172 * 構造方法: 173 * BeanHandler(Class<T> type) 傳遞JavaBean對象的class文件對象 174 * BeanHandler內部會根據傳遞的class文件對象使用反射技術創建JavaBean對象,把查詢的結果集中第一行數據存儲到JavaBean中 175 * 相當於 176 * Category c = new Category(); 177 * c.setXXX(xxx); 178 * c.setXXX(xxx); 179 * c.setXXX(xxx); 180 * 註意: 181 * JavaBean中必須有空參數構造方法 182 */ 183 @Test 184 public void beanHandler(){ 185 try { 186 //拼接查詢sql語句 187 String sql = "SELECT * FROM category"; 188 //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入BeanHandler 189 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 * 第二種查詢方式:使用ArrayListHandler 198 * ArrayListHandler中會把多條結果封裝到多個對象數組中 199 * 一個對象數組封裝一行數據 200 * 多個對象數組需要存儲到list集合中 201 */ 202 @Test 203 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方法執行查詢sql語句,傳入ArrayListHandler結果集 209