1. 程式人生 > >Java基礎學習筆記二十七 DBUtils和連接池

Java基礎學習筆記二十七 DBUtils和連接池

ride 基本 代碼塊 ear 不同 一行 ria 靜態方法 ...

DBUtils

如果只使用JDBC進行開發,我們會發現冗余代碼過多,為了簡化JDBC開發,本案例我們講采用apache commons組件一個成員:DBUtils。DBUtils就是JDBC的簡化開發工具包。需要項目導入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。

DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用。

DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼。

Dbutils三個核心功能介紹

  • QueryRunner中提供對sql語句操作的API
  • ResultSetHandler接口,用於定義select操作後,怎樣封裝結果集
  • DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法

QueryRunner核心類

update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數據的查詢操作

QueryRunner實現添加、更新、刪除操作

update(Connection conn, String sql, Object... params) ,用來完成表數據的增加、刪除、更新操作

增刪改代碼演示:

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * Created by Administrator on 2017/7/20.
 */
public class Demo01 {
    //添加
    public void insert() {
        try {
            //獲取一個用來執行SQL語句的對象 QueryRunner
QueryRunner qr = new QueryRunner(); String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)"; Object[] params = {"股票收入", 5500, "收入"}; Connection conn = JDBCUtils0.getConnection(); int line = qr.update(conn, sql, params);// 用來完成表數據的增加、刪除、更新操作 //結果集處理 System.out.println("line = " + line); } catch (SQLException e) { throw new RuntimeException(e); } } //更新 public void update() { try { //創建一個QueryRunner對象,用來完成SQL語句的執行 QueryRunner qr = new QueryRunner(); //執行SQL語句 String sql = "UPDATE zhangwu SET money = money+1000 WHERE name=?"; Object[] params = {"股票收入"}; Connection conn = JDBCUtils0.getConnection(); int line = qr.update(conn, sql, params); //結果集的處理 System.out.println("line=" + line); } catch (SQLException e) { throw new RuntimeException(e); } } //刪除 public void delete() { try { //創建一個QueryRunner對象,用來完成SQL語句的執行 QueryRunner qr = new QueryRunner(); //執行SQL語句 String sql = "DELETE FROM zhangwu WHERE name = ?"; Object[] params = {"股票收入"}; Connection conn = JDBCUtils0.getConnection(); int line = qr.update(conn, sql, params); //結果集的處理 System.out.println("line=" + line); } catch (SQLException e) { throw new RuntimeException(e); } } }
JDBCUtils0類:
package jdbc;
/*
 *  實現JDBC的工具類
 *  定義方法,直接返回數據庫的連接對象
 *
 *  寫關閉方法
 */

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils0 {
    private JDBCUtils0(){}
    private static Connection con ;

    static{
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mybase";
            String username="root";
            String password="123456";
            con = DriverManager.getConnection(url, username, password);
        }catch(Exception ex){
            throw new RuntimeException(ex+"數據庫連接失敗");
        }
    }

    /*
     * 定義靜態方法,返回數據庫的連接對象
     */
    public static Connection getConnection(){
        return con;
    }


    public static void close(Connection con,Statement stat){

        if(stat!=null){
            try{
                stat.close();
            }catch(SQLException ex){}
        }

        if(con!=null){
            try{
                con.close();
            }catch(SQLException ex){}
        }

    }


    public static void close(Connection con,Statement stat , ResultSet rs){
        if(rs!=null){
            try{
                rs.close();
            }catch(SQLException ex){}
        }

        if(stat!=null){
            try{
                stat.close();
            }catch(SQLException ex){}
        }

        if(con!=null){
            try{
                con.close();
            }catch(SQLException ex){}
        }

    }
}

QueryRunner實現查詢操作

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

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集合

JavaBean

JavaBean就是一個類,在開發中常用封裝數據。具有如下特性

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

/*
* 賬務類
*/
public class ZhangWu {
    private int id;
    private String name;
    private double money;
    private String parent;

