结构:

DAO2_7< T >(接口)—>DAOTestImpl< T >(实现类)—>CustomerDAO(继承的子类)—>CustomerDAOTest(继承的测试类)

代码:

  • 接口:
package JDBC;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; /**
* 访问数据的接口
*其中定义了访问数据表的各种方法
*@param T:DAO处理的实体类的类型
*版本:2.0
*
*/
public interface DAO2_7<T> { /**
* 1.功能:insert、update、delete
* @param conn:链接数据库
* @param sql:SQL语句
* @param objects:占位符的可变参数
* @throws SQLException
*/
void update(Connection conn, String sql, Object ... objects ) throws SQLException;
/**
* 2.功能:返回一个T类型对象
* @param conn
* @param sql
* @param objects
* @return
* @throws SQLException
*/
T get(Connection conn, String sql, Object ...objects) throws SQLException;
/**
* 3.功能:返回一个T类型的对象的集合
* @param conn
* @param sql
* @param objects
* @return
* @throws SQLException
*/
List<T> getForList(Connection conn, String sql, Object ...objects) throws SQLException;
/**
* 4.返回具体的一个值,例如:总人数、平均数,某个人的名字。
* @param conn
* @param sql
* @param objects
* @return
* @throws SQLException
*/
<E> E getForValue(Connection conn, String sql, Object ...objects) throws SQLException;
/**
* 5.批量处理的方法
* @param conn
* @param sql
* @param objects:填充占位符的Object[]类型的可变参数
* @throws SQLException
*/
void batch(Connection conn, String sql, Object[] ...objects) throws SQLException;
}
  • 实现类
package JDBC;

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 org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler; import 反射机制.ReflectionUtils; public class DAOTestImpl<T> implements DAO2_7<T> { private QueryRunner queryRunner = null;
private Class <T> type;
//构造器
public DAOTestImpl(){
queryRunner = new QueryRunner();
type = ReflectionUtils.getSuperGenericType(getClass());
}
//更新数据
@Override
public void update(Connection conn, String sql, Object... objects) throws SQLException {
queryRunner.update(conn, sql, objects);
}
//查询数据
@Override
public T get(Connection conn, String sql, Object... objects) throws SQLException {
return queryRunner.query(conn, sql, new BeanHandler<>(type), objects);
}
//获取多条记录
@Override
public List<T> getForList(Connection conn, String sql, Object... objects) throws SQLException {
return queryRunner.query(conn, sql, new BeanListHandler<>(type), objects);
}
//获取某一列值,或计算总数
@Override
public <E> E getForValue(Connection conn, String sql, Object... objects) throws SQLException {
return (E)queryRunner.query(conn, sql, new ScalarHandler(), objects);
}
//批量操作
@Override
public void batch(Connection conn, String sql, Object[]... objects) throws SQLException {
queryRunner.batch(conn, sql, objects);
} }
  • 继承的子类
package JDBC;

import JDBCTest.Customers;

public class CustomerDAO extends DAOTestImpl<Customers> {

}
  • 继承子类的测试类
package JDBC;

import java.sql.Connection;
import java.sql.Date;
import java.util.List; import org.junit.Test; import JDBCTest.Customers;
import JDBCTest.TestTools; public class CustomerDAOTest extends CustomerDAO { Connection conn = null;
CustomerDAO customerDao = new CustomerDAO();
//构造器
public CustomerDAOTest() throws Exception{
conn = TestTools.getConnection();
}
@Test
public void testUpdate() {
try {
String sql = "INSERT INTO customers(id,name,age,birth,address) VALUES(?, ?, ?, ?, ?)";
customerDao.update(conn, sql, 1, "张力", "32", new Date(new java.util.Date().getTime()), "上海市" );
System.out.println("OK");
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(null, conn);
}
} @Test
public void testGet() {
try { String sql = "select id, name, age, birth from customers where id = ?";
Customers customer = customerDao.get(conn, sql, 15);
System.out.println(customer);
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(null, conn);
}
} @Test
public void testGetForList() {
try {
String sql = "select id, name, age, birth from customers where id > ?";
List<Customers> customers = customerDao.getForList(conn, sql, 15);
System.out.println(customers);
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(null, conn);
}
} @Test
public void testGetForValue() {
try {
String sql = "select count(id) from customers";
Object result = customerDao.getForValue(conn, sql, null);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(null, conn);
}
} @Test
public void testBatch() {
try {
String sql = "INSERT INTO customers(name, age, birth, address) VALUES(?, ?, ?, ?)";
Object objects[][] = new Object[1000][4];
for(int i = 0; i < 1000; i++){
objects[i][0] = "name_"+i;
objects[i][1] = "20";
objects[i][2] = (new Date(new java.util.Date().getTime()));
objects[i][3] = "河南省";
} customerDao.batch(conn, sql, objects);
System.out.println("OK");
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(null, conn);
}
} }

