基于DBUtils的数据库工具类实现
来源:互联网 发布:淘宝客服绩效是什么 编辑:程序博客网 时间:2024/05/22 09:40
Commonsdbutils是什么?
commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库,对传统操作数据库的类进行二次封装,可以把结果集转化成List。并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
准备
由于使用Oracle数据库 和c3p0数据源 我们要
- 导入以下jar包
c3p0-0.9.5.1.jar
commons-dbutils-1.3.jar
ojdbc6.jar - 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 - 数据库连接工具类JdbcUtils
#### 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 <T>: 当前 DAO 处理的实体类的类型是什么 */public class Dao<T> { private QueryRunner queryRunner = new QueryRunner(); private Class<T> 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<T>) typeArgs[0]; System.out.println("dao类中的构造方法泛型类型:"+clazz.getName()); } } } } /** * 返回某一个字段的值:例如返回某一条记录的 customerName, 或返回数据表中有多少条记录等. * @param sql * @param args * @return */ public <E> 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<T> 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<Customer> getForListByCriteriaCustomer(CriteriaCustomer cc); public List<Customer> 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<Customer> implements CustomerDao { public List<Customer> 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<Customer> 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<Customer> 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的介绍就到这了,有什么错误的地方还请包含并指出
0 0
- 基于DBUtils的数据库工具类实现
- DBUtils数据库工具类
- 【java基础:JDBC】基于DBUtils工具类查询数据库的8种方式!非常重要!
- 常用代码备忘录(封装 Apache Commons 的 DbUtils 实现的数据库操作工具类)-DBUtil.java
- 封装 Apache Commons 的 DbUtils 实现的数据库操作工具类
- 使用DBUtils第三方工具类,实现MySQL数据库的增删改查
- BaseDao——基于dbutils实现万能的对象数据库访问
- 用DBUtils实现对数据库的操作
- Java数据库的操作——DBUtils工具类结果集处理的方式有几种?
- DButils工具类库的使用
- DbUtils工具的使用
- dbUtils工具的使用
- DBUtils工具的使用
- 测试 DBUtils 工具类
- JDBC-DBUtils工具类
- DBUtils工具类
- dbutils工具类:QueryRunner
- C3P0组件+DbUtils组件实现一个JdbcUtils工具类
- javascript简单实现 EventEmitter
- Freemarker学习记录——项目使用
- Spring是什么???
- Android中如何为Fragment中的按钮添加监听事件
- ORA-01031: insufficient privileges
- 基于DBUtils的数据库工具类实现
- 深入理解JVM07--虚拟机类加载机制--类加载器、双亲委派模型
- IO学习(十七)文件的分割与合并
- Centos6下DRBD的安装配置
- Java中Properties类的操作
- Linux bashrc和profile的用途和区别
- 框架 day33 Hibernate,组件映射,继承映射,抓取(检索)策略-优化,检索方式总结
- 动态样式语言--LESSCSS
- STM32F1_FSMC读写外部SRAM