Dbutils學習(介紹和入門)


一:Dbutils是什么?(當我們很難理解一個東西的官方解釋的時候,就讓我們記住它的作用)
     Dbutils:主要是封裝了JDBC的代碼,簡化dao層的操作。
     作用:幫助java程序員,開發Dao層代碼的簡單框架。
          框架的作用:幫助程序員,提高程序的開發效率。
     出生:Dbutils是由Apache公司提供。
 
二:為什么需要Dbutils ?
     在使用Dbutils 之前,我們Dao層使用的技術是JDBC,那么分析一下JDBC的弊端:
          (1)數據庫鏈接對象、sql語句操作對象,封裝結果集對象,這三大對象會重復定義
          (2)封裝數據的代碼重復,而且操作復雜,代碼量大
          (3)釋放資源的代碼重復
               結果:(1)程序員在開發的時候,有大量的重復勞動。(2)開發的周期長,效率低
 
三:Dbutils三個核心類介紹:
     1:DbUtils:連接數據庫對象----jdbc輔助方法的集合類,線程安全
          構造方法:DbUtils()
          作用:控制連接,控制書屋,控制驅動加載額一個類。
     
     2:QueryRunner:SQL語句的操作對象,可以設置查詢結果集的封裝策略,線程安全。
          構造方法:
          (1)QueryRunner():創建一個與數據庫無關的QueryRunner對象,后期再操作數據庫的會后,需要手動給一個Connection對象,它可以手動控制事務。
                    Connection.setAutoCommit(false);     設置手動管理事務
                    Connection.commit();     提交事務
 
          (2)QueryRunner(DataSource ds):創建一個與數據庫關聯的queryRunner對象,后期再操作數據庫的時候,不需要Connection對象,自動管理事務。
                    DataSource:數據庫連接池對象。
 
          構造函數與增刪改查方法的組合:
     QueryRunner()
           update(Connection conn, String sql, Object... params)
           query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
 
     QueryRunner(DataSource ds)     
           update(String sql, Object... params)
           query(String sql, ResultSetHandler<T> rsh, Object... params)
 
(3)ResultSetHandle:封裝數據的策略對象------將封裝結果集中的數據,轉換到另一個對象
          策略:封裝數據到對象的方式(示例:將數據庫保存在User、保存到數組、保存到集合)
     方法介紹:handle(ResultSet rs)
          備注:詳解參考ResultSetHandle實現類
 
四:Dbutils快速入門
     使用Dbutils注意事項:
          (1)需要導入的jar包:①MySql驅動     ②c3p0包     ③DbUtils包
          (2)添加c3p0配置文件
          (3)可以自行添加一個JDBCUtils工具類:用來獲取c3p0連接池對象
 
c3p0-config.xml
<? xml version ="1.0" encoding= "UTF-8" ?>
 1 <? xml version ="1.0" encoding= "UTF-8" ?>
 2 < c3p0-config>
 3        <!-- 默認配置,c3p0框架默認加載這段默認配置 -->
 4        < default-config>
 5              <!-- 配置JDBC 四個基本屬性 -->
 6              < property name ="driverClass" > com.mysql.jdbc.Driver</ property >
 7              < property name ="jdbcUrl" > jdbc:mysql:///數據庫名</ property >
 8              < property name ="user" > 數據庫用戶名</ property >
 9              < property name ="password" > 數據庫密碼</ property >
10        </ default-config> <!-- This app is massive! -->
11 </ c3p0-config>

 

 
JDBCUtils. java
 
 1 package cn.utils;
 2 
 3 import java.sql.Connection;
 4 import java.sql.SQLException;
 5 
 6 import javax.sql.DataSource;
 7 
 8 import com.mchange.v2.c3p0.ComboPooledDataSource;
 9 