    public ZhangWu() {
        super();
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public String getParent() {
        return parent;
    }
    public void setParent(String parent) {
        this.parent = parent;
    }

    @Override
    public String toString() { //該方法可以省略
        return "ZhangWu [id=" + id + ", name=" + name + ", money=" + money + ", parent=" + parent + "]";
    }
}

ArrayHandler與ArrayListHandler查詢

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

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;

public class ArrayHandlerDemo {
    public void method(){
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();
            //執行SQL語句
            String sql = "SELECT * FROM zhangwu";
            Object[] params = {};
            Connection conn = JDBCUtils0.getConnection();
            Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
            //結果集的處理
            System.out.println( Arrays.toString(objArray) );
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
//[1, 吃飯支出, 247.0]

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

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

public class ArrayListHandlerDemo {
    public void method() {
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();
            //執行SQL語句
            String sql = "SELECT * FROM zhangwu WHERE zmoney>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils0.getConnection();
            List<Object[]> list = qr.query(conn, sql, new ArrayListHandler(), params);
            //結果集的處理
            for (Object[] objArray : list) {
                System.out.println(Arrays.toString(objArray));
            }

            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
//[2, 工資收入, 12345.0]
//[5, 股票收入, 8000.0]
//[6, 打麻將支出, 8000.0]
//[7, null, 5000.0]

BeanHandler與BeanListHandler查詢

BeanHandler :將結果集中第一條記錄封裝到一個指定的javaBean中。

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import java.sql.Connection;
import java.sql.SQLException;

public class BeanHandlerDemo {
    public void method() {
        try {
            //獲取QueryRunner
            QueryRunner qr = new QueryRunner();
            //執行SQL語句
            String sql = "SELECT * FROM zhangwu WHERE id=?";
            Object[] params = {1};
            Connection conn = JDBCUtils0.getConnection();
            ZhangWu zw = qr.query(conn, sql, new BeanHandler<ZhangWu>(ZhangWu.class), params);
            //結果集處理
            System.out.println(zw);

            conn.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

//ZhangWu [id=1, name=null, money=0.0, parent=null]

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

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class BeanListHandlerDemo {
    public void method() {
        try {
            //獲取QueryRunner
            QueryRunner qr = new QueryRunner();
            //執行SQL語句
            String sql = "SELECT * FROM zhangwu WHERE zmoney>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils0.getConnection();
            List<ZhangWu> list = qr.query(conn, sql, new BeanListHandler<ZhangWu>(ZhangWu.class), params);
            //結果集處理
            for (ZhangWu zw : list) {
                System.out.println(zw);
            }

            conn.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

//ZhangWu [id=2, name=null, money=0.0, parent=null]
//ZhangWu [id=5, name=null, money=0.0, parent=null]
//ZhangWu [id=6, name=null, money=0.0, parent=null]
//ZhangWu [id=7, name=null, money=0.0, parent=null]

ColumnListHandler與ScalarHandler查詢

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

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ColumnListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class ColumnListHandlerDemo {
    public void method(){
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();
            //執行SQL語句
            String sql = "SELECT zname FROM zhangwu WHERE zmoney>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils0.getConnection();
            List<String> list = qr.query(conn, sql, new ColumnListHandler<String>(), params);
            //結果集的處理
            for (String str : list) {
                System.out.println(str);
            }

            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

//工資收入
//股票收入
//打麻將支出
//null

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

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;

public class ScalarHandlerDemo {
    public void method(){
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();

            //執行SQL語句
            String sql = "SELECT MAX(zmoney) FROM zhangwu";
            Object[] params = {};
            Connection conn = JDBCUtils0.getConnection();
            Double max = qr.query(conn, sql, new ScalarHandler<Double>(), params);
            //結果集的處理
            System.out.println("max=" + max);

            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

//max=12345.0

連接池

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

用池來管理Connection,這樣可以重復使用Connection。有了池,所以我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection後,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。池就可以再利用這個Connection對象了。

Java為數據庫連接池提供了公共的接口:javax.sql.DataSource,各個廠商需要讓自己的連接池實現這個接口。這樣應用程序可以方便的切換不同廠商的連接池!
常見的連接池:DBCP、C3P0。
接下來,我們就詳細的學習一下DBCP連接池。

DBCP連接池

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

  • 導入jar包 commons-dbcp-1.4.jar
  • 編寫工具類

連接數據庫表的工具類, 采用DBCP連接池的方式來完成,Java中提供了一個連接池的規則接口 :
DataSource :它是java中提供的連接池,作為 DriverManager 工具的替代項。在DBCP包中提供了DataSource接口的實現類,我們要用的具體的連接池 BasicDataSource類

package jdbc;
/*
 *  使用DBCP實現數據庫的連接池
 *  連接池配置,自定義類,
 *  最基本四項完整
 *  對於數據庫連接池其他配置,自定義
 */

import org.apache.commons.dbcp.BasicDataSource;
import javax.sql.DataSource;

public class JDBCUtils {
    //創建出BasicDataSource類對象
    private static BasicDataSource datasource = new BasicDataSource();

    //靜態代碼塊,對象BasicDataSource對象中的配置,自定義
    static {
        //數據庫連接信息,必須的
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setUrl("jdbc:mysql://localhost:3306/mybase");
        datasource.setUsername("root");
        datasource.setPassword("123");
        //對象連接池中的連接數量配置,可選的
        datasource.setInitialSize(10);//初始化的連接數
        datasource.setMaxActive(8);//最大連接數量
        datasource.setMaxIdle(5);//最大空閑數
        datasource.setMinIdle(1);//最小空閑
    }
//定義靜態方法,返回BasicDataSource類的對象 public static DataSource getDataSource() { return datasource; } }

工具類的使用

測試類

package jdbc;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import java.sql.SQLException;

/*
* 演示使用DBUtils工具 完成數據庫表的增加操作
*/
public class Demo02 {
    // 插入功能
    public void insert() {
        try {
            //獲取一個用來執行SQL語句的對象 QueryRunner
            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "INSERT INTO zhangwu(zname,zmoney) VALUES(?,?)";
            Object[] params = {"股票收入", 5500};
            int line = qr.update(sql, params);
            //結果集處理
            System.out.println("line = " + line);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    //刪除功能
    public void delete() {
        try {
            //創建一個QueryRunner對象,用來完成SQL語句的執行
            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
            //執行SQL語句
            String sql = "DELETE FROM zhangwu WHERE zname = ?";
            Object[] params = {"股票收入"};
            int line = qr.update(sql, params);
            //結果集的處理
            System.out.println("line=" + line);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    //更新功能
    public void update() {
        try {
            //創建一個QueryRunner對象,用來完成SQL語句的執行
            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
            //執行SQL語句
            String sql = "UPDATE zhangwu SET zmoney = zmoney+1000 WHERE zname=?";
            Object[] params = {"股票收入"};
            int line = qr.update(sql, params);
            //結果集的處理
            System.out.println("line=" + line);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    //查詢功能,將結果集中第一條記錄封裝到一個指定的javaBean中。
    public void search() {
        try {
            //獲取QueryRunner
            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
            //執行SQL語句
            String sql = "SELECT * FROM zhangwu";
            Object[] params = {};
            ZhangWu p = qr.query(sql, new BeanHandler<ZhangWu>(ZhangWu.class), params);
            //結果集處理
            System.out.println(p);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

//line = 1
//line=1
//line=1
//ZhangWu [id=1, name=null, money=0.0, parent=null]

常見配置項

分類

屬性

描述

必須項

driverClassName

數據庫驅動名稱

url

數據庫的地址

username

用戶名

password

密碼

基本項(擴展)

maxActive

最大連接數量

minIdle

最小空閑連接

maxIdle

最大空閑連接

initialSize

初始化連接

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

Java基礎學習筆記二十七 DBUtils和連接池