DButils工具類和連接池的使用


1. DButils工具類的介紹個三個核心類

   A: DButils工具類的介紹個三個核心類
   a: 概述
      DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用。
      DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼。
      DBUtils就是JDBC的簡化開發工具包。需要項目導入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。
   b: Dbutils三個核心功能介紹
     QueryRunner中提供對sql語句操作的API.
     update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
     query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操作
     ResultSetHandler接口,用於定義select操作后,怎樣封裝結果集.
     DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法

2. QueryRunner類的update方法介紹

     a: 方法介紹

     update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
     使用QueryRunner類,實現對數據表的insert delete update
     調用QueryRunner類的方法 update (Connection con,String sql,Object...param)
     Object...param 可變參數,Object類型,SQL語句會出現?占位符
     數據庫連接對象,自定義的工具類傳遞

   b. 代碼實現  

 1 /**
 2  * QueryRunner類
 3  * update(Connection conn, String sql, Object... params)
 4  * 實現表中數據的增、刪、改
 5  * @author vanguard
 6  *
 7  */
 8 public class QueryRunnerDemo {
 9     //獲取數據庫連接
10     private static Connection conn = JDBCUtils.getConnection();
11     
12     public static void main(String[] args) throws SQLException {
13         //insert();
14         //delete();
15         //update();
16     }
17     /**
18      * 使用QueryRunner類中的update方法,實現更新數據
19      * @throws SQLException
20      */
21     private static void update() throws SQLException {
22         //創建QueryRunner類對象
23         QueryRunner qr = new QueryRunner();
24         //定義更新的sql語句
25         String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";
26         ////將四個?占位符的實際參數寫在數組中
27         Object[] params = {"家居產品", 9000, "漲價了", 2};
28         ////調用QueryRunner類的方法update執行SQL語句
29         int row = qr.update(conn, sql, params);
30         System.out.println(row);
31         DbUtils.closeQuietly(conn);
32     }
33     /**
34      *  使用QueryRunner類中的update方法,實現添加數據
35      * @throws SQLException
36      */
37     private static void delete() throws SQLException {
38         //創建QueryRunner類對象
39         QueryRunner qr = new QueryRunner();
40         String sql = "DELETE FROM sort WHERE sid=?";
41         //調用QueryRunner類的方法update執行SQL語句
42         int row = qr.update(conn, sql, 7);
43         System.out.println(row);
44         DbUtils.closeQuietly(conn);
45     }
46     
47     /**
48      * 使用Q    ueryRunner類中的update方法,實現添加數據
49      * @throws SQLException
50      */
51     private static void insert() throws SQLException {
52         //創建QueryRunner類對象
53         QueryRunner qr = new QueryRunner();
54         String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES(?,?,?)";
55         //將三個?占位符的實際參數寫在數組中
56         Object[] params = {"體育用品", 200.98, "購買體育用品"};
57         //調用QueryRunner類的方法update執行SQL語句
58         int row = qr.update(conn, sql, params);
59         System.out.println(row);
60         DbUtils.closeQuietly(conn);
61     }
62 }

3. DBUtils工具類結果集處理的方式

   a: QueryRunner實現查詢操作
     query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操作
   b: 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集合

