java--DBUtils和鏈接池

DBUtils

1、DBUtils的使用

      DBUtils就是JDBC的簡化開發工具包須要項目導入commons-dbutils-1.6.jar纔可以正常使用DBUtils工具。若是隻使用JDBC進行開發,咱們會發現冗餘代碼過多,爲了簡化JDBC開發,本案例咱們講採用apache commons組件一個成員:DBUtils。html

 

2、DBUtils概述

DBUtilsjava編程中的數據庫操做實用工具,小巧簡單實用。DBUtils封裝了對JDBC的操做,簡化了JDBC操做,能夠少寫代碼。java

Dbutils三個核心功能介紹:mysql

  1.QueryRunner中提供對sql語句操做的API.sql

  2.ResultSetHandler接口,用於定義select操做後,怎樣封裝結果集.數據庫

  3. DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法apache

3、QueryRunner核心類

1.update(Connection conn, String sql, Object... params) ,用來完成表數據的增長、刪除、更新操做編程

2.query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操做數組

4、QueryRunner實現添加、更新、刪除操做

 //添加
    public void addProduct() throws SQLException{
        Connection conn=JDBCUtils.getConn();
        QueryRunner qr=new QueryRunner();
        String sql="insert into product(pid,pname) values(?,?)";
        Object[] obj={"1234567","iphoneXS"};
        qr.update(conn, sql,obj);
        DbUtils.closeQuietly(conn);
    }
//刪除
    public void deleteProduct() throws SQLException{
        Connection conn=JDBCUtils.getConn();
        QueryRunner qr=new QueryRunner();
        String sql="delete from product where pname=? ";
        Object[] obj={"qwdqw"};
        qr.update(conn,sql, obj);
        DbUtils.closeQuietly(conn);
    }
//更新
    public void editProduct() throws SQLException{
        Connection conn=JDBCUtils.getConn();
        QueryRunner qr=new QueryRunner();
        String sql="update product set pname=? where pid=?";
        Object[] obj={"vivoX10","1234567"};
        qr.update(conn, sql,obj);
        DbUtils.closeQuietly(conn);
    }    

5、QueryRunner實現查詢操做

ResultSetHandler結果集處理類oracle

ArrayHandleriphone

將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每個元素就是這條記錄中的每個字段的值

ArrayListHandler

將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。

BeanHandler

將結果集中第一條記錄封裝到一個指定的javaBean中。javabean就是類

BeanListHandler

將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中

ColumnListHandler

將結果集中指定的列的字段值,封裝到一個List集合中

ScalarHandler

它是用於單數據。例如select count(*) from 表操做。

MapHandler

將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據

MapListHandler

將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合

 

注:JavaBean就是一個類,在開發中經常使用封裝數據。具備以下特性

  1. 須要實現接口:java.io.Serializable ,一般實現接口這步驟省略了,不會影響程序。
  2. 提供私有字段:private 類型 字段名;
  3. 提供getter/setter方法:
  4. 提供無參構造

