DAO 学习笔记

文章目录

  • 什么是 DAO?
  • 如何写 DAO?
  • 示例代码

什么是 DAO?

Data Access Object(DAO),数据访问对象/数据存取对象。DAO 是封装数据库访问逻辑的组件/类 。

定义一个类,这个类中的方法封装了数据库访问逻辑,要访问数据库时,只要调用DAO相关的方法就可以了,调用者(一般是业务逻辑模块,即控制器)不需要了解底层的数据访问细节就可以实现数据访问。这样一来,当底层的数据访问细节发生改变,不 会影响到调用者。

DAO 可以设计成单例模式,因为往往我们只是调用 DAO 的方法获取数据库中的数据,里面没有成员变量,所以没有必要创建多个 DAO 对象。

如何写 DAO?

  1. 写实体类和数据表对应
    为了方便处理数据库中的记录,可以定义与表记录对应的实体类,即该类对象与数据表中的每条记录一一对应,或者说可以将数据库中的某条记录转换成一个实体类的实例
    比如 Employee 类,提供 id,name,salary,age 属性及相关的 get/set 方法,我们可以将 employee 表中的记录转化成一个 Employee 对象。

  2. 写 DAO 接口,声明一些方法
    写 DAO 接口,声明一些数据访问方法,例如:删除记录、增加记录、修改记录等。这些方法不要涉及具体的技术。
    例如,声明了以下的方法:
    public void save(Employee e) throws SQLException;
    这种方式不好,因为出现了 jdbc 的异常类,这就要求实现该方法只能使用 jdbc。 换一种方式来声明更好,如下:
    public void save(Employee e) throws Exception;
    public List<Employee> findAll() throws Exception;

  3. 写 DAO 实现类
    再写 DAO 实现类,采用具体的技术实现 DAO 接口有关的方法,且这些方法会用到实体类对象,并封装好与数据库连接的代码及有关的业务代码
    例如:
    使用 jdbc 实现 EmployeeDAO 接口,写一个实现类 EmployeeDAOJdbcImpl。

  4. 写 DAO 工厂类(即工厂模式)
    写工厂类,通过属性文件(.properties)来配置不同的参数,从而可以获取不同技术实现的DAO对象。

工厂类:封装了对象的创建细节,为调用者提供符合要求的对象。
工厂模式可以通过简单的配置文件管理 DAO 的实现类。

示例代码

DAO接口:

package priv.lwx.servlet.dao;import priv.lwx.servlet.entity.Employee;import java.util.List;/*** 定义DAO接口** @author liaowenxiong* @date 2022/3/14 09:43*/public interface EmployeeDAO {void save(Employee e) throws Exception;void delete(int id) throws Exception;void update(Employee e) throws Exception;Employee findById(int id) throws Exception;List<Employee> findAll() throws Exception;}

DAO实现类:

package priv.lwx.servlet.dao.impl;import priv.lwx.servlet.dao.EmployeeDAO;
import priv.lwx.servlet.entity.Employee;
import priv.lwx.servlet.util.ConnectionUtils;import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;/*** EmployeeDAO的实现类,使用JDBC技术实现** @author liaowenxiong* @date 2022/3/14 09:54*/public class EmployeeDAOJdbcImpl implements EmployeeDAO {/*** 新增雇员** @param e 要新增的雇员数据* @throws Exception*/@Overridepublic void save(Employee e) throws Exception {String sql = "insert into emp(name,salary,age) values(?,?,?)";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = null;pstmt = conn.prepareStatement(sql);pstmt.setString(1, e.getName());pstmt.setBigDecimal(2, e.getSalary());pstmt.setByte(3, e.getAge());pstmt.executeUpdate();ConnectionUtils.close(pstmt, conn);}/*** 根据雇员ID删除雇员** @param id* @throws Exception*/@Overridepublic void delete(int id) throws Exception {String sql = "delete from emp where id=?";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, id);pstmt.executeUpdate();ConnectionUtils.close(pstmt, conn);}/*** 更新某个雇员信息** @param e* @throws Exception*/@Overridepublic void update(Employee e) throws Exception {String sql = "update emp set name=?,salary=?,age=? where id=?";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, e.getName());pstmt.setBigDecimal(2, e.getSalary());pstmt.setByte(3, e.getAge());pstmt.setInt(4, e.getId());pstmt.executeUpdate();ConnectionUtils.close(pstmt, conn);}/*** 根据雇员ID查询雇员信息** @param id* @return* @throws Exception*/@Overridepublic Employee findById(int id) throws Exception {String sql = "select * from emp where id=?";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, id);ResultSet rs = pstmt.executeQuery();rs.next();String name = rs.getString("name");BigDecimal salary = rs.getBigDecimal("salary");byte age = rs.getByte("age");Employee e = new Employee();e.setId(id);e.setName(name);e.setSalary(salary);e.setAge(age);return e;}/*** 查询所有雇员的信息** @return* @throws Exception*/@Overridepublic List<Employee> findAll() throws Exception {String sql = "select * from emp";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);ResultSet rs = pstmt.executeQuery();List<Employee> emps = new ArrayList<>();while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");BigDecimal salary = rs.getBigDecimal("salary");byte age = rs.getByte("age");Employee e = new Employee();e.setId(id);e.setName(name);e.setSalary(salary);e.setAge(age);emps.add(e);}return emps;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dc/os_DC / OS中具有Java和数据库应用程序的服务发现

