【JDBC核心】DAO 相关
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 相关的更多相关文章
- Unit02: JDBC核心API
Unit02: JDBC核心API db.properties 注意:如果使用连接池,可以在这个文件中增加对连接池的相关设置: 连接池参数,常用参数有: 初始连接数 最大连接数 最小连接数 每次增加的 ...
- 关于案例中核心dao的解释
很多小伙伴不太理解核心dao,说这是干什么的,接下来我将一一为大家解答: 1.说到核心dao不得不说到单表操作,单表操作顾名思义是对单张数据库表的CRUD操作,实际情况中我们追求将表与表的关系映射到对 ...
- JDBC核心API
JDBC核心API在java.sql.*和javax.sql.* 1.Driver接口:表示Java驱动程序接口,具体的数据库厂商要实现其此接口 connect(url.propertis):连接数据 ...
- [课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版
(课本P273-任务九) /**DAO: Data Access Object * 为什么用: 实现功能的模块化,更有利于代码的维护和升级 * 是什么: 访问数据信息的类,包含对数据的CRUD(cre ...
- 关于mysql,需要掌握的基础(二):JDBC和DAO层
目录 关于mysql,需要掌握的基础(二):JDBC和DAO层 1.了解jdbc是什么? 2.加载注册驱动:为什么Class.forName("com.mysql.jdbc.Driver ...
- Java 核心内容相关面试题【3】
目录 面向对象编程(OOP) 常见的Java问题 Java线程 Java集合类 垃圾收集器 异常处理 Java小应用程序(Applet) Swing JDBC 远程方法调用(RMI) Servlet ...
- Jdbc与Dao和Javabean的区别
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- JDBC、DAO
JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力 JDBC的工作原理 JDBC 驱动器由数据库厂商提供 1.在个人开发与测试中,可以使用JDBC-ODBC桥连方式 2.在生产型开发 ...
- JDBC中DAO事务函数模版
DAO事物函数模版1: public void OrderFinsByPage(){ Connection conn = null; PreparedStatement pstmt = null; R ...
随机推荐
- 网络拓扑实例13:IPv4静态路由与NQA联动简介
组网图形 IPv4静态路由与NQA联动简介 网络质量分析NQA(Network Quality Analysis)是一种实时的网络性能探测和统计技术,可以对响应时间.网络抖动.丢包率等网络信息进行统计 ...
- 【SDOI2017】天才黑客(前后缀优化建图 & 最短路)
Description 给定一张有向图,\(n\) 个点,\(m\) 条边.第 \(i\) 条边上有一个边权 \(c_i\),以及一个字符串 \(s_i\). 其中字符串 \(s_1, s_2, \c ...
- oracle ADG启动顺序
一.oracle ADG启动顺序 1.启动主备库监听 [oracle@dgdb1 ~]$ lsnrctl start [oracle@dgdb2 ~]$ lsnrctl start 2.启动备库 ...
- dataframe的一些用法
pandas中Dataframe的一些用法 pandas读取excel文件 pd.read_excel 前提是安装xlrd库 dataframe,numpy,list之间的互相转换 dataframe ...
- vue seo 优化
预渲染prerender-spa-plugin 如果你只是用来改善少数营销页面(例如 /, /about, /contact 等)的 SEO,那么你可能需要预渲染.无需使用 web 服务器实时动态编译 ...
- Mybatis(二)--SqlMapConfig.xml配置文件
一.简介 SqlMapConfig.xml是Mybatis的全局配置文件,我们在写mybatis项目时,在SqlMapConfig.xml文件中主要配置了数据库数据源.事务.映射文件等,其实还有很多配 ...
- 深入解析 C# 的 String.Create 的方法
作者:Casey McQuillan 译者:精致码农 原文:http://dwz.win/YVW 说明:原文比较长,翻译时精简了很多内容,对于不重要的细枝末节只用了一句话概括,但不并影响阅读. 你还记 ...
- Java及Javascript中的浮点运算
在进行金额计算,及某些精确计算时,会出现意想不到的很多小数的情况. 对Java 采用BigDecimal,如下代码示例 package number; import java.math.BigDeci ...
- Spark性能调优篇一之任务提交参数调整
问题一:有哪些资源可以分配给spark作业使用? 答案:executor个数,cpu per exector(每个executor可使用的CPU个数),memory per exector(每个exe ...
- mysqldump 导出命令
在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...