<十六>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");
   }
}

时间: 2024-10-09 22:07:41

<十六>JDBC_使用 DBUtils 编写通用的DAO的相关文章

&lt;十五&gt;JDBC_使用 DBUtils 进行更新、查询操作

详解待续... DBUtilsTest.java import java.sql.Connection;import java.sql.Date;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.Map; import org.apache.commons.dbutils.QueryRunner;impor

CCNA实验三十六 GRE(通用路由封装) &nbsp;

CCNA实验三十六 GRE(通用路由封装) 环境:Windows XP .Packet Tracert5.3 目的:了解GRE的使用,掌握如何配置GRE. 说明: GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(如IP 和IPX)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输.GRE采用了Tunnel(隧道)技术,是VPN(Virtual Private Network)的第三层隧道协议. Tunnel

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

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

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

本文翻译自The Flask Mega-Tutorial Part XVI: Full-Text Search 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblog添加全文搜索功能. 本章的目标是为Microblog实现搜索功能,以便用户可以使用自然语言查找有趣的用户动态内容.许多不同类型的网站,都可以使用Google,Bing等搜索引擎来索引所有内容,并通过其搜索API提供搜索结果. 这这方法适用于静态页面较多的的大部分网站,比如论坛. 但在我的应用中,基

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver

Qt浅谈之十六:TCP和UDP(之一)

一.简介 Qt使用QtNetwork模块来进行网络编程,提供了一层统一的套接字抽象用于编写不同层次的网络程序,避免了应用套接字进行网络编的繁琐(因有时需引用底层操作系统的相关数据结构).有较底层次的类如QTcpSocket.QTcpServer和QUdpSocket等来表示低层的网络概念:还有高层次的类如QNetworkRequest.QNetworkReply和QNetworkAccessManager使用相同的协议来执行网络操作:也提供了QNetworkConfiguration.QNetw

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

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制 在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需要提供AccessToken,因此我们每次在调用高级接口之前,都需要执行一次获取AccessToken的方法,例如: 1 var accessToken = AccessTokenContainer.

C Primer Plus (第五版) 第十六章 C预处理器和C库 编程练习

第十六章 C预处理器和C库 开发一个包含您需要使用的预处理器定义的头文件 //max.h  #ifndef _MAX_H_     #define _MAX_H_     #define MAX(X, Y) ((X)>(Y)?(X):(Y)) #endif 2.两个数的调和平均数可用如下方法得到:首先对两数的倒数取平均值,最后再取倒数.使用#define指令定义一个宏"函数"执行这个运算.编写一个简单的程序测试该宏. #include <stdio.h> #defin

Java Web总结十六之一自定义标签

一.自定义标签简介 1.为什么要使用自定义标签? 自定义标签主要用于移除Jsp页面中的<%java%>代码. 2.开发自定义标签的步骤: 1)开发自定义标签处理类,该类需要实现SimpleTag接口/SimpleTagSupport类,重写doTag()方法. 2)编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述,并放置在WEB-INF/目录下. 3)完成以上操作,即可在JSP页面中导入和使用自定义标签. 二.自定义标签描述 1.实现SimpleTag接口的标签通常称为简单标