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.wrappersDBUtils封装了对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中所有的数据转化成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.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