dc/os该博客将展示一个简单的Java应用程序如何使用DC / OS中的服务发现与数据库进行对话。 为什么要进行服务发现&#xff1f; 应用程序通常由多个组件组成&#xff0c;例如应用程序服务器&#xff0c;数据库&#xff0c;Web服务器&#xff0c;缓存和消息传递服务器。 通常&am…

python进阶项目设计_Python进阶循环设计

之前在“循环”一节&#xff0c;我们已经讨论了Python最基本的循环语法。这一节&#xff0c;我们将接触更加灵活的循环方式。1. 利用range(), 得到下标在Python中&#xff0c;for循环后的in跟随一个序列的话&#xff0c;循环每次使用的序列元素&#xff0c;而不是序列的下标。之…

python调试器入门教程_PyCharm入门第一步(二)——调试第一个Python应用|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/第2步&#xff1a;调试您的第一个Python应用程序找出问题的根源PyCharm报告运行时错误&#xff1a;a ZeroDivisionError。深入研究一下代码&#xff0c;找出问题所在。这里可以使用PyCharm调试器来查看代码中发生了什么。要开始…

Struts2请求处理的内部流程图/结构图/原理图(版本二)

文章目录请求处理流程图流程说明请求处理流程图 流程说明 第 1 步&#xff1a; 客户端初始化一个指向 Servlet 容器&#xff08;例如 Tomcat&#xff09;的请求&#xff0c;例如&#xff1a;在浏览器中输入 http:localhost:8080/Struts2/helloworld/helloworldAction.action …

jboss 配置上下文路径_为单个Web应用程序配置多个上下文根– JBoss

jboss 配置上下文路径有时&#xff0c;我们通过在jboss-web.xm l中定义一个来对应用程序进行更改&#xff0c;以支持利用JBoss功能的多个上下文根&#xff0c;如下所示&#xff1a; webapp / WEB-INF / jboss-web.xml&#xff1a; <?xml version"1.0" encoding…

xampp mysql 查询很慢_如何开启mysql的慢查询机制

1 在mysql中默认是不会开启慢查询日志功能的&#xff0c;我们可以使用show variables like ‘%slow%‘来查看一下。结果如下&#xff1a;参数说明&#xff1a;log_slow_queries表示服务器端是否开启慢查询日志记录功能&#xff0c;slow_query_log表示mysql监测满查询的功能是否…

python3.7打包exe坑_[求助]入坑学习python 需要装pyinstaller打包成exe

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼E:\Python>pyinstaller -F E:\Python\123.py142 INFO: PyInstaller: 3.2.1142 INFO: Python: 3.5.3142 INFO: Platform: Windows-7-6.1.7601-SP1143 INFO: wrote E:\Python\123.spec144 INFO: UPX is not available.146 INFO: E…

uaa 授权_使用UAA OAuth2授权服务器–客户端和资源

uaa 授权在上一篇文章中&#xff0c;我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器&#xff0c;以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它。 我在Digital Ocean网站上发现这篇文章在描述OAuth2授权代码流方面做得很好&#xff0c;因此&#xf…

谈谈Java编程中的拦截器与过滤器的区别

