网站建设知识
mysql笔记九——Dbutils的使用(增删改查,事务)
2025-07-22 10:00  点击:0

DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的

DBUtils是java编程中的数据库操作实用工具,小巧简单实用

  1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;    2.对于数据表的写操作,也变得很简单(只需写sql语句)    3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象,而不像php,asp那样,费时费力的不断重复的构建和析构这样的对象。

DBUtils包括3个包:

org.apachemons.dbutilsorg.apachemons.dbutils.handlersorg.apachemons.dbutils.wrappers

DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

 - org.apachemons.dbutils        DbUtils 关闭链接等操作        QueryRunner 进行查询的操作 - org.apachemons.dbutils.handlers    1.ArrayHandler :将ResultSet中第一行的数据转化成对象数组    2.ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]    3.BeanHandler :将ResultSet中第一行的数据转化成类对象    4.BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象    5.ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象    6.KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据    7.MapHandler :将ResultSet中第一行的数据存成Map映射    8.MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map    9.ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object - org.apachemons.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 studs=qr.query(sql, new BeanListHandler(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> 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 persons = qr.query(sql,new BeanListHandler(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 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");            conmit();        } 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 tl=new ThreadLocal();    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 getTl() {        return tl;    }}
javaBean类
Stud.java(注意看注解)
package dbUtil;import org.apachemons.dbutils.ext.Column;import org.apachemons.dbutils.ext.Id;import org.apachemons.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.apachemons.dbutils.ext.Column;import org.apachemons.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.jarcommons-dbutils-1.4.jarc3p0-0.9.1.2.jarc3p0-config.xml