DAO 相关

概念

DAO:Data Access Object 访问数据信息的类和接口,包括了对数据的 CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作 BaseDAO。

作用:为了实现功能的模块化,更有利于代码的维护和升级。

使用

表结构

DAO使用


package cn.parzulpan.jdbc.ch07.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.DbUtils; import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Properties; /**
* @Author : parzulpan
* @Time : 2020-12-02
* @Desc : 操作数据库的工具类,最终版
*/ public class JDBCUtils {
private static DataSource dataSource = null; static {
try {
Properties properties = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获取数据库连接,使用 Druid 数据库连接池
* @return 数据库连接
*/
public static Connection getDruidConnection() throws SQLException {
return dataSource.getConnection();
} /**
* 使用DbUtils,静默关闭数据库资源
* @param connection 数据库连接
* @param statement 声明
* @param resultSet 结果集
*/
public static void closeResourceQuietly(Connection connection, Statement statement, ResultSet resultSet) {
DbUtils.closeQuietly(connection);
DbUtils.closeQuietly(statement);
DbUtils.closeQuietly(resultSet);
} public static Date getSqlDate(String dateStr) {
java.sql.Date date = null;
try {
java.util.Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
date = new java.sql.Date(parse.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}

package cn.parzulpan.jdbc.ch07.dao;

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 java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; /**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : 对数据表的通用操作
*/ public abstract class BaseDAO<T> {
// 泛型的类型
private Class<T> type;
private QueryRunner queryRunner = new QueryRunner(); // 获取 T 类对象,获取泛型的类型,泛型是在被子类继承时才确定的
public BaseDAO() {
// 获取子类的类型
Class<? extends BaseDAO> clazz = this.getClass(); // 获取父类的类型
ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass(); // 获取具体的泛型
Type[] types = parameterizedType.getActualTypeArguments(); this.type = (Class<T>)types[0];
} /**
* 通用的增删改操作
* @param connection 数据库连接
* @param sql sql 语句
* @param args 参数
* @return 更新的条数
*/
public int update(Connection connection, String sql, Object ... args) {
int update = 0;
try {
update = queryRunner.update(connection, sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
return update;
} /**
* 通用的查询操作
* @param connection 数据库连接
* @param sql sql 语句
* @param args 参数
* @return 返回一个对象
*/
public T getBean(Connection connection, String sql, Object ... args) {
T t = null;
BeanHandler<T> beanHandler = new BeanHandler<>(type);
try {
t = queryRunner.query(connection, sql, beanHandler, args);
} catch (SQLException e) {
e.printStackTrace();
}
return t;
} /**
* 通用的查询操作
* @param connection 数据库连接
* @param sql sql 语句
* @param args 参数
* @return 返回一个对象列表
*/
public List<T> getBeanList(Connection connection, String sql, Object ... args) {
List<T> list = null;
BeanListHandler<T> beanListHandler = new BeanListHandler<>(type);
try {
list = queryRunner.query(connection, sql, beanListHandler, args);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
} /**
* 查询特殊值,类似于最大的,最小的,平均的,总和,个数相关的操作
* @param connection 数据库连接
* @param sql sql 语句
* @param args 参数
* @return 特殊值
*/
public Object getValue(Connection connection, String sql, Object ... args) {
Object obj = null;
ScalarHandler scalarHandler = new ScalarHandler();
try {
obj = queryRunner.query(connection, sql, scalarHandler, args);
} catch (SQLException e) {
e.printStackTrace();
}
return obj;
}
}

package cn.parzulpan.jdbc.ch07.dao;

import cn.parzulpan.jdbc.ch07.bean.Customer;

import java.sql.Connection;
import java.sql.Date;
import java.util.List; /**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : 此接口用于规范 customers 表的常用操作
*/ public interface CustomerDAO { /**
* 将 customer 对象添加到数据库中
* @param connection 数据库连接
* @param customer customer 对象
*/
void insert(Connection connection, Customer customer); /**
* 用 customer 对象修改数据库对应的数据中
* @param connection 数据库连接
* @param customer customer 对象
*/
void update(Connection connection, Customer customer); /**
* 根据 Id 删除一条记录
* @param connection 数据库连接
* @param id
*/
void deleteById(Connection connection, int id); /**
* 根据 Id 查询一条记录
* @param connection 数据库连接
* @param id
* @return
*/
Customer getCustomerById(Connection connection, int id); /**
* 查询多条记录
* @param connection 数据库连接
* @return
*/
List<Customer> getCustomerList(Connection connection); /**
* 查询记录条数
* @param connection 数据库连接
* @return
*/
Long getCount(Connection connection); /**
* 查询最大的生日记录
* @param connection 数据库连接
* @return
*/
Date getMaxBirth(Connection connection); }

package cn.parzulpan.jdbc.ch07.impl;

import cn.parzulpan.jdbc.ch07.bean.Customer;
import cn.parzulpan.jdbc.ch07.dao.BaseDAO;
import cn.parzulpan.jdbc.ch07.dao.CustomerDAO; import java.sql.Connection;
import java.sql.Date;
import java.util.List; /**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc :
*/ public class CustomerDAOImpl extends BaseDAO<Customer> implements CustomerDAO {
/**
* 将 customer 对象添加到数据库中
*
* @param connection 数据库连接
* @param customer customer 对象
*/
@Override
public void insert(Connection connection, Customer customer) {
String sql = "insert into customers(name, email, birth)values(?,?,?)";
update(connection, sql, customer.getName(), customer.getEmail(), customer.getBirth());
} /**
* 用 customer 对象修改数据库对应的数据中
*
* @param connection 数据库连接
* @param customer customer 对象
*/
@Override
public void update(Connection connection, Customer customer) {
String sql = "update customers set name = ?, email = ?, birth = ? where id = ?";
update(connection, sql, customer.getName(), customer.getEmail(), customer.getBirth(), customer.getId());
} /**
* 根据 Id 删除一条记录
*
* @param connection 数据库连接
* @param id
*/
@Override
public void deleteById(Connection connection, int id) {
String sql = "delete from customers where id = ?";
update(connection, sql, id);
} /**
* 根据 Id 查询一条记录
*
* @param connection 数据库连接
* @param id
* @return
*/
public Customer getCustomerById(Connection connection, int id) {
String sql = "select id, name, email, birth from customers where id = ?";
return getBean(connection, sql, id);
} /**
* 查询多条记录
*
* @param connection 数据库连接
* @return
*/
@Override
public List<Customer> getCustomerList(Connection connection) {
String sql = "select id, name, email, birth from customers";
return getBeanList(connection, sql);
} /**
* 查询记录条数
*
* @param connection 数据库连接
* @return
*/
@Override
public Long getCount(Connection connection) {
String sql = "select count(*) from customers";
return (Long) getValue(connection, sql);
} /**
* 查询最大的生日记录
*
* @param connection 数据库连接
* @return
*/
@Override
public Date getMaxBirth(Connection connection) {
String sql = "select max(birth) from customers";
return (Date) getValue(connection, sql);
}
}

package cn.parzulpan.jdbc.ch07.junit;

import cn.parzulpan.jdbc.ch07.bean.Customer;
import cn.parzulpan.jdbc.ch07.impl.CustomerDAOImpl;
import cn.parzulpan.jdbc.ch07.util.JDBCUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.sql.Connection;
import java.sql.Date;
import java.sql.SQLException;
import java.util.List; import static org.junit.Assert.*; /**
* @Author : parzulpan
* @Time : 2020-12-02
* @Desc :
*/ public class CustomerDAOImplTest { @Before
public void setUp() throws Exception {
System.out.println("CustomerDAOImplTest Before");
} @After
public void tearDown() throws Exception {
System.out.println("CustomerDAOImplTest Down");
} private CustomerDAOImpl customerDAO = new CustomerDAOImpl(); @Test
public void insert() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection();
Customer customer = new Customer(30, "DAO", "dao@163.com", JDBCUtils.getSqlDate("1995-1-1"));
customerDAO.insert(connection, customer);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResourceQuietly(connection, null, null);
}
} @Test
public void update() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection();
Customer customer = new Customer(24, "DAOUpdate", "dao@163.com", JDBCUtils.getSqlDate("1995-1-1"));
customerDAO.update(connection, customer);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResourceQuietly(connection, null, null);
}
} @Test
public void deleteById() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection();
customerDAO.deleteById(connection, 23);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResourceQuietly(connection, null, null);
}
} @Test
public void getCustomerById() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection();
Customer customer = customerDAO.getCustomerById(connection, 10);
System.out.println(customer);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResourceQuietly(connection, null, null);
}
} @Test
public void getCustomerList() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection();
List<Customer> customers = customerDAO.getCustomerList(connection);
customers.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResourceQuietly(connection, null, null);
}
} @Test
public void getCount() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection();
Long count = customerDAO.getCount(connection);
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResourceQuietly(connection, null, null);
}
} @Test
public void getMaxBirth() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection();
Date maxBirth = customerDAO.getMaxBirth(connection);
System.out.println(maxBirth);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResourceQuietly(connection, null, null);
}
}
}