4. QueryRunner類的方法query
  a: QueryRunner類的方法query數據查詢操作
    調用QueryRunner類方法query(Connection con,String sql,ResultSetHandler r, Object..params)
    ResultSetHandler r 結果集的處理方式,傳遞ResultSetHandler接口實現類
    Object..params SQL語句中的?占位符
    注意: query方法返回值,返回的是T 泛型, 具體返回值類型,跟隨結果集處理方式變化

  b:代碼實現:   

  1 /**
  2  * 使用QueryRunner類中的
  3  * query(Connection conn, String sql, ResultSetHandler<T> rsh, 
  4  *                         Object... params)
  5  * 完成對數據的查詢操作
  6  * ResultSetHandler結果集處理類 8中處理結果集的方式
  7  *  ArrayHandler    將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每一個元素就是這條記錄中的每一個字段的值
  8  *  ArrayListHandler    將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。
  9  *  BeanHandler    將結果集中第一條記錄封裝到一個指定的javaBean中。
 10  *  BeanListHandler    將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
 11  *  ColumnListHandler    將結果集中指定的列的字段值,封裝到一個List集合中
 12  *  ScalarHandler    它是用於單數據。例如select count(*) from 表操作。
 13  *  MapHandler    將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據
 14  *  MapListHandler    將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合
 15  * @author vanguard
 16  *
 17  */
 18 public class QueryRunnerDmoe01 {
 19     private static Connection conn = JDBCUtils.getConnection();
 20     
 21     public static void main(String[] args) throws SQLException {
 22         //arrayHandler();
 23         //arrayListHandler();
 24         //beanHandler();
 25         //beanListHandler();
 26         //columnListHandler();
 27         //scalarHandler();
 28         //mapHandler();
 29         mapListHandler();
 30     }
 31     
 32     /**
 33      * 結果集處理的第八種方式MapListHandler
 34      * 將結果集的每一行結果封裝到Map集合中,Key 列名,Value 該列的數據
 35      * 將Map集合放到List集合中
 36      * @throws SQLException
 37      */
 38     private static void mapListHandler() throws SQLException {
 39         //創建QueryRunner類對象
 40         QueryRunner qr = new QueryRunner();
 41         //定義查詢的sql語句
 42         String sql = "SELECT * FROM sort";
 43         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
 44         List<Map<String, Object>> list = qr.query(conn, sql, new MapListHandler());
 45         //遍歷List集合
 46         for(Map<String, Object> map : list) {
 47             for(String row : map.keySet()) {
 48                 System.out.print(row + ":" + map.get(row) + "\t");
 49             }
 50             System.out.println();
 51         }
 52     }
 53 
 54     /**
 55      * 結果集處理的第七種方式MapHandler
 56      * 將結果集的第一行數據封裝到Map集合中 Key 列名 Value 該列數據
 57      * @throws SQLException
 58      */
 59     private static void mapHandler() throws SQLException {
 60         //創建QueryRunner類對象
 61         QueryRunner qr = new QueryRunner();
 62         //定義查詢的sql語句
 63         String sql = "SELECT * FROM sort";
 64         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
 65         Map<String, Object> map = qr.query(conn, sql, new MapHandler());
 66         for(String row : map.keySet()) {
 67             System.out.print(row + ":" + map.get(row) + "  ");
 68         }
 69     }
 70 
 71     /**
 72      * 結果集處理的第六種方式ScalarHandler
 73      * 它用於單數據,對於查詢后只有一個結果
 74      * @throws SQLException
 75      */
 76     private static void scalarHandler() throws SQLException {
 77         //創建QueryRunner類對象
 78         QueryRunner qr = new QueryRunner();
 79         //定義查詢的sql語句
 80         String sql = "SELECT COUNT(*) FROM sort";
 81         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
 82         long count = qr.query(conn, sql, new ScalarHandler<Long>());
 83         System.out.println(count);
 84     }
 85     
 86     /**
 87      * 結果集處理的第五種方式ColumnListHandler
 88      * 將結果集中指定列的字段值封裝到list集合中
 89      * @throws SQLException
 90      */
 91     private static void columnListHandler() throws SQLException {
 92         //創建QueryRunner類對象
 93         QueryRunner qr = new QueryRunner();
 94         //定義查詢的sql語句
 95         String sql = "SELECT * FROM sort";
 96         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
 97         List<String> list = qr.query(conn, sql, new ColumnListHandler<String>("sname"));
 98         for(String name : list) {
 99             System.out.println(name);
100         } 
101     }
102 
103     /**
104      * 結果集處理的第四種方式BeanListHandler
105      * 將結果集中每一條數據封裝到JavaBean對象中
106      * 將這些JavaBean對象放到list集合中
107      * @throws SQLException
108      */
109     private static void beanListHandler() throws SQLException {
110         //創建QueryRunner類對象
111         QueryRunner qr = new QueryRunner();
112         //定義查詢的sql語句
113         String sql = "SELECT * FROM sort";
114         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
115         List<Sort> list = qr.query(conn, sql, new BeanListHandler<Sort>(Sort.class));
116         //遍歷list集合
117         for(Sort s : list) {
118             System.out.println(s);
119         }
120     }
121 
122     /**
123      * 結果集處理的第三種方式BeanHandler
124      * 將結果集中的第一條數據封裝到JavaBean對象中
125      * 注意:被封裝成數據到JavaBean對象,Sort類中必須有空參構造
126      * @throws SQLException
127      */
128     private static void beanHandler() throws SQLException {
129         //創建QueryRunner類對象
130         QueryRunner qr = new QueryRunner();
131         //定義查詢的sql語句
132         String sql = "SELECT * FROM sort";
133         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
134         Sort s = qr.query(conn, sql, new BeanHandler<Sort>(Sort.class));
135         System.out.println(s);
136     }
137 
138     /**
139      * 結果集處理的第二種方式ArrayListHandler
140      * 將結果集的每一行封裝到Object[]數組中
141      * 將這些數組放到list集合中
142      * @throws SQLException
143      */
144     private static void arrayListHandler() throws SQLException {
145         //創建QueryRunner類對象
146         QueryRunner qr = new QueryRunner();
147         //定義查詢的sql語句
148         String sql = "SELECT * FROM sort";
149         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
150         List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
151         for(Object[] objs : list) {
152             for(Object obj : objs) {
153                 System.out.print(obj + "\t\t");
154             }
155             System.out.println();
156         }
157     }
158 
159     /**
160      * 結果集處理的第一種方式ArrayHandler
161      * 將結果集的第一行封裝到Object[]數組中
162      * @throws SQLException 
163      */
164     private static void arrayHandler() throws SQLException {
165         //創建QueryRunner類對象
166         QueryRunner qr = new QueryRunner();
167         //定義查詢的sql語句
168         String sql = "SELECT * FROM sort";
169         //調用query()執行查詢操作,傳遞連接對象,SQL語句,結果處理類方式的實現類
170         Object[] objects = qr.query(conn, sql, new ArrayHandler());
171         //遍歷數組
172         for(Object obj : objects) {
173             System.out.print(obj + "  ");
174         }
175     }
176 }
 1 public class Sort {
 2     private int sid;
 3     private String sname;
 4     private int sprice;
 5     private String sdesc;
 6     
 7     public Sort() {}
 8     
 9     public Sort(int sid, String sname, int sprice, String sdesc) {
10         super();
11         this.sid = sid;
12         this.sname = sname;
13         this.sprice = sprice;
14         this.sdesc = sdesc;
15     }
16 
17     public int getSid() {
18         return sid;
19     }
20 
21     public void setSid(int sid) {
22         this.sid = sid;
23     }
24 
25     public String getSname() {
26         return sname;
27     }
28 
29     public void setSname(String sname) {
30         this.sname = sname;
31     }
32 
33     public int getSprice() {
34         return sprice;
35     }
36 
37     public void setSprice(int sprice) {
38         this.sprice = sprice;
39     }
40 
41     public String getSdesc() {
42         return sdesc;
43     }
44 
45     public void setSdesc(String sdesc) {
46         this.sdesc = sdesc;
47     }
48 
49     @Override
50     public String toString() {
51         return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice
52                 + ", sdesc=" + sdesc + "]";
53     }
54     
55     
56 }

