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中所有的数据转化成ListList中存放的是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中所有的数据存成ListList中存放的是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值