练习和总结

【JDBC核心】DAO 相关的更多相关文章

  1. Unit02: JDBC核心API

    Unit02: JDBC核心API db.properties 注意:如果使用连接池,可以在这个文件中增加对连接池的相关设置: 连接池参数,常用参数有: 初始连接数 最大连接数 最小连接数 每次增加的 ...

  2. 关于案例中核心dao的解释

    很多小伙伴不太理解核心dao,说这是干什么的,接下来我将一一为大家解答: 1.说到核心dao不得不说到单表操作,单表操作顾名思义是对单张数据库表的CRUD操作,实际情况中我们追求将表与表的关系映射到对 ...

  3. JDBC核心API

    JDBC核心API在java.sql.*和javax.sql.* 1.Driver接口:表示Java驱动程序接口,具体的数据库厂商要实现其此接口 connect(url.propertis):连接数据 ...

  4. [课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版

    (课本P273-任务九) /**DAO: Data Access Object * 为什么用: 实现功能的模块化,更有利于代码的维护和升级 * 是什么: 访问数据信息的类,包含对数据的CRUD(cre ...

  5. 关于mysql,需要掌握的基础(二):JDBC和DAO层

    ​ 目录 关于mysql,需要掌握的基础(二):JDBC和DAO层 1.了解jdbc是什么? 2.加载注册驱动:为什么Class.forName("com.mysql.jdbc.Driver ...

  6. Java 核心内容相关面试题【3】

    目录 面向对象编程(OOP) 常见的Java问题 Java线程 Java集合类 垃圾收集器 异常处理 Java小应用程序(Applet) Swing JDBC 远程方法调用(RMI) Servlet ...

  7. Jdbc与Dao和Javabean的区别

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  8. JDBC、DAO

    JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力 JDBC的工作原理 JDBC 驱动器由数据库厂商提供 1.在个人开发与测试中,可以使用JDBC-ODBC桥连方式 2.在生产型开发 ...

  9. JDBC中DAO事务函数模版

    DAO事物函数模版1: public void OrderFinsByPage(){ Connection conn = null; PreparedStatement pstmt = null; R ...

随机推荐

  1. 【题解】「CF1182B」Plus from Picture

    这是一道超级水的模拟 + 简单搜索. 说说思路: 先找到中心点,就是自己和上下左右都为 * 的. 上下左右上的所有 * 都删掉,然后再看看有没有多余的 * 如果有输出 NO 否则输出 YES. 比如说 ...

  2. 深入理解Java虚拟机(一)——JVM内存模型

    文章目录 程序计数器 定义 作用 特点 Java虚拟机栈 定义 特点 本地方法栈 定义 Java堆 定义 特点 方法区 定义 特点 运行常量池 直接内存 总结 Java虚拟机的内存空间分为五个部分: ...

  3. 横向无文件移动--SCshell使用

    1.简介 SCShell是无文件横向移动工具,它依赖ChangeServiceConfigA来运行命令.该工具的优点在于它不会针对SMB执行身份验证.一切都通过DCERPC执行.无需创建服务,而只需通 ...

  4. .NET5下的三维应用程序开发

    终于等到了.NET5的发布,怀着激动的心情体验了一下:"香"就一个字. 如何基于.NET5开发工业软件,也广大三维应用开发者关心的问题.我们的Rapid SDK已经率先支持.NET ...

  5. Java File类的简单使用

    Java File的简单使用(创建.删除.遍历.判断是否存在等) Java文件类以抽象的方式代表文件名和目录路径名.该类本身不能用来读数据或写数据,它主要用于磁盘上文件和目录的创建.文件的查找和文件的 ...

  6. 【Harbor学习笔记】-教你快速搭建Docker私有仓库

    目录 架构图 Harbor依赖的外部组件 Harbor自有组件 核心组件 安装 1. 下载离线安装包 2. 配置 harbor.cfg (harbor.yml) 3. 启动 Harbor 安装配置问题 ...

  7. [打基础]luogu1957口算练习题——字符串基本操作

    题意:第一行给出数据组数n,之后n行每行给出三个或两个数据,若给三个数据,则第一个数据用单个字符a/b/c分别表示+/-/*运算,后两个数表示参与运算的数字,若给两个数据延续之前的运算 要求对每行数据 ...

  8. Jmeter二次开发——基于Java请求

    简述 这近几年,越来越多非http的协议需要进行性能测试,包括不仅限于各类rpc.mq.缓存等.对于这些协议,市面上可能没有现成的工具可以直接使用,这个时候,我们可以自己动手,通过编写相应的JavaS ...

  9. Web常用编码以及攻击绕过笔记

    一.URL编码形式:"%"加上ASCII码(先将字符转换为两位ASCII码,再转为16进制),其中加号"+"在URL编码中和"%20"表示一 ...

  10. ASP.NET Core 3.1使用log4net/nlog/Serilog记录日志

    Serilog中的结构化日志支持非常好,而且配置简便.我能够比其他任何人更轻松地启动和运行Seirlog.Serilog中的日志可以发送到很多目的地.Serilog称这些东西为"接收器&qu ...