Java篇-DBUtils與連線池

duanhao發表於2021-09-09

一 : DBUtils

DBUtils就是為了簡化JDBC的快發而產生的開發工具包.對JDBC的一種封裝.

核心功能

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

update(Connection conn, String sql, Object... params)  用來完成資料表的增刪改操作.

增添

//增
    public static void insert() throws SQLException{
    
    Object[] par = {"牛油果熱辣藤椒雞超級可塔",23.5};
        
    String sql = "insert into product (pname,price) values (?,?)";
    QueryRunner qr = new QueryRunner();    int row = qr.update(con, sql, par);
    System.out.println(row);
    DbUtils.close(con);
    
    }

刪除

//刪
    public static void delete() throws SQLException{
        String sql = "delete from product where id = ?";
        QueryRunner qr = new QueryRunner();        int row = qr.update(con, sql, 4);
        System.out.println(row);
        DbUtils.close(con);
        
    }

更改

//改
    public static void update() throws SQLException{
        
        Object[] par = {"肯德基CP堡",28.5,2};
        String sql = "update product set pname = ?,price = ? where id = ?";
        QueryRunner qr = new QueryRunner();        int row = qr.update(con, sql, par);
        System.out.println(row);
        DbUtils.close(con);
        
    }
2. ResultSetHandler介面,用於定義select操作後,怎樣封裝結果集.

其子類以及功能包括


圖片描述

子類功能列表

JavaBean 介紹,好像是我們通常用的mvc中model模型,其實就是一個類,
提供私有欄位 : private型別 欄位名;
提供getter/setter方法;
提供無參構造器,注意:無參構造器一定要提供否則會報錯.
也可以實現java.io.Serializable介面

package com.tiantianBaby.java;public class Product {    
    private int id;    private String pname;    private String price;    public Product() {
        
    }    public Product(int id, String pname, String price) {        super();        this.id = id;        this.pname = pname;        this.price = price;
    }    public int getId() {        return id;
    }    public void setId(int id) {        this.id = id;
    }    public String getPname() {        return pname;
    }    public void setPname(String pname) {        this.pname = pname;
    }    public String getPrice() {        return price;
    }    public void setPrice(String price) {        this.price = price;
    }    @Override
    public String toString() {        return "Product [id=" + id + ", pname=" + pname + ", price=" + price + "]";
    }
    
}
  • ArrayHandler
public static void arrayHander() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Object[] arr = qr.query(con, sql, new ArrayHandler());        for(Object obj : arr){
            System.out.println(obj);
        }
    }

列印

1
漢堡王大漢堡
23.0
  • ArrayListHandler:
//ArrayListHandler
    public static void ArrayListHandler()throws SQLException {
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List<Object[]> list = qr.query(con, sql,new ArrayListHandler());        for(Object[] itemarr : list) {            for(Object obj:itemarr) {
                System.out.print(obj+"  ");
            }
            System.out.println();
        }
        
    }

列印

1  漢堡王大漢堡  23.0  2  肯德基CP堡  28.5  3  蘋果筆記本  14000.0  6  板燒雞腿堡  18.0  7  牛油果熱辣藤椒雞超級可塔  23.5  8  肯德基水果茶  11.8
  • BeanHandler
public static void BeanHandler() throws SQLException{
        
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Product pro = qr.query(con, sql,new BeanHandler<Product>(Product.class));
        System.out.println(pro);
    }

列印

Product [id=1, pname=漢堡王大漢堡, price=23]
  • BeanListHandler
public static void BeanListHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List<Product> list = qr.query(con, sql,new BeanListHandler<Product>(Product.class));        for(Product p : list) {
            System.out.println(p);
        }
    }

列印

Product [id=1, pname=漢堡王大漢堡, price=23]
Product [id=2, pname=肯德基CP堡, price=28.5]
Product [id=3, pname=蘋果筆記本, price=14000]
Product [id=6, pname=板燒雞腿堡, price=18]
Product [id=7, pname=牛油果熱辣藤椒雞超級可塔, price=23.5]
Product [id=8, pname=肯德基水果茶, price=11.8]
  • ColumnListHandler
public static void columnListHandler() throws SQLException{
        String sql = "select * from product";
        
        QueryRunner qr = new QueryRunner();
        List<String> list = qr.query(con, sql,new ColumnListHandler<String>("pname"));        for(Object obj : list) {
            System.out.println(obj);
        }
    }

列印