5. 連接池介紹
  1): 連接池介紹
    a: 連接池介紹
      實際上就是存放連接的池子(容器)
     在開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程
     為了解決此類性能問題,通常情況我們采用連接池技術,來共享連接Connection。
     這樣我們就不需要每次都創建連接、釋放連接了,這些操作都交給了連接池

 2): 連接池概念規范和DataSource接口
   a: 連接池概念規范
     用池來管理Connection,這樣可以重復使用Connection。
     不用自己來創建Connection,而是通過池來獲取Connection對象
     使用完Connection后,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池
     連接池技術可以完成Connection對象的再次利用
   b: DataSource接口
     Java為數據庫連接池提供了公共的接口:javax.sql.DataSource
     各個廠商需要讓自己的連接池實現這個接口。這樣應用程序可以方便的切換不同廠商的連接池
     常見的連接池:DBCP、C3P0

 3): DBCP連接池介紹
   a: DBCP連接池介紹
     DBCP也是一個開源的連接池,是Apache Common成員之一,在企業開發中也比較常見,tomcat內置的連接池

 4): 導入jar包
   a: jar包介紹
    mysql-connector-java-5.1.37-bin.jar:數據庫驅動
    commons-dbutils-1.6.jar:提供QueryRunner類方便進行增刪改查操作
    commons-dbcp-1.4.jar:
    commons-pool-1.5.6.jar:提供高效的數據庫連接池技術
  b: 導入jar包
    在項目根路徑下建立文件夾lib
    拷貝以上jar包,選定拷貝的jar包/右鍵/Build Path/Add to Build Path

 5): BasicDataSource類的使用
   a: 案例代碼

      

 1 /**
 2  * 連接池
 3  * 連接池jar包中定義好了一個類DataSource
 4  * 實現該類數據源的規范接口 javax.sql.DataSource
 5  * @author vanguard
 6  *
 7  */
 8 public class DataSourceDemo {
 9     public static void main(String[] args) {
10         //創建DataSource類接口的實現類對象
11         BasicDataSource datasource = new BasicDataSource();
12         //連接數據庫的四個基本信息可以通過setXXX方法設置
13         datasource.setDriverClassName("com.mysql.jdbc.Driver");
14         datasource.setUrl("jdbc:mysql://localhost:3306/mybase");
15         datasource.setUsername("root");
16         datasource.setPassword("root");
17         
18         //調用對象的方法獲取數據庫連接
19         try {
20             Connection conn = datasource.getConnection();
21             System.out.println(conn);
22         } catch (SQLException e) {
23             e.printStackTrace();
24             throw new RuntimeException("數據庫連接失敗");
25         }
26     }
27 }

 

 6): BasicDataSource類的常見配置
   a: 常見配置
     分類 屬性 描述
     必須項
      driverClassName 數據庫驅動名稱
      url 數據庫的地址
      username 用戶名
      password 密碼
   基本項(擴展)
      maxActive 最大連接數量
      minIdle 最小空閑連接
      maxIdle 最大空閑連接
      initialSize 初始化連接

 7): 實現數據庫連接池工具類
    a: 案例代碼
      

 1 /**
 2  *  使用DBCP實現數據庫的連接池
 3  *  連接池配置,自定義類,
 4  *  最基本四項完整
 5  *  對於數據庫連接池其他配置,自定義
 6  * @author vanguard
 7  *
 8  */
 9 public class JDBCPoolUtils {
10     //創建出BasicDataSource類對象
11     private static BasicDataSource datasource = new BasicDataSource();
12     
13     //靜態代碼塊,對BasicDataSource類進行配置
14     static {
15         //數據庫連接信息,必須的
16         datasource.setDriverClassName("com.mysql.jdbc.Driver");
17         datasource.setUrl("jdbc:mysql://localhost:3306/stdb");
18         datasource.setUsername("root");
19         datasource.setPassword("root");
20         //對象連接池中的連接數量配置,可選
21         datasource.setInitialSize(10);//初始化的連接數
22         datasource.setMaxActive(8);//最大的連接數
23         datasource.setMaxIdle(5);//最大空閑數
24         datasource.setMinIdle(2);//最小空閑數
25     }
26     /**
27      * 返回BasicDataSource類對象
28      * @return
29      */
30     public static DataSource getDataSource() {
31         return datasource;
32     }
33 }


 8): 工具類的測試
   a: 案例代碼

 1 /**
 2  * 測試寫好的工具類
 3  * 提供的是一個DataSource接口的數據源
 4  *  QueryRunner類構造方法,接收DataSource接口的實現類
 5  *  后面,調用方法update,query,無需傳遞他們Connection連接對象
 6  * @author vanguard
 7  *
 8  */
 9 public class QueryRunnerDemo {
10     private static QueryRunner qr = new QueryRunner(JDBCPoolUtils.getDataSource());
11     
12     public static void main(String[] args) {
13         //insert();
14         select();
15     }
16     /**
17      * 定義查詢數據的方法
18      */
19     private static void select() {
20         String sql = "SELECT * FROM sort";
21         try {
22             List<Object[]> list = qr.query(sql, new ArrayListHandler());
23             for(Object[] objs : list) {
24                 for(Object obj : objs) {
25                     System.out.print(obj + "\t");
26                 }
27                 System.out.println();
28             }
29         } catch (SQLException e) {
30             
31             e.printStackTrace();
32             throw new RuntimeException("數據庫查詢失敗");
33         }
34     }
35 
36     /**
37      * 定義添加數據的方法
38      */
39     private static void insert() {
40         String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES(?,?,?)";
41         Object[] params = {"水果", 20.5, "桃子便宜了"};
42         try {
43             int row = qr.update(sql, params);
44             System.out.println(row);
45         } catch (SQLException e) {
46             
47             e.printStackTrace();
48             throw new RuntimeException("數據添加失敗");
49         }
50     }
51 }

 


免責聲明!

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



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