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中所有的数据转化成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