commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库,对传统操作数据库的类进行二次封装,可以把结果集转化成List。并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
由于使用Oracle数据库 和c3p0数据源 我们要
c3p0.jdbcUrl=jdbc:oracle:thin:test/test@localhost:1521:orcl
c3p0.driverClass=oracle.jdbc.OracleDriver
c3p0.initialPoolSize=6
c3p0.acquireIncrement=6
c3p0.minPoolSize=6
#### package com.mav.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JdbcUtils {
/**
* dbUtils 不需要关resultset
* 释放 Connection 连接
* @param connection
*/
public static void releaseConnection(Connection connection){
try {
if(connection != null){
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static DataSource ds = new ComboPooledDataSource();
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
public static void free(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
####接下来就是编写使用dbutils来进行CURD操作的工具类了
其中dbutils的一些方法的使用大家可以看我写的 模仿dbutils的jdbc框架 这篇文章
该类使用了泛型 T 代表传入的实体类类型
package com.mav.dao;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.mav.db.JdbcUtils;
/**
* 封装了基本的 CRUD 的方法, 以供子类继承使用
* 当前 DAO 直接在方法中获取数据库连接.
* 整个 DAO 采取 DBUtils 解决方案.
* @param : 当前 DAO 处理的实体类的类型是什么
*/
public class Dao<T> {
private QueryRunner queryRunner = new QueryRunner();
private Class clazz;
public Dao() {
Type superClass = this.getClass().getGenericSuperclass();
if(superClass instanceof ParameterizedType){
ParameterizedType parameterizedType = (ParameterizedType) superClass;
Type[] typeArgs = parameterizedType.getActualTypeArguments();
if(typeArgs != null && typeArgs.length>0){
if(typeArgs[0] instanceof Class){
clazz = (Class) typeArgs[0];
System.out.println("dao类中的构造方法泛型类型:"+clazz.getName());
}
}
}
}
/**
* 返回某一个字段的值:例如返回某一条记录的 customerName, 或返回数据表中有多少条记录等.
* @param sql
* @param args
* @return
*/
public E getForValue(String sql,Object ...args){
Connection conn = null;
try {
conn = JdbcUtils.getConnection();
return (E) queryRunner.query(conn, sql,new ScalarHandler(), args);
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.releaseConnection(conn);
}
return null;
}
/**
* 返回 T 所对应的 List
* @param sql
* @param args
* @return
*/
public List getForList(String sql,Object ...args){
Connection conn = null;
try {
conn = JdbcUtils.getConnection();
return queryRunner.query(conn, sql,new BeanListHandler<>(clazz), args);
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.releaseConnection(conn);
}
return null;
}
/**
* 返回对应的 T 的一个实例类的对象.
* @param sql
* @param args
* @return
*/
public T get(String sql ,Object ...args){
Connection conn = null;
try {
conn = JdbcUtils.getConnection();
return queryRunner.query(conn, sql,new BeanHandler<>(clazz), args);
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.releaseConnection(conn);
}
return null;
}
/**
* 该方法封装了 INSERT、DELETE、UPDATE 操作.
* @param sql: SQL 语句
* @param args: 填充 SQL 语句的占位符.
*/
public void Update(String sql,Object ...args){
Connection conn = null;
try {
conn = JdbcUtils.getConnection();
queryRunner.update(conn, sql, args);
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.releaseConnection(conn);
}
}
}
以上的代码时可以重复利用的
package com.mav.dao;
import java.util.List;
import com.mav.domain.CriteriaCustomer;
import com.mav.domain.Customer;
public interface CustomerDao {
/**
* 返回满足查询条件的 List
* @param cc: 封装了查询条件
* @return
*/
public List getForListByCriteriaCustomer(CriteriaCustomer cc);
public List getALl();
public void save(Customer customer);
public Customer get(Integer id);
public void delete(Integer id);
/**
* 返回和 name 相等的记录数.
* @param name
* @return
*/
public Long getCountWithName(String name);
public void update(Customer customer);
}
#### 与数据表对应的实体类
package com.mav.domain;
public class Customer {
private Integer id;
private String name;
private String address;
private String phone;
public Customer() {
// TODO Auto-generated constructor stub
}
public Customer(Integer id, String name, String address, String phone) {
super();
this.id = id;
this.name = name;
this.address = address;
this.phone = phone;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public String getPhone() {
return phone;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", phone=" + phone + "]";
}
}
#### CustomerDao 的实现类
实现类CustomerDao 并继承了Dao<>类
package com.mav.dao.impl;
import java.math.BigDecimal;
import java.util.List;
import com.mav.dao.CustomerDao;
import com.mav.dao.Dao;
import com.mav.domain.CriteriaCustomer;
import com.mav.domain.Customer;
public class CustomerDaoJdbcImpl extends Dao implements CustomerDao {
public List getForListByCriteriaCustomer(CriteriaCustomer cc) {
String sql = "select id,name,address,phone from customers where name like ? and address like ? and phone like ?";
//这样写太麻烦了 我们可以修改CriteriaCustomer 类中的get方法来获得
//return getForList(sql,"%"+ cc.getName()+"%","%"+ cc.getAddress()+"%","%"+ cc.getPhone()+"%");
return getForList(sql, cc.getName(),cc.getAddress(),cc.getPhone());
}
@Override
public List getALl() {
String sql = "select id,name,address,phone from customers";
return getForList(sql);
}
@Override
public void save(Customer customer) {
String sql = "insert into customers values(null,?,?,?)";
Update(sql,customer.getName(),customer.getAddress(),customer.getPhone());
}
@Override
public Customer get(Integer id) {
String sql ="select id,name,address,phone from customers where id = ?";
return get(sql, id);
}
@Override
public void delete(Integer id) {
String sql = "delete from customers where id = ?";
Update(sql, id);
}
@Override
public Long getCountWithName(String name) {
String sql = "select count(id) from customers where name = ?";
BigDecimal b = getForValue(sql, name);
//BigDecimal 从数据库返回的类型为此 须强转 也可以返回值为 number 类型
return b.longValue();
}
@Override
public void update(Customer customer) {
String sql ="update customers set name = ? , address = ? , phone = ? where id = ?";
Update(sql, customer.getName(),customer.getAddress(),customer.getPhone(),customer.getId());
}
}
## ##测试 ##
package com.mav.test;
import java.util.List;
import org.junit.Test;
import com.mav.dao.CustomerDao;
import com.mav.dao.impl.CustomerDaoJdbcImpl;
import com.mav.domain.Customer;
import junit.framework.TestCase;
public class CustomerDaoJdbcImplTest extends TestCase {
private CustomerDao customerDao = new CustomerDaoJdbcImpl();
@Test
public void testAdd(){
Customer customer = new Customer();
customer.setAddress("china");
customer.setName("liming");
customer.setPhone("15088789250");
customerDao.save(customer);
}
@Test
public void testGetList(){
List list = customerDao.getALl();
for(Customer c : list){
System.out.println(c);
}
}
/* 输出结果
Customer [id=18, name=update, address=qwewqweq, phone=121343121]
Customer [id=9, name=里面, address=南阳, phone=12121212]
Customer [id=12, name=行云, address=西安, phone=123456]
Customer [id=19, name=zli123, address=beijing, phone=110120119454]
Customer [id=17, name=zhognfd, address=sdfsd, phone=123]
Customer [id=11, name=重视, address=北京, phone=12121212]
*/
@Test
public void testGetbyId(){
Customer customer = customerDao.get(3);
System.out.println(customer);
}
@Test
public void testDeletebyId(){
customerDao.delete(3);
}
@Test
public void testgetCountWithName(){
Long count = customerDao.getCountWithName("222");
System.out.println(count);
}
}
关于dbutils的介绍就到这了,有什么错误的地方还请包含并指出