JDBC(14)—对DAO进行改进修改
结构:
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进行改进修改的更多相关文章
- Spring整合JDBC(连接池、JDBC模板、Dao配置到Spring容器、配置文件的优化)
1.Spring整合JDBC (1)导包(共12个): c3p0连接池.JDBC驱动(4个) Spring-jdbc.Spring-tx事务(2个) (2)JDBC模板对象(JDBCTemplate) ...
- 解释JDBC抽象和DAO模块?
通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层.它还利用Spring的AOP 模块给Spr ...
- 解释 JDBC 抽象和 DAO 模块?
通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源 错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一 的异常访问层.它还利用 Spring 的 A ...
- 【Spring实战】—— 14 传统的JDBC实现的DAO插入和读取
从这篇开始学习Spring的JDBC,为了了解Spring对于JDBC的作用,先通过JDBC传统的流程,实现一个数据库的插入和读取. 从这篇你可以了解到: 1 传统的JDBC插入和读取的过程. 2 如 ...
- jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件
day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...
- 【JDBC核心】DAO 相关
DAO 相关 概念 DAO:Data Access Object 访问数据信息的类和接口,包括了对数据的 CRUD(Create.Retrival.Update.Delete),而不包含任何业务相关的 ...
- MySQL_(Java)【事物操作】使用JDBC模拟银行转账向数据库发起修改请求
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...
- JDBC——数据层DAO
DAO:Data Access Object DAO 数据层 Service 逻辑业务层 View 视图层 entity 实体层 实现增.删.改.查的数据层 public class EmpDA ...
- 反射实现增删改查(DAO层)——修改数据
先贴出代码,后续补充自己的思路.配置文件.使用方式: /** * * 修改数据 * */ @Override public void updateObject(Object object, Strin ...
随机推荐
- Eclipse+Maven整合开发Java项目(一)➣Maven基础环境配置
概述 Maven是一个Java语言编写的开源项目管理工具,是Apache软件基金会的顶级项目.主要用于项目构建,依赖管理,项目信息管理.有些项目需要添加响应的依赖包,Maven就是公用包集合.存在远程 ...
- centos 6.9安装python 3.6
.下载源码包在官网按照需要下载到本地 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz .解压源码包 tar -xvf Pyt ...
- 3. 深入研究 UCenter API 之 加密与解密(转载)
1. 深入研究 UCenter API 之 开篇 (转载) 2. 深入研究 UCenter API 之 通讯原理(转载) 3. 深入研究 UCenter API 之 加密与解密(转载) 4. ...
- Asp.net 与 UCenter 用户同步之实施过程
在写这篇文章的时候,我还在想,这篇文章也许能给你带来一些收获,但或许会令你更加的迷茫,为什么会这样?因为:1.UCenter虽然足够强大,但正为它的强大,它的不少暗箱操作使得我们望而生畏,我们不害怕出 ...
- sendfile
Sendfile 函数在两个文件描写叙述符之间直接传递数据(全然在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝. Sendfile 函数的定义 ...
- Codeforces 922F Divisibility 构造
Divisibility 我们考虑删数字 首先我们可以发现有一类数很特殊就是大于 n / 2的素数, 因为这些素数的贡献只有1, 并且在n大的时候, 这些素数的个数不是很少, 我们可以最后用这些数去调 ...
- Python自用笔记
函数:raw_input()和input() 注意:在python3.x中,已经删除raw_input(),取而代之的是input(),当然这仅仅是重命名,用法还是一样.因此在这里介绍的是python ...
- BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2219.html 题目传送门 - BZOJ2219 题意 求同余方程 $x^A\equiv B \pmo ...
- Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...
- html-背景图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...