1. 程式人生 > >mysql筆記九——Dbutils的使用(增刪改查,事務)

mysql筆記九——Dbutils的使用(增刪改查,事務)

  • DbUtils :提供如關閉連線、裝載JDBC驅動程式等常規工作的工具類,裡面的所有方法都是靜態的

  • DBUtils是java程式設計中的資料庫操作實用工具,小巧簡單實用

      1.對於資料表的讀操作,他可以把結果轉換成List,Array,Set等java集合,便於程式設計師操作;
        2.對於資料表的寫操作,也變得很簡單(只需寫sql語句)
        3.可以使用資料來源,使用JNDI,資料庫連線池等技術來優化效能--重用已經構建好的資料庫連線物件,而不像php,asp那樣,費時費力的不斷重複的構建和析構這樣的物件。
    
  • DBUtils包括3個包:

    org.apache.commons.dbutils
    org.apache.commons.dbutils.handlers org.apache.commons.dbutils.wrappers

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


 - org.apache.commons.dbutils

        DbUtils 關閉連結等操作
        QueryRunner 進行查詢的操作

 - org.apache.commons.dbutils.handlers

    1.ArrayHandler :將ResultSet中第一行的資料轉化成物件陣列
    2.ArrayListHandler將ResultSet中所有的資料轉化成List
List中存放的是Object[] 3.BeanHandler :將ResultSet中第一行的資料轉化成類物件 4.BeanListHandler :將ResultSet中所有的資料轉化成ListList中存放的是類物件 5.ColumnListHandler :將ResultSet中某一列的資料存成ListList中存放的是Object物件 6.KeyedHandler :將ResultSet中存成對映,key為某一列對應為MapMap中存放的是資料 7.MapHandler :將ResultSet中第一行的資料存成Map對映 8.MapListHandler :將ResultSet中所有的資料存成List
List中存放的是Map 9.ScalarHandler :將ResultSet中一條記錄的其中某一列的資料存成Object - org.apache.commons.dbutils.wrappers SqlNullCheckedResultSet :對ResultSet進行操作,改版裡面的值 StringTrimmedResultSet :去除ResultSet中中欄位的左右空格。Trim() - 主要方法: 1.DbUtils類:啟動類 2.ResultSetHandler介面:轉換型別介面 3.MapListHandler類:實現類,把記錄轉化成List BeanListHandler類:實現類,把記錄轉化成List,使記錄為JavaBean型別的物件 4.Query Runner類:執行SQL語句的類

另外,還有一個dbutils擴充套件包commons-dbutils-ext.jar,主要是對dbutils的擴充套件 功能,簡化了其操作

下面我通過程式碼來演示具體的操作:

增加操作

@Test//使用dbUtils工具的資料庫插入程式碼實現
    public void dbUtilInsert() throws SQLException{
        DataSource pool=C3p0Pool.getPool();
        QueryRunner qr=new QueryRunner(pool);
        //statement方式
        String sql="insert into stud values('A001','張三')";
        qr.update(sql);
        //prepareStatement方式
        String sql2="insert into stud(id,name) values(?,?)";
        qr.update(sql2,"A002","Jack");
        dbUtilQuery();
    }
  • 刪除操作
@Test//使用dbUtils工具的資料庫刪除程式碼實現
    public void dbUtilDelete() throws SQLException{
        DataSource pool=C3p0Pool.getPool();
        QueryRunner qr=new QueryRunner(pool);
        String sql="delete from stud where name='李白'";
        qr.update(sql);
        String sql2="delete from stud where name=?";
        qr.update(sql2,"大哥");
        dbUtilQuery();
    }
  • 修改操作
@Test//使用dbUtils工具的資料庫更改程式碼實現
    public void dbUtilUpdate() throws SQLException{
        DataSource pool=C3p0Pool.getPool();
        QueryRunner qr=new QueryRunner(pool);
        //statement方式
        String sql="update stud set name='李白' where id='A002' ";
        qr.update(sql);
        //prepareStatement方式
        String sql2="update stud set name=? where id=?";
        qr.update(sql2,"大哥","A001");
        dbUtilQuery();
    }

每次增刪改操作後都會關閉連結,導致拿到的不是同一個連線

  • 查詢操作
@Test//使用dbUtils工具的資料庫查詢程式碼實現,封裝成beanList
    public void dbUtilQuery() throws SQLException{
        DataSource  ds=new ComboPooledDataSource();
        QueryRunner qr=new QueryRunner(ds);
        String sql="select * from stud";
        List<Stud> studs=qr.query(sql, new BeanListHandler<Stud>(Stud.class) );
        System.out.println(studs);
    }
    @Test///封裝成MapList
    public void dbUtilQuery2() throws SQLException{
        DataSource  ds=new ComboPooledDataSource();
        QueryRunner qr=new QueryRunner(ds);
        String sql="select * from stud";
        List<Map<String, Object>> studs=qr.query(sql, new MapListHandler() );
        System.out.println(studs);
    }

    @Test//封裝成BeanList---查詢帶引數
    public void dbUtilQuery3() throws Exception{
        DataSource  ds=new ComboPooledDataSource();
        QueryRunner qr=new QueryRunner(ds);
        String sql = "select id,name,address,age from person where name like ? and age>? ";
        List<Person> persons = qr.query(sql,new BeanListHandler<Person>(Person.class),"%a%",25);
        System.out.println(persons);
    }