拦截器是基于 Java 反射机制的&#xff0c;而过滤器是基于函数回调的。 过滤器依赖于 Servlet 容器&#xff0c;而拦截器不依赖于 Servlet 容器。 拦截器只能对 Action 请求起作用&#xff0c;而过滤器则可以对几乎所有请求起作用。 拦截器可以访问 Action 上下文、值栈里的…

电影推荐系统 python简书_文章推荐系统 | 十四、推荐中心

在前面的文章中&#xff0c;我们实现了召回和排序&#xff0c;接下来将进入推荐逻辑处理阶段&#xff0c;通常称为推荐中心&#xff0c;推荐中心负责接收应用系统的推荐请求&#xff0c;读取召回和排序的结果并进行调整&#xff0c;最后返回给应用系统。推荐中心的调用流程如下…

获取请求的url java_Java获取此次请求URL以及服务器根路径的方法

一、 获取此次请求的URLString requestUrl request.getScheme() //当前链接使用的协议"://" request.getServerName()//服务器地址 ":" request.getServerPort() //端口号 request.getContextPath() //应用名称&#xff0c;如果应用名称为 request.getS…

java 平台级模块系统_Java平台模块系统公众审查未能通过

java 平台级模块系统在过去的几周里&#xff0c;Java世界中的戏剧&#xff0c;阴谋和政治活动异常高涨&#xff0c;最终在本周的JSR 376 Java平台模块系统公共评审投票中达到了顶峰。 Java模块化&#xff08;包括Java平台模块系统&#xff08;JPMS&#xff09;&#xff09;可以…

ps背景不变换字_PS教程:复杂背景中,如何利用通道轻松抠出发丝?

点击图片 1元抢购 PS、PR、AE等课程活动无缝抠图复杂背景当我们常用的钢笔抠图解决不了细碎的头发丝时我们可以用通道进行抠图&#xff0c;换背景在复杂的背景中把头发丝抠出来配套PS素材请到QQ群&#xff1a;565256668下载首先打开素材&#xff0c;我们发现背景比较复杂&…

java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解

1.两种取值方式的差异mapper.xml映射文件select * from t_emp WHERE emp_id${id} and emp_name#{name}java查询代码 params 为 id1 ,name”小红”Testpublic void testSelect() {InputStream resourceAsStream ConfigTest.class.getResourceAsStream("../classes/mybatis…

阿里云 ram 容器镜像_容器中Java RAM的使用:不会丢失内存的5大技巧

阿里云 ram 容器镜像在本文中&#xff0c;我们希望分享Java内存管理的细节以及容器内部的弹性&#xff0c;这些细节乍一看并不明显。 在下面&#xff0c;您将找到要注意的问题列表以及即将发布的JDK版本中的重要更新&#xff0c;以及针对核心痛点的现有解决方法。 我们收集了5…

python 图表美化_你的图表不美观怎么办,Python实现数据可视化帮你实现

之前突然看到一个用Python实现数据可视化的技术&#xff0c;小编觉得解决了生活中的好多问题&#xff0c;大家一起来看看这个神器。1、主页首先&#xff0c;这个主页的设计就是我非常喜欢的风格&#xff0c;简单清晰&#xff0c;第一眼就让人有特别清爽的感觉&#xff0c;不愧是…

java堆内存剩余多少合理_Java堆内存的10个要点

我刚开始学习Java编程时&#xff0c;可不知道什么是堆内存或堆空间(heap space)&#xff0c;甚至根本不管对象创建时都放在哪里去了。正式了写一些程序后&#xff0c;经常会遇到java.lang.outOfMemoryError等错误&#xff0c;我才开始关注堆内存。对大多数程序员都经历过这样的…

Struts2请求处理的内部流程图/结构图/原理图(版本一)

流程说明&#xff1a; 1.客户端浏览器&#xff08;Client&#xff09;向服务器发送一个 http 请求&#xff08;HttpServletRequest&#xff09; 2.Container&#xff08;容器&#xff09; 通过 web.xml 映射请求&#xff0c;并获得控制器&#xff08;Controller&#xff09;的…

python求字符串的所有子集_打印一字符串的所有子集 | 学步园

#include#include#include#includeusing namespace std;void getSub(string src,int i,vector &result){//取子串方法:将串src中的第i个字符抠掉即为所求的子串assert(iif (src.length()<1){result.push_back(src);return;}src.erase(i,1); //删除从i开始的一个字符r…