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. POJ3565

    题目大意: 给定\(n\)个蚂蚁和\(n\)颗苹果树的坐标,要求每个蚂蚁爬到一颗苹果树旁,使得每个蚂蚁路线不相交且路线总长度最小,求每个蚂蚁爬到哪个苹果树旁? 首先假设有两只蚂蚁路径相交,那么这两个蚂 ...

  2. nginx学习之——CentOS6.0下安装nginx

    1.下载对应nginx版本 #注:下载地址:http://nginx.org/download/ wget -c http://nginx.org/download/nginx-1.10.3.tar. ...

  3. 四、java多线程核心技术——synchronized同步方法与synchronized同步快

    一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变 ...

  4. 下载windows官网镜像并打包成iso文件

    一.微软官网下载镜像地址:https://www.microsoft.com/zh-cn/software-download/ 选择所需下载的win10.win7等windows镜像(以win10为例 ...

  5. css进阶 06-CSS开发积累

    06-CSS开发积累 #让flex盒子中的子元素们,居中 flex布局常用的三行代码: display: flex; justify-content: center; // 子元素在横轴的对齐方式 ( ...

  6. react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)

    第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...

  7. Python高级语法-贯彻回顾-元类(4.99.1)

    @ 目录 1.为什么要掌握元类 2.正文 关于作者 1.为什么要掌握元类 在django中编写models的时候遇到了元类的相关操作 并且在mini-web框架编写的时候也遇到了相关的问题 意识到深入 ...

  8. CSS练习 —— css选择器

    CSS选择器就是 通过选择器来 定位 你要控制的样式的部分,分为以下几种 1.HTML选择符(标签选择器) 就是把HTML标签作为选择符使用 如 p {.......} 网页中所有的P标签采用此样式 ...

  9. Open_basedir绕过

    Open_basedir绕过 一.基础知识 open_basedir是php.ini中的一个配置选项,它可将用户访问文件的活动范围限制在指定的区域, 假设open_basedir=/home/wwwr ...

  10. UWP 实现Tab导航首页

    先看效果: 这个是用Pivot来实现 1.自定义Pivot的样式,使用Blend工具生成模板,将HeaderTemplate的布局都隐藏 1 <Style x:Key="PivotSt ...