一、DBUtil介紹
DBUtil是什么及作用
DBUtil是Apache提供的一個開源的JDBC工具類庫,是java編程中數據庫操作實用工具,小巧簡單。
DBUtil封裝了對JDBC的操作,簡化了JDBC操作,可以讓我們少些代碼。
1.對數據表的讀操作
可以將結果轉換成List、Array、Set等集合。
2.對數據表的寫操作
只需要寫SQL語句
3.可以使用數據源,使用JNDI,數據庫連接池等技術來優化程序性能。
二、DBUtil的三個核心對象
QueryRunner類
QueryRunner中提供對sql語句的操作,主要有三個方法:
1.query()用於執行select操作
2.update()用於執行更新操作(insert、update、delete)
3.batch()批處理
ResultSetHandler接口
定義了執行select操作后如何封裝結果集
DBUtils類
是一個工具類,定義了關閉資源和事務處理的方法
1.QueryRunner類
構造函數:
QueryRunner有四個構造函數,這里主要講兩個
1)QueryRunner qr = new QueryRunner();
這個構造函數沒有參數,可以用於需要手動控制事務,在使用該對象調用方法時(query,update,batch),需要傳入Connection對象
2) QueryRunner qr = new QueryRunner(DataSource ds);
這個構造函數可以傳入一個數據源參數,它的事務是自動控制的(一個sql一個事務),在使用該對象調用方法時,不用再傳入Connection對象。
方法:query(),update(),batch()
下面寫幾個例子:
1)建數據表(這里我就用自己原有的數據表了)
2)創建項目導入jar包
3)代碼示例
1 public class TestQueryRunner { 2 3 // insert操作 4 @Test 5 public void testInsert() throws SQLException { 6 // 創建QueryRunner對象 7 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 8 qr.update("insert into user(username,password,email,birthday) values(?,?,?,?)", 9 "xiaoming","123456","xiaoming@163.com",new Date()); 10 } 11 12 // update操作 13 @Test 14 public void testUpdate() throws SQLException { 15 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 16 qr.update("update user set password = ? where username = ?","123123","xiaoming"); 17 18 } 19 20 // delete操作 21 @Test 22 public void testDelete() throws SQLException { 23 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 24 qr.update("delete from user where id = ?",9); 25 } 26 27 // select操作 28 @Test 29 public void testSelect() throws SQLException { 30 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 31 User user = qr.query("select * from user where username = ?", 32 new BeanHandler<User>(User.class),"xiaoming"); 33 System.out.println(user); 34 } 35 36 // batch操作(執行相同的sql語句) 37 @Test 38 public void testBatch() throws SQLException { 39 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 40 // 傳入一個二維數組,高維是需要執行的sql語句的次數,低維為需要給sql語句中?賦的值 41 Object[][] params = new Object[10][]; 42 for (int i = 0; i < params.length; i++) { 43 params[i] = new Object[] {"xiaoming","123456","xiaoming@163.com",new Date()}; 44 } 45 qr.batch("insert into user(username,password,email,birthday) values(?,?,?,?)",params ); 46 } 47 }
2.ResultSetHandler接口下的9個結果處理
1.ArrayHandler:取一條記錄,將該記錄中的每列值封裝到object[]數組中
1 public class TestResultSetHandler { 2 // ArrayHandler:取1條記錄,把該條記錄的每列值封裝到一個Object[]數組中(如果沒有指定取哪一條,默認取表中第一條) 3 @Test 4 public void testArrayHandler() throws SQLException { 5 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 6 Object[] objects = qr.query("select * from user where username = ?", 7 new ArrayHandler(),"xiaoming"); 8 for (Object object : objects) { 9 System.out.println(object); 10 } 11 } 12 }
輸出結果:
10
xiaoming
123123
xiaoming@163.com
2018-11-22 15:14:25
2.ArrayListHandler:取多條記錄,把每條記錄的每列值封裝到一個Object[]數組中,再將object[]放入List中
1 // ArrayListHandler:取多條記錄,把每條記錄的每列值封裝到一個Object[]數組中,再將object[]放入List中 2 @Test 3 public void testArrayListHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 List<Object[]> list = qr.query("select * from user", new ArrayListHandler()); 6 for (Object[] objects : list) { 7 for (Object object : objects) { 8 System.out.println(object); 9 } 10 System.out.println("------------------------"); 11 } 12 }
輸出結果:
2
jeery
123456
xm@163.com
2018-10-07 13:56:37
------------------------
3
tom
123456
xm@163.com
2018-10-07
------------------------
4
??OHUA
123
xm@163.com
2018-12-01
3.columnListHandler:取某一列的值,封裝到List中
1 // columnListHandler:取某一列的值,封裝到List中 2 @Test 3 public void testColumnListHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 List<Object> list = qr.query("select * from user", new ColumnListHandler(2));//2,指sql語句中查詢出來的列中的第二列 6 for (Object object : list) { 7 System.out.println(object); 8 } 9 }
輸出結果:
jeery
tom
??OHUA
4.keyedHandler:取多條記錄,每一條記錄封裝到一個map中,再將這個map封裝到另一個map中,key為指定的字段值。
1 // 4.keyedHandler:取多條記錄,每一條記錄封裝到一個map中,再將這個map封裝到另一個map中,key為指定的字段值。 2 @Test 3 public void testKeyedHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));//以第一列id的值為大map的key值 6 for (Map.Entry<Object, Map<String, Object>> bm : map.entrySet()) { 7 for (Map.Entry<String, Object> mm : bm.getValue().entrySet()) { 8 System.out.println(mm.getKey()+" "+mm.getValue()); 9 } 10 System.out.println("---------------------------"); 11 } 12 }
輸出結果:
birthday 2018-10-07 13:56:37
password 123456
id 2
email xm@163.com
username jeery
---------------------------
birthday 2018-10-07
password 123456
id 3
email xm@163.com
username tom
---------------------------
birthday 2018-12-01
password 123
id 4
email xm@163.com
username ??OHUA
---------------------------
5.mapHandler:取一條記錄,將記錄的列名和列值放到一個map中
1 // mapHandler:取一條記錄,將記錄的列名和列值放到一個map中 2 @Test 3 public void testMapHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 Map<String, Object> map = qr.query("select * from user", new MapHandler()); 6 for (Map.Entry<String, Object> m : map.entrySet()) { 7 System.out.println(m.getKey()+"\t"+m.getValue()); 8 } 9 10 }
輸出結果:
birthday 2018-10-07 13:56:37
password 123456
id 2
email xm@163.com
username jeery
6.MapListHandler:取多條記錄,把每條記錄封裝到map中,再將map封裝到List中
1 // MapListHandler:取多條記錄,把每條記錄封裝到map中,再將map封裝到List中 2 @Test 3 public void testMapListHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 List<Map<String,Object>> list = qr.query("select * from user", new MapListHandler()); 6 for (Map<String, Object> map : list) { 7 for (Map.Entry<String, Object> m : map.entrySet()) { 8 System.out.println(m.getKey()+"\t"+m.getValue()); 9 } 10 System.out.println("------------------------------"); 11 } 12 }
輸出結果:
birthday 2018-10-07 13:56:37
password 123456
id 2
email xm@163.com
username jeery
------------------------------
birthday 2018-10-07
password 123456
id 3
email xm@163.com
username tom
------------------------------
birthday 2018-12-01
password 123
id 4
email xm@163.com
username ??OHUA
------------------------------
7.ScalarHandler:取單行單列數據(一個單元格)
1 // ScalarHandler:取單行單列數據(一個單元格) 2 @Test 3 public void testScalarHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 Object count = qr.query("select count(*) from user", new ScalarHandler(1)); 6 System.out.println(count); 7 }
輸出結果:8
8.BeanHandler:取一條數據
1 // BeanHandler:取一條數據 2 @Test 3 public void testBeanHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 User user = qr.query("select * from user", new BeanHandler<User>(User.class)); 6 System.out.println(user); 7 }
輸出結果:
User [id=2, username=jeery, password=123456, email=xm@163.com, birthday=2018-10-07 13:56:37]
9.BeanListHandler:取多條數據
1 // BeanHandler:取一條數據 2 @Test 3 public void testBeanListHandler() throws SQLException { 4 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); 5 List<User> list = qr.query("select * from user", new BeanListHandler<User>(User.class)); 6 for (User user : list) { 7 System.out.println(user); 8 } 9 }
輸出結果:
User [id=2, username=jeery, password=123456, email=xm@163.com, birthday=2018-10-07 13:56:37]
User [id=3, username=tom, password=123456, email=xm@163.com, birthday=2018-10-07]
User [id=4, username=??OHUA, password=123, email=xm@163.com, birthday=2018-12-01]
User [id=5, username=??, password=123456, email=xm@163.com, birthday=2018-10-07 16:18:50]
User [id=6, username=??, password=123456, email=xm@163.com, birthday=2018-10-07 16:19:29]
User [id=7, username=125, password=12345, email=xm@163.com, birthday=2018-12-01]
User [id=8, username=142, password=321, email=xm@163.com, birthday=2018-12-01]
User [id=10, username=xiaoming, password=123123, email=xiaoming@163.com, birthday=2018-11-22 15:14:25]
3.DBUtils類
DBUtils中定義的一些方法
|
|
|
|
|
|
|
|