10 public class JDBCUtils {
11 
12     // 獲得c3p0連接池對象
13     private static ComboPooledDataSource ds = new ComboPooledDataSource();
14 
15     /**
16      * 獲得數據庫連接對象
17      *
18      * @return
19      * @throws SQLException
20      */
21     public static Connection getConnection() throws SQLException {
22         return ds.getConnection();
23     }
24 
25     /**
26      * 獲得c3p0連接池對象
27      * @return
28      */
29     public static DataSource getDataSource() {
30         return ds;
31     }
32 }

 

 
 
 
     案例一:使用queryRunner對象完成增刪改操作:
 
     1:數據表
 
 1 drop database if exists jdbc;
 2 CREATE DATABASE IF NOT EXISTS jdbc;
 3 USE jdbc;
 4  
 5 drop table if exists user ;
 6 CREATE TABLE IF NOT EXISTS `user ` (
 7   `id` int(11) NOT NULL AUTO_INCREMENT,
 8   ` name` varchar(50) DEFAULT NULL ,
 9   `pwd` varchar(50) DEFAULT NULL ,
10   PRIMARY KEY (`id`)
11 ) ;
12 #數據初始化
13 insert into user values (null ,'zhangsan' ,'123456' );
14 insert into user values (null ,'lisi' ,'123456' );

 

 
     2:演示代碼
 
 1 //需求:向user表插入一條數據
 2  
 3 @Test
 4  
 5 public void test1(){
 6  
 7 //第一步:創建queryRunner對象,用來操作sql語句
 8  
 9 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
10  
11 //第二步:創建sql語句
12  
13 String sql = "insert into user values(null,?,?)";
14  
15 //第三步:執行sql語句,params:是sql語句的參數
16  
17 //注意,給sql語句設置參數的時候,按照user表中字段的順序
18  
19 try {
20  
21 int update = qr.update(sql, "狗蛋","123456");
22  
23 System.out.println(update);
24  
25 } catch (SQLException e) {
26  
27 e.printStackTrace();
28  
29 }
30  
31 }
32  
33 //需求:修改id==7的數據
34  
35 @Test
36  
37 public void test2(){
38  
39 //第一步:創建queryRunner對象,用來操作sql語句
40  
41 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
42  
43 //第二步:創建sql語句
44  
45 String sql = "update user set name = ? where id = ?";
46  
47 //第三步:執行sql語句,params:是sql語句的參數
48  
49 //注意,給sql語句設置參數的時候,按照user表中字段的順序
50  
51 try {
52  
53 int update = qr.update(sql, "柳岩",7);
54  
55 System.out.println(update);
56  
57 } catch (SQLException e) {
58  
59 e.printStackTrace();
60  
61 }
62  
63 }
64  
65 //需求:刪除id==7的數據
66  
67 @Test
68  
69 public void test3(){
70  
71 //第一步:創建queryRunner對象,用來操作sql語句
72  
73 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
74  
75 //第二步:創建sql語句
76  
77 String sql = "delete from user where id = ?";
78  
79 //第三步:執行sql語句,params:是sql語句的參數
80  
81 //注意,給sql語句設置參數的時候,按照user表中字段的順序
82  
83 try {
84  
85 int update = qr.update(sql, 7);
86  
87 System.out.println(update);
88  
89 } catch (SQLException e) {
90  
91 e.printStackTrace();
92  
93 }
94  
95 }
96  

 

     案例二:QueryRunner的query方法和ResultSetHandler接口的使用
     
     1:數據庫表
          同上一案例User表
     
     2:自定義實現ResultSetHandler封裝查詢結果集
          自定義策略
 
 1 package cn.handler;
 2  
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7  
 8 import org.apache.commons.dbutils.ResultSetHandler;
 9  