代碼實現: 

 1    //ArrayHandler
 2     //將結果集中的第一行數據封裝到Object[]中
 3     public void select1() throws SQLException{
 4         Connection conn=JDBCUtils.getConn();
 5         QueryRunner qr=new QueryRunner();
 6         String sql="select * from product";
 7         Object[] obj=qr.query(conn,sql, new ArrayHandler());
 8         for(Object o:obj){
 9             System.out.println(o);
10         }
11         DbUtils.closeQuietly(conn);
12     }
13     //ArrayListHandler
14     //將結果集中的每一行都封裝到Object[]中,而後將每個Object數組封裝到一個List集合中
15     public void select2() throws SQLException{
16         Connection conn=JDBCUtils.getConn();
17         QueryRunner qr=new QueryRunner();
18         String sql="select * from product";
19         List<Object[]> list=qr.query(conn,sql, new ArrayListHandler());
20         for(Object[] obj:list){
21             for(Object o:obj){
22                 System.out.println(o+"\t");
23             }
24             System.out.println();
25         }
26         DbUtils.closeQuietly(conn);
27     }
28     //BeanHandler
29     //前提:JavaBean必須有空參構造和set方法
30     //將結果集中的第一條記錄封裝到指定的JavaBean中
31     public void select3() throws SQLException{
32         QueryRunner qr=new QueryRunner();
33         Connection conn=JDBCUtils.getConn();
34         String sql="select * from product";
35         Product product=qr.query(conn, sql,new BeanHandler<Product>(Product.class));
36         System.out.println(product);
37         DbUtils.closeQuietly(conn);
38     }
39     //BeanListHandler
40     //將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
41     public void select4() throws SQLException{
42         QueryRunner qr=new QueryRunner();
43         Connection conn=JDBCUtils.getConn();
44         String sql="select * from product";
45         List<Product> list=qr.query(conn, sql,new BeanListHandler<Product>(Product.class));
46         for(Product p:list){
47             System.out.println(p);
48         }
49         DbUtils.closeQuietly(conn);
50     }
51     //ColumnListHandler
52     //將結果集中指定的列的字段值,封裝到一個List集合中
53     public void select5()throws SQLException{
54         QueryRunner qr=new QueryRunner();
55         Connection conn=JDBCUtils.getConn();
56         String sql="select * from product";
57         List<String> list=qr.query(conn, sql,new ColumnListHandler<String>("pname"));
58         for(String s:list){
59             System.out.println(s);
60         }
61         DbUtils.closeQuietly(conn);
62     }
63     //ScalarHandler
64     //它是用於單數據。例如select count(*) from 表操做。
65     public void select6()throws SQLException{
66         QueryRunner qr=new QueryRunner();
67         Connection conn=JDBCUtils.getConn();
68         String sql="select count(*) from product";
69         Long count=qr.query(conn, sql,new ScalarHandler<Long>());
70         System.out.println(count);
71         DbUtils.closeQuietly(conn);
72     }
73     //MapHandler
74     //將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據
75     public void select7()throws SQLException{
76         QueryRunner qr=new QueryRunner();
77         Connection conn=JDBCUtils.getConn();
78         String sql="select count(*) from product";
79         Map<String,Object> map=qr.query(conn, sql,new MapHandler());
80         Set<Map.Entry<String,Object>> set=map.entrySet();
81         for(Map.Entry<String,Object> entry: set){
82             System.out.println(entry.getKey()+"..."+entry.getValue());
83         }
84         DbUtils.closeQuietly(conn);
85     }
86     //MapListHandler
87     //將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合
88     public void select8()throws SQLException{
89         QueryRunner qr=new QueryRunner(DButils.getDataSource());
90         //Connection conn=JDBCUtils.getConn();
91         String sql="select count(*) from product";
92         List<Map<String,Object>> list=qr.query(sql,new MapListHandler());
93         for(Map<String,Object> map:list){
94             Set<Map.Entry<String,Object>> set=map.entrySet();
95             for(Map.Entry<String,Object> entry: set){
96                 System.out.println(entry.getKey()+"..."+entry.getValue());
97             }
98         }
99     }

  

鏈接池 

1、鏈接池概述

  用池來管理Connection,這樣能夠重複使用Connection。有了池,因此咱們就不用本身來建立Connection,而是經過池來獲取Connection對象。當使用完Connection後,調用Connectionclose()方法也不會真的關閉Connection,而是把Connection「歸還」給池。池就能夠再利用這個Connection對象了。

 

規範:

Java爲數據庫鏈接池提供了公共的接口:javax.sql.DataSource,各個廠商須要讓本身的鏈接池實現這個接口。這樣應用程序能夠方便的切換不一樣廠商的鏈接池!

常見的鏈接池:DBCPC3P0 

2、DBCP鏈接池