漢堡王大漢堡
肯德基CP堡
蘋果筆記本
板燒雞腿堡
牛油果熱辣藤椒雞超級可塔
肯德基水果茶
  • ScalarHandler
    public static void ScalarHandler() throws SQLException {
        String sql = "select count(*) from product";
        QueryRunner qr = new QueryRunner();        long count = qr.query(con, sql,new ScalarHandler<Long>());
        System.out.println(count);
        
    }

列印

6
  • MapHandler
public static void mapHandler() throws SQLException{
        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        Map<String,Object> map = qr.query(con, sql,new MapHandler());        for(String str : map.keySet()) {
            System.out.println(str+"---"+map.get(str));
        }
    }

列印

id---1pname---漢堡王大漢堡
price---23.0
  • MapListHandler
public static void mapListHandler() throws SQLException{        String sql = "select * from product";
        QueryRunner qr = new QueryRunner();
        List<Map<String,Object>> list = qr.query(con, sql, new MapListHandler());        for(Map<String,Object> map : list) {            
            for(String key : map.keySet()) {
                System.out.print(key+"---"+map.get(key)+"  ");
            }
            System.out.println();
        }
    }

列印

id---1  pname---漢堡王大漢堡  price---23.0  id---2  pname---肯德基CP堡  price---28.5  id---3  pname---蘋果筆記本  price---14000.0  id---6  pname---板燒雞腿堡  price---18.0  id---7  pname---牛油果熱辣藤椒雞超級可塔  price---23.5  id---8  pname---肯德基水果茶  price---11.8
3. DbUtils類,提供了關閉資源與實務的處理方法
    DbUtils.close(con);

二 : 連線池

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

在開發中“獲得連線”或“釋放資源”是非常消耗系統資源的兩個過程,所以通常用連線池結束,來共享連線Connection.這樣就不用每次都建立連線,釋放連結了,這些操作都交給連線池.

DBCP連線池

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

匯入jar包

圖片描述

匯入jar包

DataSource介面

DataSource是java中提供的連線池,作為DriverManager工具的代替項.
在DBCP提供介面的實現類, 我們要用的具體的連線池
BasicDataSource類.

  • BasicDataSource類的常見配置
分類  屬性 描述
driverClassName 資料庫驅動名稱
url 資料庫的地址
username 使用者名稱
password 密碼
maxActive 最大連線數量
minActive 最小連線數量
maxIdle 最大空閒連線
minIdle 最小空閒連線
initialSize 初始化連線

連線

public class DataSourceDemo {
  public static void main(String[] args) {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/javadatabase");
    dataSource.setUsername("root");
    dataSource.setPassword("newpass");    
    try {
        Connection con = dataSource.getConnection();
        System.out.println(con);
    } catch (SQLException e) {        //      e.printStackTrace();
        throw new RuntimeException("資料庫連線失敗");
    }
  }
}
封裝工具類

其中地址url,使用者名稱和密碼,都可以用檔案進行動態配置.

public class JDBCUtils {

    
    private static BasicDataSource datasource = new BasicDataSource();    
    static{        //資料庫連線資訊,必須的
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setUrl("jdbc:mysql://localhost:3306/javadatabase");
        datasource.setUsername("root");
        datasource.setPassword("newpass");        //物件連線池中的連線數量配置,可選的
        datasource.setInitialSize(10);//初始化的連線數
        datasource.setMaxActive(8);//最大連線數量
        datasource.setMaxIdle(5);//最大空閒數
        datasource.setMinIdle(1);//最小空閒
    }    public static DataSource getDataSource() {        
        return datasource;
            
    }
}
測試工具類
public class QueryRunnerTest {

    public static void main(String[] args) {//      select();
        insert();
    }    
    private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());    
    
    
    public static void insert() {
        String sql = "insert into product (pname,price) values(?,?)";
        Object[] parms = {"肯德基水果茶","11.8"};        
        try {            int row = qr.update(sql,parms);
            System.out.println(row);
        } catch (SQLException e) {            // TODO Auto-generated catch block
            e.printStackTrace();            throw new RuntimeException("資料新增失敗");
        }
        
        
    }    
    
    public static void select() {
        String sql = "select * from product";        try {
            List<Object[]> list = qr.query(sql, new ArrayListHandler());            for(Object[] obs : list) {                for(Object item : obs) {
                    System.out.print(item + "t");
                }
                System.out.println();
            }
        } catch (SQLException e) {            // TODO Auto-generated catch block
            e.printStackTrace();            throw new RuntimeException("資料查詢失敗");
        }
        
    }
}



作者:TianTianBaby223
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1343/viewspace-2817194/,如需轉載,請註明出處,否則將追究法律責任。

相關文章