JDBC(14)—对DAO进行改进修改的更多相关文章

  1. Spring整合JDBC(连接池、JDBC模板、Dao配置到Spring容器、配置文件的优化)

    1.Spring整合JDBC (1)导包(共12个): c3p0连接池.JDBC驱动(4个) Spring-jdbc.Spring-tx事务(2个) (2)JDBC模板对象(JDBCTemplate) ...

  2. 解释JDBC抽象和DAO模块?

    通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层.它还利用Spring的AOP 模块给Spr ...

  3. 解释 JDBC 抽象和 DAO 模块?

    通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源 错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一 的异常访问层.它还利用 Spring 的 A ...

  4. 【Spring实战】—— 14 传统的JDBC实现的DAO插入和读取

    从这篇开始学习Spring的JDBC,为了了解Spring对于JDBC的作用,先通过JDBC传统的流程,实现一个数据库的插入和读取. 从这篇你可以了解到: 1 传统的JDBC插入和读取的过程. 2 如 ...

  5. jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

    day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...

  6. 【JDBC核心】DAO 相关

    DAO 相关 概念 DAO:Data Access Object 访问数据信息的类和接口,包括了对数据的 CRUD(Create.Retrival.Update.Delete),而不包含任何业务相关的 ...

  7. MySQL_(Java)【事物操作】使用JDBC模拟银行转账向数据库发起修改请求

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...

  8. JDBC——数据层DAO

    DAO:Data Access Object DAO 数据层 Service 逻辑业务层 View  视图层 entity   实体层 实现增.删.改.查的数据层 public class EmpDA ...

  9. 反射实现增删改查(DAO层)——修改数据

    先贴出代码,后续补充自己的思路.配置文件.使用方式: /** * * 修改数据 * */ @Override public void updateObject(Object object, Strin ...

随机推荐

  1. textarea文本域宽度和高度width及height自动适应实现代码

    <HTML> <HEAD> <TITLE>textarea宽度.高度自动适应处理方法</TITLE> <!-- 控制宽度的自动适应 --> ...

  2. 清北合肥day2-day5

    day2:215这一天的题目相对比较模板化t1:50看错了数据范围求n个点到给出的点哈夫曼距离的最小值我想到的是一种非常zz的做法我们二分答案,然后判断是否在这个距离内有点但是这样前缀和不是很好维护于 ...

  3. 【AtCoder】Tenka1 Programmer Contest 2019

    Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即 ...

  4. Ubuntu学习

    一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词,意思是“人性”.“我的存在是因为大 ...

  5. Codeforces 1071C Triple Flips 构造

    原文链接 https://www.cnblogs.com/zhouzhendong/p/CF1071C.html 题目传送门 - CF1071C 题意 给定一个长度为 n 的 01 数列,限定你在 $ ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  7. CodeForces 516C Drazil and Park 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/8990745.html 题目传送门 - CodeForces 516C 题意 在一个环上,有$n$棵树. 给出每一 ...

  8. Java中常见的排序方式-冒泡排序(升序)

    [基本思想] 假设数组为int[] a = { 49, 38, 65, 97, 76, 13, 27 },数组元素个数为7个. 第1轮比较:先是a[0]与a[1]比较,大于则先交换,再比较a[1]和a ...

  9. day23 面向对象 函数和方法区分

    最近两周内容大概回顾: # 文件操作 # # 模块:random,序列化模块,时间模块,collections,re,os,sys # 模块与包的概念和导入方法 # 写代码的规范 # 正则表达式 # ...

  10. 用yield写协程实现生产者消费者

    思路: yield可以使得函数阻塞,next,和send可以解阻塞,实现数据不竞争的生产者消费者模式 代码: import random #随机数,模拟生产者的制造物 def eat(): #消费者 ...