演示擴充套件包commons-dbutilss-ext.jar的功能

注意,要在JavaBean上加不同的註解

//注意,下面的用法要生效,必須給值物件添加註解
    @Test//封裝成BeanList---直接通過JavaBean的位元組碼查詢
    public void dbUtilQuery4() throws Exception{
        DataSource  ds=new ComboPooledDataSource();
        ExtQueryRunner eqr=new ExtQueryRunner(ds);
        //不用sql語句,,直接查詢Bean-List
        List<Person> persons=eqr.query(Person.class);//給JavaBean物件加註解
        System.out.println(persons);
    }
    @Test//封裝成BeanList---直接通過JavaBean的位元組碼查詢
    public void dbUtilQuery5() throws Exception{
        DataSource  ds=new ComboPooledDataSource();
        ExtQueryRunner eqr=new ExtQueryRunner(C3p0Pool.getCon());
        Stud stud=new Stud();
        stud.setId("A112");
        stud.setName("Tom");
        eqr.save(stud);//用save不能贏update
//      eqr.update(stud);//update只能用於更新(看原始碼可以知道要在Stud的Id欄位加上@ID註解
        dbUtilQuery2();
    }
  • 演示批處理功能
@Test//演示批處理功能
    public void batch() throws SQLException{
        DataSource pool=C3p0Pool.getPool();
        QueryRunner qr=new QueryRunner(pool);
        for(int i=1;i<=100;i++){
            String sql="insert into stud(id,name) values(?,?)";
            String str=("000"+i);
            str=str.substring(str.length()-3);
            String id1="A"+str;
            String id2="B"+str;
            Object[][] params={{id1,"Alice"+i},{id2,"Bob"+i}}; 
            qr.batch(sql, params);
        }
    }
  • 演示事務功能
@Test//演示事務功能
    public void saveTx() {
        //※注意,實現事務功能時,要傳入con物件,且多條語句共處一個事務時,要傳入同一個con物件。但如果不實現事務功能,可以有傳入con物件
        DataSource pool=C3p0Pool.getPool();
        QueryRunner qr=new QueryRunner(pool);
        Connection con=null;
        try {
            con=C3p0Pool.getCon();
            con.setAutoCommit(false);
            //注意
            qr.update(con,"insert into person(id,name,address,age) values(?,?,?,?)","P010","Jack","華南",50);
            qr.update(con,"insert into person(id,name,address,age) values(?,?,?,?)","P010","Jack","華南","500");
            con.commit();
        } catch (SQLException e) {
            try {
                con.rollback();
                System.out.println("事務回滾");
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }finally{
            if(con!=null){
                try {
                    con.setAutoCommit(true);
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                C3p0Pool.getTl().set(null);
            }
        }
    }
  • 工具類

C3p0Pool.java

package c3p0PoolUse;

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

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0Pool {
    private  static DataSource pool=new ComboPooledDataSource();//讀取配置檔案
    private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();
    public static Connection getCon() throws SQLException{
        Connection con =tl.get();
        if(con==null){
            con=pool.getConnection();
            tl.set(con);
        }
        return con;
    }
    public static DataSource getPool() {
        return pool;
    }
    public static ThreadLocal<Connection> getTl() {
        return tl;
    }

}
  • javaBean類
    Stud.java(注意看註解)
package dbUtil;

import org.apache.commons.dbutils.ext.Column;
import org.apache.commons.dbutils.ext.Id;
import org.apache.commons.dbutils.ext.Table;

@Table(value="stud")
public class Stud {
    @Id(value="id")
    private String id;
    @Column(value="NAME")
    private String name;
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Stud other = (Stud) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Stud [id=" + id + ", name=" + name + "]";
    }

}

Person.java(注意看註解)

package dbUtil;


import org.apache.commons.dbutils.ext.Column;
import org.apache.commons.dbutils.ext.Table;

@Table(value = "person") 
public class Person {
    private String id;
    private String name;
    @Column(value="address")//無效
    private String addr;
    private Integer age;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", addr=" + addr
                + ", age=" + age + "]";
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

注意,需要匯入dbutils和c3p0所需的工具包

commons-dbutils-ext.jar
commons-dbutils-1.4.jar
c3p0-0.9.1.2.jar
c3p0-config.xml