DBUtils
概述
DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼。
Dbutils三個核心功能介紹
QueryRunner中提供對sql語句操作的API.
ResultSetHandler接口,用於定義select操作后,怎樣封裝結果集.
DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法
QueryRunner核心類
update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操作
QueryRunner實現添加、更新、刪除操作
update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
QueryRunner實現查詢操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params),用來完成表數據的查詢操作
1.1.1 ResultSetHandler結果集處理類
| ArrayHandler |
將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每一個元素就是這條記錄中的每一個字段的值 |
| ArrayListHandler |
將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。 |
| BeanHandler |
將結果集中第一條記錄封裝到一個指定的javaBean中。 |
| BeanListHandler |
將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中 |
| ColumnListHandler |
將結果集中指定的列的字段值,封裝到一個List集合中 |
| ScalarHandler |
它是用於單數據。例如select count(*) from 表操作。 |
| MapHandler |
將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據 |
| MapListHandler |
將結果集每一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合 |
JavaBean
- 需要實現接口:java.io.Serializable
- 提供私有字段:private 類型 字段名;
- 提供getter/setter方法:
- 提供無參構造
代碼實現:
1 public void addProduct() throws SQLException{ 2 Connection conn=JDBCUtils.getConn(); 3 QueryRunner qr=new QueryRunner(); 4 String sql="insert into product(pid,pname) values(?,?)"; 5 Object[] obj={"1234567","iphoneXS"}; 6 qr.update(conn, sql,obj); 7 DbUtils.closeQuietly(conn); 8 } 9 public void deleteProduct() throws SQLException{ 10 Connection conn=JDBCUtils.getConn(); 11 QueryRunner qr=new QueryRunner(); 12 String sql="delete from product where pname=? "; 13 Object[] obj={"qwdqw"}; 14 qr.update(conn,sql, obj); 15 DbUtils.closeQuietly(conn); 16 } 17 public void editProduct() throws SQLException{ 18 Connection conn=JDBCUtils.getConn(); 19 QueryRunner qr=new QueryRunner(); 20 String sql="update product set pname=? where pid=?"; 21 Object[] obj={"vivoX10","1234567"}; 22 qr.update(conn, sql,obj); 23 DbUtils.closeQuietly(conn); 24 } 25 //ArrayHandler 26 //將結果集中的第一行數據封裝到Object[]中
27 public void select1() throws SQLException{ 28 Connection conn=JDBCUtils.getConn(); 29 QueryRunner qr=new QueryRunner(); 30 String sql="select * from product"; 31 Object[] obj=qr.query(conn,sql, new ArrayHandler()); 32 for(Object o:obj){ 33 System.out.println(o); 34 } 35 } 36 //ArrayListHandler 37 //將結果集中的每一行都封裝到Object[]中,然后將每一個Object數組封裝到一個List集合中
38 public void select2() throws SQLException{ 39 Connection conn=JDBCUtils.getConn(); 40 QueryRunner qr=new QueryRunner(); 41 String sql="select * from product"; 42 List<Object[]> list=qr.query(conn,sql, new ArrayListHandler()); 43 for(Object[] obj:list){ 44 for(Object o:obj){ 45 System.out.println(o+"\t"); 46 } 47 System.out.println(); 48 } 49 } 50 //BeanHandler 51 //將結果集中的第一條記錄封裝到指定的JavaBean中
52 public void select3() throws SQLException{ 53 QueryRunner qr=new QueryRunner(); 54 Connection conn=JDBCUtils.getConn(); 55 String sql="select * from product"; 56 Product product=qr.query(conn,sql, new BeanHandler<Product>(Product.class)); 57 System.out.println(product); 58 DbUtils.closeQuietly(conn); 59 } 60 //BeanListHandler 61 //將結果集中的每一條記錄封裝到指定的JavaBean中再將每一個JavaBean封裝到List集合中
62 public void select4() throws SQLException{ 63 QueryRunner qr=new QueryRunner(); 64 Connection conn=JDBCUtils.getConn(); 65 String sql="select * from product"; 66 List<Product> list=qr.query(conn,sql, new BeanListHandler<Product>(Product.class)); 67 for(Product p:list){ 68 System.out.println(p); 69 } 70 DbUtils.closeQuietly(conn); 71 } 72 //ColumnListHandler 73 //將結果集中的指定列封裝到List集合中
74 public void select5() throws SQLException{ 75 QueryRunner qr=new QueryRunner(); 76 Connection conn=JDBCUtils.getConn(); 77 String sql="select * from product"; 78 List<String> list=qr.query(conn,sql, new ColumnListHandler<String>("pname")); 79 for(String s:list){ 80 System.out.println(s); 81 } 82 DbUtils.closeQuietly(conn); 83 } 84 //ScalarHandler
85 public void select6() throws SQLException{ 86 QueryRunner qr=new QueryRunner(); 87 Connection conn=JDBCUtils.getConn(); 88 String sql="select count(*) from product"; 89 Long count=qr.query(conn,sql, new ScalarHandler<Long>()); 90 System.out.println(count); 91 DbUtils.closeQuietly(conn); 92 } 93
94 public void select7() throws SQLException{ 95 QueryRunner qr=new QueryRunner(); 96 Connection conn=JDBCUtils.getConn(); 97 String sql="select * from product"; 98 Map<String,Object> map=qr.query(conn, sql, new MapHandler()); 99 Set<Map.Entry<String,Object>> set=map.entrySet(); 100 for(Map.Entry<String,Object> entry:set){ 101 System.out.println(entry.getKey()+"..."+entry.getValue()); 102 } 103 DbUtils.closeQuietly(conn); 104 } 105 public void select8() throws SQLException{ 106 QueryRunner qr=new QueryRunner(DBUtils.getDataSource()); 107 //Connection conn=JDBCUtils.getConn();
108 String sql="select * from product"; 109 List<Map<String,Object>> list=qr.query(sql, new MapListHandler()); 110 for(Map<String,Object> map:list){ 111 Set<Map.Entry<String,Object>> set=map.entrySet(); 112 for(Map.Entry<String,Object> entry:set){ 113 System.out.println(entry.getKey()+"..."+entry.getValue()); 114 } 115 } 116
117 //DbUtils.closeQuietly(conn);
118 } 119 }
連接池
連接池概述
概念
用池來管理Connection,這樣可以重復使用Connection。有了池,所以我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection后,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。池就可以再利用這個Connection對象了
DBCP連接池
1 public class JDBCUtils { 2
3
4 public static final String DRIVER = "com.mysql.jdbc.Driver"; 5
6
7 public static final String URL = "jdbc:mysql://localhost:3306/daydb"; 8
9
10 public static final String USERNAME = "root"; 11
12
13 public static final String PASSWORD = "root"; 14
15
16 /*
17
18
19 * 創建連接池BasicDataSource 20
21
22 */
23
24
25 public static BasicDataSource dataSource = new BasicDataSource(); 26
27
28 //靜態代碼塊
29
30
31 static { 32
33
34 //對連接池對象 進行基本的配置
35
36
37 dataSource.setDriverClassName(DRIVER); // 這是要連接的數據庫的驅動
38
39
40 dataSource.setUrl(URL); //指定要連接的數據庫地址
41
42
43 dataSource.setUsername(USERNAME); //指定要連接數據的用戶名
44
45
46 dataSource.setPassword(PASSWORD); //指定要連接數據的密碼
47
48
49 } 50
51
52 /*
53
54
55 * 返回連接池對象 56
57
58 */
59
60
61 public static DataSource getDataSource(){ 62
63
64 return dataSource; 65
66
67 } 68
69
70 }
工具類的使用
1 測試類 2
3
4 /*
5
6
7 * 演示使用DBUtils工具 完成數據庫表的增加操作 8
9
10 */
11
12
13 public class Demo { 14
15
16 // 插入功能
17
18
19 @Test 20
21
22 public void insert(){ 23
24
25 try { 26
27
28 //獲取一個用來執行SQL語句的對象 QueryRunner
29
30
31 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); 32
33
34 String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)"; 35
36
37 Object[] params = {"股票收入", 5500, "收入"}; 38
39
40 int line = qr.update(sql,params); 41
42
43 //結果集處理
44
45
46 System.out.println("line = " + line); 47
48
49
50
51
52 } catch (SQLException e) { 53
54
55 throw new RuntimeException(e); 56
57
58 } 59
60
61 } 62
63
64
65
66
67 //刪除功能
68
69
70 @Test 71
72
73 public void delete(){ 74
75
76 try { 77
78
79 //創建一個QueryRunner對象,用來完成SQL語句的執行
80
81
82 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); 83
84
85 //執行SQL語句
86
87
88 String sql = "DELETE FROM zhangwu WHERE name = ?"; 89
90
91 Object[] params = {"股票收入"}; 92
93
94 int line = qr.update(sql, params); 95
96
97 //結果集的處理
98
99
100 System.out.println("line="+line); 101
102
103
104
105
106 } catch (SQLException e) { 107
108
109 throw new RuntimeException(e); 110
111
112 } 113
114
115 } 116
117
118
119
120
121 //更新功能
122
123
124 @Test 125
126
127 public void update(){ 128
129
130 try { 131
132
133 //創建一個QueryRunner對象,用來完成SQL語句的執行
134
135
136 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); 137
138
139 //執行SQL語句
140
141
142 String sql = "UPDATE zhangwu SET money = money+1000 WHERE name=?"; 143
144
145 Object[] params = {"股票收入"}; 146
147
148 int line = qr.update(sql, params); 149
150
151 //結果集的處理
152
153
154 System.out.println("line="+line); 155
156
157
158
159
160 } catch (SQLException e) { 161
162
163 throw new RuntimeException(e); 164
165
166 } 167
168
169 } 170
171
172
173
174
175 //查詢功能,將結果集中第一條記錄封裝到一個指定的javaBean中。
176
177
178 @Test 179
180
181 public void search(){ 182
183
184 try{ 185
186
187 //獲取QueryRunner
188
189
190 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); 191
192
193 //執行SQL語句
194
195
196 String sql = "SELECT * FROM zhangwu"; 197
198
199 Object[] params = {}; 200
201
202 Product p = qr.query(sql, new BeanHandler<Product>(Product.class), params); 203
204
205 //結果集處理
206
207
208 System.out.println(p); 209
210
211
212
213
214 } catch(SQLException e){ 215
216
217 throw new RuntimeException(e); 218
219
220 } 221
222
223 } 224
225
226 }
常見配置項
| 分類 |
屬性 |
描述 |
| 必須項 |
driverClassName |
數據庫驅動名稱 |
| url |
數據庫的地址 |
|
| username |
用戶名 |
|
| password |
密碼 |
|
| 基本項(擴展) |
maxActive |
最大連接數量 |
| minIdle |
最小空閑連接 |
|
| maxIdle |
最大空閑連接 |
|
| initialSize |
初始化連接 |
總結
DBUtils工具
作用:簡化JDBC的操作
常用類與方法
QueryRunner 用來執行SQL語句對象
update(Connection conn, String sql, Object… params) 插入表記錄、更新表記錄、刪除表記錄
query(Connection conn, String sql, ResultSetHandler handler, Object… params) 查詢表記錄
ResultSetHandler 處理結果集的對象
| ArrayHandler |
將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每一個元素就是這條記錄中的每一個字段的值 |
| ArrayListHandler |
將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。 |
| BeanHandler |
將結果集中第一條記錄封裝到一個指定的javaBean中。 |
| BeanListHandler |
將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中 |
| ColumnListHandler |
將結果集中指定的列的字段值,封裝到一個List集合中 |
| ScalarHandler |
它是用於單數據。例如select count(*) from 表操作。 |
| MapHandler |
將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據 |
| MapListHandler |
將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合 |
DBCP連接池
作用:自身維護了多個Connection連接對象維護
BasicDataSource類 是 DataSource接口的實現類
DataSource接口,它是java與每種數據庫連接池 連接的規范標准
DBCP連接池常見的配置
| 必須項 |
driverClassName |
數據庫驅動名稱 |
| url |
數據庫的地址 |
|
| username |
用戶名 |
|
| password |
密碼 |
|
| 基本項 |
maxActive |
最大連接數量 |
| initialSize |
連接池中初始化多少個Connection連接對象 |
|
| 擴展項 |
maxWait |
超時等待時間以毫秒為單位 1000等於1秒 |
