<十六>JDBC_使用 DBUtils 编写通用的DAO

接口 : DAO<T>.java
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/*
* 访问数据的DAO接口。
* @param T:DAO处理的实体类的类型
* */
public interface DAO<T> {
/*
* 批量处理的方法
* @param con:数据库连接
* @param sql:SQL语句
* @param args:填充占位符的Object[]类型的可变参数
* @return
* */
void batch(Connection con,String sql,Object[]...args);
/*
* 返回具体的一个值,eg.总人数,平均工资。。。
* @param con:数据库连接
* @param sql:SQL语句
* @param args:填充占位符的可变参数
* @return
* */
<E> E getForValue(Connection con,String sql,Object...args);
/*
* 返回一个T的一个集合
* @param con:数据库连接
* @param sql:SQL语句
* @param args:填充占位符的可变参数
* @return
* */
List<T> getForList(Connection con,String sql,Object...args);
/*
* 返回一个T的对象
* @param con:数据库连接
* @param sql:SQL语句
* @param args:填充占位符的可变参数
* @return
* */
T get(Connection con,String sql,Object...args) throws SQLException;
/*
* insert、update、delete
* @param con:数据库连接
* @param sql:SQL语句
* @param args:填充占位符的可变参数
* */
void update(Connection con,String sql,Object...args);
}
DAO接口实现类:JdbcDAOImpl.java
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.kk.jdbc.ReflectionUtils;
/*
* 使用QueryRunner提供其具体的实现
* @param<T>:子类需要传入泛型的类型
* */
public class JdbcDAOImpl<T> implements DAO<T> {
private QueryRunner qr=null;
private Class<T> type;
public JdbcDAOImpl() {
qr=new QueryRunner();
type=ReflectionUtils.getSuperGenericType(getClass());
}
@Override
public void batch(Connection con, String sql, Object[]... args) {
// TODO Auto-generated method stub
}
@Override
public <E> E getForValue(Connection con, String sql, Object... args) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<T> getForList(Connection con, String sql, Object... args) {
// TODO Auto-generated method stub
return null;
}
@Override
public T get(Connection con, String sql, Object... args) throws SQLException {
return qr.query(con, sql, new BeanHandler<>(type), args);
}
@Override
public void update(Connection con, String sql, Object... args) {
// TODO Auto-generated method stub
}
}
JdbcDAOImpl的子类CustomerDao.java
public class CustomerDao extends JdbcDAOImpl<Customer> {
}
测试类:CustomerDaoTest.java
import static org.junit.Assert.*;
import java.sql.Connection;
import org.junit.Test;
import com.kk.jdbc.JDBCTools;
public class CustomerDaoTest {
CustomerDao customerDao=new CustomerDao();
@Test
public void testBatch() {
fail("Not yet implemented");
}
@Test
public void testGetForValue() {
fail("Not yet implemented");
}
@Test
public void testGetForList() {
fail("Not yet implemented");
}
@Test
public void testGet() {
Connection con = null;
try {
con=JDBCTools.getConnection();
String sql = "select id,name,email from customers where id=?";
Customer customer=customerDao.get(con, sql, 6);
System.out.println(customer);
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(null, null, con);
}
}
@Test
public void testUpdate() {
fail("Not yet implemented");
}
}
<十六>JDBC_使用 DBUtils 编写通用的DAO的更多相关文章
- MYSQL 之 JDBC(十六): DBUtils
DBUtils是Apache组织提供的一个开源的JDBC工具类库,能极大简化jdbc编码的工作量 API介绍 QueryRunner ResultSetHandler 工具类DbUtils 用DBUt ...
- <十五>JDBC_使用 DBUtils 进行更新、查询操作
详解待续... DBUtilsTest.java import java.sql.Connection;import java.sql.Date;import java.sql.ResultSet;i ...
- 泛型理解及应用(二):使用泛型编写通用型Dao层
相信目前所有的IT公司网站在设计WEB项目的时候都含有持久层,同样地使用过Hibernate的程序员都应该看过或者了解过Hibernate根据数据库反向生成持久层代码的模板.对于Hibernate生成 ...
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
- Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法
先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...
- Flask 教程 第十六章:全文搜索
本文翻译自The Flask Mega-Tutorial Part XVI: Full-Text Search 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblo ...
- 编程艺术第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性Hash算法
目录(?)[+] 第十六~第二十章:全排列,跳台阶,奇偶排序,第一个只出现一次等问题 作者:July.2011.10.16.出处:http://blog.csdn.net/v_JULY_v. 引言 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...
- Java学习笔记(十六)——Java RMI
[前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...
随机推荐
- <css系列>之css--float总结
一.float的历史 float的设计初衷是实现文字环绕效果. 如下图,对图片添加float,文字实现环绕效果. 二.float特性 1.包裹性,表现:收缩.坚挺.隔绝.具有包裹性的属 ...
- 最终版的Web(Python实现)
天啦,要考试了,要期末考试了,今天把最终版的Python搭建Web代码先写这里记下了.详细的过程先不写了. 这次是在前面的基础上重写 HTTPServer 与 BaseHTTPRequestHandl ...
- 为WAMP中的mysql设置密码(默认为空)
为WAMP中的mysql设置密码 WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 1.首先,通过WAMP打开mysql控制台. 提示 ...
- WINFORM时间控件(DATATIMEPICKER)的显示格式设置
将DateTimePicker控件拖出来后打开属性,找到Format属性,选择Costum选项: 然后找到CustomFormat属性,按照你要显示的格式来输入,示例如下: 若系统时间为:2016年1 ...
- java关键字extends(继承)、Supe(父类引用空间)、 This(方法调用者对象)、Instanceof(实例类型-判断对象是否属于某个类)、final(最终)、abstract(抽象) 、interface(接口)0
java 继承使用关键字extends 继承的作用:减少代码量,优化代码 继承的使用注意点: 1子类不能继承父类的私有变量 2.子类不能继承父类的构造方法 3.子类在调用自己的构造方法时 会默认调 ...
- javascript学习笔记之array.sort
arrayName.sort()方法: 功能是实现排序(按ascii编码或按数字大小),可无参或有参使用,无参时默认升序排列.有参时可实现升序或降序排列,参数必须是具有返回值的方法,当方法表达式大于0 ...
- AngularJs学习
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Android中自定义控件TextSize属性问题
本文主要说明一个自定义控件添加TextSize属性的坑,刚刚从坑里面爬出来,写个随笔,记录一下: *************************************************** ...
- Python 学习拾遗
该博文主要适应于python2.7,并没有对py3进行测试. 主要记录学习python过程中容易出现的一些小问题.小错误,相信能给你启发. 1.剔除一个字符串中的所有空格(假设该字符串是s) &quo ...
- WebService技术(一)
前言:学习笔记,以供参考 1.认识 WebService就是一种跨编程语言和跨操作系统平台的远程调用技术. Webservice就是一个独立运行的应用程序,提供了可以进行远程调用的API接口. Web ...