接口 : 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的更多相关文章

  1. MYSQL 之 JDBC(十六): DBUtils

    DBUtils是Apache组织提供的一个开源的JDBC工具类库,能极大简化jdbc编码的工作量 API介绍 QueryRunner ResultSetHandler 工具类DbUtils 用DBUt ...

  2. <十五>JDBC_使用 DBUtils 进行更新、查询操作

    详解待续... DBUtilsTest.java import java.sql.Connection;import java.sql.Date;import java.sql.ResultSet;i ...

  3. 泛型理解及应用(二):使用泛型编写通用型Dao层

    相信目前所有的IT公司网站在设计WEB项目的时候都含有持久层,同样地使用过Hibernate的程序员都应该看过或者了解过Hibernate根据数据库反向生成持久层代码的模板.对于Hibernate生成 ...

  4. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  5. Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  6. Flask 教程 第十六章:全文搜索

    本文翻译自The Flask Mega-Tutorial Part XVI: Full-Text Search 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblo ...

  7. 编程艺术第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性Hash算法

    目录(?)[+]   第十六~第二十章:全排列,跳台阶,奇偶排序,第一个只出现一次等问题 作者:July.2011.10.16.出处:http://blog.csdn.net/v_JULY_v. 引言 ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

    在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...

  9. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

随机推荐

  1. js随机生成颜色代码

    function generyRandomColor() { return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toStri ...

  2. androidstdio偶遇一

    android的错误 今天在安装androidstdio的过程中产生了遇到了一个错误(之前一直没有重新安装,因为觉得麻烦,但是电脑慢成狗了,只好重新安装....)那么现在步入正题.     首先安装的 ...

  3. javase-->基础知识(三)

    1.方法 普通方法:4个必要,1个可选 1):必须有返回值类型,没有返回值用void表示 2):必须有名字 3):必须有()和形参 4):必须有{}方法体 5):可选static,表示静态的方法,可以 ...

  4. C++开始前篇,深入编译链接(3)

    一,COMMON块 什么是COMMON块,这是一种机制,早期的Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小.Fortran把这种空间叫做COMMON块,当不同的 ...

  5. Android版本与api Level

    Platform Version API Level VERSION_CODE Notes Android 4.4 19 KITKAT Platform Highlights Android 4.3 ...

  6. Toad for Sqlserver

    # 设置制表符 从sqlserver拷贝的存储过程粘贴到Toad,代码变得不整齐了,这就需要设置下制表符的大小.

  7. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  8. IIS上虚拟站点的web.config与主站点的web.config冲突解决方法 分类: ASP.NET 2015-06-15 14:07 60人阅读 评论(0) 收藏

    IIS上在主站点下搭建虚拟目录后,子站点中的<system.web>节点与主站点的<system.web>冲突解决方法: 在主站点的<system.web>上一级添 ...

  9. local variable 'r' referenced before assignment

    这个错误是说r在使用前没有定义 def cateToNum(c): if c == 'M PRO': r = 1 if c == 'F PRO': r = 2 if c == 'M PREMIER': ...

  10. asterisk简单命令

    重启asterisk [root@EC2-V2 ~]# service asterisk restart 进入asterisk操作界面 [root@EC2-V2 ~]# asterisk -vvvr ...