1.使用:導包

 2.編寫工具類

 1 package com.oracle.tools;
 2 
 3 import java.sql.Connection;
 4 import java.sql.SQLException;
 5 
 6 import javax.sql.DataSource;
 7 
 8 import org.apache.commons.dbcp.BasicDataSource;
 9 
10 
11 public class DButils {
12     public static final String DRIVER = "com.mysql.jdbc.Driver";
13     public static final String URL = "jdbc:mysql://localhost:3306/bank";
14     public static final String USERNAME = "root";
15     public static final String PASSWORD = "123456";
16     /*
17      * 建立鏈接池BasicDataSource
18      */
19     public static BasicDataSource dataSource = new BasicDataSource();
20     public static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();
21     //靜態代碼塊
22     static {
23         //對鏈接池對象 進行基本的配置
24         dataSource.setDriverClassName(DRIVER); // 這是要鏈接的數據庫的驅動
25         dataSource.setUrl(URL); //指定要鏈接的數據庫地址
26         dataSource.setUsername(USERNAME); //指定要鏈接數據的用戶名
27         dataSource.setPassword(PASSWORD); //指定要鏈接數據的密碼
28     }
29     /*
30      * 返回鏈接池對象
31      */
32     //獲取當前線程上的鏈接
33     public static Connection getCurrentConnection(){
34         Connection conn=tl.get();
35         if(conn==null){
36             conn=getConn();
37             tl.set(conn);
38         }
39         return conn;
40     }
41     //開啓事務的方法
42     public static void start(){
43         try {
44             getCurrentConnection().setAutoCommit(false);
45         } catch (SQLException e) {
46             // TODO Auto-generated catch block
47             e.printStackTrace();
48         }
49     }
50     //提交事務的方法
51     public static void commit(){
52         try {
53             getCurrentConnection().commit();
54         } catch (SQLException e) {
55             // TODO Auto-generated catch block
56             e.printStackTrace();
57         }
58     }
59     //回滾事務方法
60     public static void rollback(){
61         try {
62             getCurrentConnection().rollback();
63         } catch (SQLException e) {
64             // TODO Auto-generated catch block
65             e.printStackTrace();
66         }
67     }
68     //從鏈接池裏獲取一個新鏈接
69     public static DataSource getDataSource(){
70         return dataSource;
71     }
72     public static Connection getConn(){
73         Connection conn=null;
74         try {
75              conn=dataSource.getConnection();
76         } catch (SQLException e) {
77             // TODO Auto-generated catch block
78             e.printStackTrace();
79         }
80         return conn;
81     }
82 }

 

 3.測試:

 1 //MapListHandler
 2     //將結果集第一行封裝到Map集合中,Key 列名, Value 該列數據,Map集合存儲到List集合
 3     public void select8()throws SQLException{
 4         QueryRunner qr=new QueryRunner(DButils.getDataSource());//有參構造
 5         //Connection conn=JDBCUtils.getConn();
 6         String sql="select count(*) from product";
 7         List<Map<String,Object>> list=qr.query(sql,new MapListHandler());
 8         for(Map<String,Object> map:list){
 9             Set<Map.Entry<String,Object>> set=map.entrySet();
10             for(Map.Entry<String,Object> entry: set){
11                 System.out.println(entry.getKey()+"..."+entry.getValue());
12             }
13         }
14     }

 

4.常見配置項(瞭解)

參考文檔:http://commons.apache.org/proper/commons-dbcp/configuration.html

分類

屬性

描述

必須項

driverClassName

數據庫驅動名稱

url

數據庫的地址

username

用戶名

password

密碼

基本項(擴展)

maxActive

最大鏈接數量

minIdle

最小空閒鏈接

maxIdle

最大空閒鏈接

initialSize

鏈接池中初始化多少個Connection鏈接對象

 

擴展項

maxWait

超時等待時間以毫秒爲單位 1000等於1

相關文章
相關標籤/搜索