10 import cn.itcast.domain.User;
11 // ResultSetHandler<T>,<T>表示封裝結果的類型
12 //MyHandler 是自定義的ResultSetHandler封裝結果集策略對象
13 public class MyHandler implements ResultSetHandler<List<User>>{
14  
15    @Override
16    public List<User> handle(ResultSet rs) throws SQLException {
17       // 封裝數據,數據從 Resultset 中獲取
18       List<User> list = new ArrayList<User>();
19        while(rs.next()){
20          User u = new User();
21          u.setId(rs.getInt( "id"));
22          u.setName(rs.getString( "name"));
23          u.setPwd(rs.getString( "pwd"));
24  
25          list.add(u);
26       }
27        return list;
28    }
29  
30 }
31  

 

     3:測試代碼
 
 1 //需求:獲取user表中所有的數據
 2  
 3 @Test
 4  
 5 public void test4(){
 6  
 7 //第一步:創建queryRunner對象,用來操作sql語句
 8  
 9 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
10  
11 //第二步:創建sql語句
12  
13 String sql = "select * from user";
14  
15 //第三步:執行sql語句,params:是sql語句的參數
16  
17 //注意,給sql語句設置參數的時候,按照user表中字段的順序
18  
19 try {
20  
21 List<User> list = qr.query(sql, new MyHandler());
22  
23 System.out.println(list);
24  
25 } catch (SQLException e) {
26  
27 e.printStackTrace();
28  
29 }
30  
31 }

 

 
案例三:ResultSetHandler實現類介紹(由DbUtils框架提供)
     備注:DbUtils給我們提供了10個ResultSetHandler實現類,分別是:
      ArrayHandler:     將查詢結果的第一行數據,保存到Object數組中
      ② ArrayListHandler     將查詢的結果,每一行先封裝到Object數組中,然后將數據存入List集合
      ③ BeanHandler     將查詢結果的第一行數據,封裝到user對象
     ④ BeanListHandler     將查詢結果的每一行封裝到user對象,然后再存入List集合
     ⑤ ColumnListHandler     將查詢結果的指定列的數據封裝到List集合中
     ⑥ MapHandler     將查詢結果的第一行數據封裝到map結合(key==列名,value==列值)
     ⑦ MapListHandler     將查詢結果的每一行封裝到map集合 (key==列名,value==列值),再將map集合存入List集合
     ⑧ BeanMapHandler     將查詢結果的每一行數據,封裝到User對象,再存入mao集合中 (key==列名,value==列值)
     ⑨ KeyedHandler     將查詢的結果的每一行數據,封裝到map1( key==列名,value==列值 ),然后將map1集合(有多個)存入map2集合(只有一個)
     ⑩ ScalarHandler     封裝類似count、avg、max、min、sum......函數的執行結果
 
 
    以上10個ResultSetHandler實現類,常用的是BeanHandler、BeanListHandler和ScalarHandler,下面將對這三個實現類,寫測試類
     
    一: 測試BeanHandler策略
 
 1 //需求:測試BeanHandler策略
 2  
 3 //BeanHandler:將查詢結果的第一行數據,封裝到user對象
 4  
 5 @Test
 6  
 7 public void test7(){
 8  
 9 //第一步:創建queryRunner對象,用來操作sql語句
10  
11 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
12  
13 //第二步:創建sql語句
14  
15 String sql = "select * from user";
16  
17 //第三步:執行sql語句,params:是sql語句的參數
18  
19 //注意,給sql語句設置參數的時候,按照user表中字段的順序
20  
21 try {
22  
23 User user = qr.query(sql, new BeanHandler<User>(User.class));
24  
25 System.out.println(user);
26  
27 } catch (SQLException e) {
28  
29 e.printStackTrace();
30  
31 }
32  
33 }

 

 
     二:測試BeanListHandler策略
 
 1 //需求:測試BeanListHandler策略
 2  
 3 //BeanListHandler:將查詢結果的每一行封裝到user對象,然后,再存入list集合
 4  
 5 @Test
 6  
 7 public void test8(){
 8  
 9 //第一步:創建queryRunner對象,用來操作sql語句
10  
11 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
12  
13 //第二步:創建sql語句
14  
15 String sql = "select * from user";
16  
17 //第三步:執行sql語句,params:是sql語句的參數
18  
19 //注意,給sql語句設置參數的時候,按照user表中字段的順序
20  
21 try {
22  
23 List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
24  
25 System.out.println(list);
26  
27 } catch (SQLException e) {
28  
29 e.printStackTrace();
30  
31 }
32  
33 }
34  

 

     三:測試ScalarHandler策略
 
 1 //需求:測試ScalarHandler策略
 2  
 3 //ScalarHandler:封裝類似count、avg、max、min、sum。。。。函數的執行結果
 4  
 5 @Test
 6  
 7 public void test14(){
 8  
 9 //第一步:創建queryRunner對象,用來操作sql語句
10  
11 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
12  
13 //第二步:創建sql語句
14  
15 String sql = "select count(*) from user";
16  
17 //第三步:執行sql語句,params:是sql語句的參數
18  
19 //注意,給sql語句設置參數的時候,按照user表中字段的順序
20  
21 try {
22  
23 Object object = qr.query(sql, new ScalarHandler());
24  
25 System.out.println(object);
26  
27 } catch (SQLException e) {
28  
29 e.printStackTrace();
30  
31 }
32  
33 }

 

 
以上三個有測試案例的ResultSetHandler策略為常用實現類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM