1. 程式人生 > >Dbutils學習(介紹和入門)

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 }