DAO模式的理解

目录

DAO模式 含义

DAO模式 的理解

分层思维

分层含义

分层目的

dao层

dao包(对接的是操作数据库的接口)

dao包下lmpl 包(dao包中接口的实现类)

补充

1 你创建的实体类需要和数据库中建的表一一对应。

总结


DAO模式 含义

数据访问对象(Data Access Object)模式,是一种设计模式,主要用于将业务逻辑与数据访问代码分离,以提高代码的模块化、可维护性和可测试性

DAO模式 的理解

理解DAO模式,我认为最为重要的:理解分层思维

分层思维

分层含义

  • 将系统分解成多个层次,每个层次都有明确的职责和功能,并且层次之间通过定义良好的接口进行交互
  • 我认为应该把,同一功能/同一技术类型的类,放在同一包下

例如,Java分为经典三层模型

经典的三层架构(表现层、业务逻辑层、数据访问层)

  • 表现层:负责用户界面和用户交互,如Web页面、桌面应用界面等。
  • 业务逻辑层:处理业务规则和业务流程,如订单处理、用户认证等。
  • 数据访问层:负责数据的持久化,如数据库操作。
  • 以下是一些常见的
  1. web层:表现层负责用户界面和用户交互,如Web页面、桌面应用界面
  2. service层:业务逻辑层(主要处理业务,逻辑代码,数据加工,条件判断)
  3. dao层:数据访问层,封装与数据库操作
  4. entity/domain..层 实体类(对应的数据库的表的类)
  5. util :工具类(如jdbcUtil 封装 连接的数据库的一些操作)

分层目的

1 技术隔离

  • 比如dao层使用的技术jdbc jdbc中的核心的api 类 不能在其他的类出现

2 不能跨层调用

如下图 展示的:

dao层

数据访问层,封装数据库的操作

  • dao包(对接的是操作数据库的接口)
  • dao包下lmpl 包(dao包中接口的实现类)
dao包(对接的是操作数据库的接口)

StudentDao 接口实例代码

// 查询public Student showStudent(int id);//查询所有学生public List<Student> showAllStudent();// 删除public boolean delete(int id);// 修改public boolean update(Object...params);// 添加public boolean add(Object...params);

UserDao接口实例代码

// 登录int  login( String username, String password);// 注册int  register(String username, String password);
dao包下lmpl 包(dao包中接口的实现类)
  • StudentDaoImpl类 实现StudentDao 接口
  •  UserDaoImpl 类    实现UserDao接口

StudentDaoImpl 实例代码

package it.dao.impl;import it.Util.jdbcUtil;
import it.dao.StudentDao;
import it.dao.UserDao;
import it.entity.Student;import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @Author: Administrator* @Description:* @Date: 2024/11/8 下午4:54* @Version: 1.0*/
public class StudentDaoImpl implements StudentDao {Scanner input = new java.util.Scanner(System.in);/**  根据id查询学生*/@Overridepublic Student showStudent(int id) {String sql = "select stuId, stuName, stuSex, stuAge  from student where stuId=?";String stuName = null;int stuAge = 0;int stuId = 0;String stuSex = null;try {ResultSet resultSet = jdbcUtil.executeQuery(sql, id);if (resultSet.next()) {stuId = resultSet.getInt("stuId");stuName = resultSet.getString("stuName");stuSex = resultSet.getString("stuSex");stuAge = resultSet.getInt("stuAge");return new Student(stuName, stuAge, stuSex, stuId);} else {System.out.println("该学生不存在");return null;}} catch (SQLException e) {throw new RuntimeException(e);}}/**  查询所有学生*/@Overridepublic List<Student> showAllStudent() {String sql = "select stuId, stuName, stuSex, stuAge  from student";List<Student> list = new ArrayList<>();try {Connection conn = jdbcUtil.getConnection();Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()) {int stuId = resultSet.getInt("stuId");String stuName = resultSet.getString("stuName");String stuSex = resultSet.getString("stuSex");int stuAge = resultSet.getInt("stuAge");Student student = new Student(stuName, stuAge, stuSex, stuId);list.add(student);}} catch (SQLException e) {throw new RuntimeException(e);}return list;}/*删除学生信息*/@Overridepublic boolean delete(int id) {String sql = "delete from student where stuId=?";int i = jdbcUtil.executeUpdate(sql, id);if (i > 0) {return true;}return false;}@Overridepublic boolean update(Object... params) {String sql = "update student set stuName=?,stuAge=?,stuSex=? where stuId=?";int i = jdbcUtil.executeUpdate(sql, params);if (i > 0) {return true;} else {return false;}}/*
添加学生信息
*/@Overridepublic boolean add(Object... params) {String sql = "insert into student(stuName,stuSex,stuAge) values(?,?,?)";int i = jdbcUtil.executeUpdate(sql, params);if (i > 0) {return true;} else {return false;}}
}

 UserDaoImpl 类的实例代码

package it.dao.impl;import it.Util.jdbcUtil;
import it.dao.StudentDao;
import it.dao.UserDao;import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @Author: Administrator* @Description:* @Date: 2024/11/9 下午4:20* @Version: 1.0*/
public class UserDaoImpl implements UserDao {/** 登录*/@Overridepublic int  login( String username, String password) {String sql = "select username,pwd from user where username=? and pwd=?";ResultSet resultSet = null;try {resultSet = jdbcUtil.executeQuery(sql, username, password);if (resultSet.next()) {return 0;} else {return 1;}} catch (SQLException e) {throw new RuntimeException(e);}}
/*注册*/@Overridepublic int  register(String username, String password) {String sql = "insert into user(username,pwd) values(?,?)";Date date = new Date(System.currentTimeMillis());int i = jdbcUtil.executeUpdate(sql, username, password);if (i > 0) {return 1;} else {return 0;}}
}

补充

1 你创建的实体类需要和数据库中建的表一一对应。

如下图所示:

数据库的字段类型实体类的属性数据类型
char/varchar/text[文本型]String
int [数值型]Integer
bigintLong
doubleDouble
decimalBigDecimal

注意:数据库中 data/time/datetime 字段类型 ,对应在Java中有两种形式:

  •  Java.util.Date
  • java.sql.Date

但我们推荐使用Java.util.Date

原因

这里 存在向上转型:Java.util.Date 是java.sql.Date 的父类

总结

本篇博客,简单的介绍了DAO模式。但我认为这是远远不够的在之后的学习中,还无法理解其中的精髓。因此在之后的学习中,我会及时补充

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大健康零售行业帮助中心的构建与客户服务优化

在大健康零售行业&#xff0c;客户服务的质量直接影响着企业的品牌形象和市场竞争力。随着数字化转型的推进&#xff0c;构建一个高效、智能的帮助中心成为了提升客户服务和满意度的关键。本文将分析大健康零售行业如何通过构建帮助中心来优化客户服务&#xff0c;并提升客户满…

【JWT】Asp.Net Core中JWT刷新Token解决方案

Asp.Net Core中JWT刷新Token解决方案 前言方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status === 401,说明我们的token已经过期了。方案二:实现用户无感知的刷新token值,我们希望当响应返回的数据是401身份过期时,响应阻拦器自动帮我…

Error: error:0308010C:digital envelope routines::unsupported

目录 1、前言2、详细问题3、解决方法3.1、nodejs版本降级3.2、针对openssl设置环境变量3.3、在package.json命令里添加设置 4、效果 1、前言 2024年11月某一天&#xff0c;升级了电脑上的nodejs版本&#xff1a;v22.11.0。 本来运行正常的Vue项目&#xff0c;在运行时突然就报…

win10@win10 配置openssh服务

1.下载离线包&#xff1a;https://github.com/PowerShell/Win32-OpenSSH/releases 2.然后管理员打开powershell&#xff0c;cd到这个安装包放置的目录中来&#xff0c;输入以下命令&#xff1a;powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 此时要注意pow…

优化SEO关键词提升网站曝光度的有效策略

内容概要 在当今数字营销领域&#xff0c;SEO关键词优化的重要性愈发凸显。有效的关键词优化不仅关乎搜索引擎排名&#xff0c;还直接影响到网站的曝光度与流量来源。首先&#xff0c;明确目标受众在搜索引擎中使用的关键词是提高网站能见度的基石。正确的关键词可以帮助网站吸…

Git 不要只会 pull 和 push,搞上 5 个提升效率的命令!

文章目录 Git 不要只会 pull 和 push&#xff0c;搞上 5 个提升效率的命令&#xff01;1. git stash —— 暂存修改&#xff0c;快速切换分支2. git cherry-pick —— 单独拣选特定提交3. git rebase —— 整理提交历史&#xff0c;让提交记录更清晰4. git reset —— 恢复到指…

ONLYOFFICE 快速部署教程:让你的私有云盘也可以预览和编辑 Office 文档

ONLYOFFICE Docs (原 ONLYOFFICE Document Server) 是一款强大的开源在线办公套件&#xff0c;包含用于文本、电子表格和演示文稿的查看器和编辑器&#xff0c;完全兼容 Office Open XML 格式&#xff08;.docx、.xlsx、.pptx&#xff09;&#xff0c;并支持实时协作编辑。本文…

【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程

1. 简介 ESP32支持5种低功耗模式&#xff0c;低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。 1.1 RTC单元 RTC单元是ESP32低功耗管理的核心&#xff0c;可用于管理低功耗模式的进入和退出&#xff0c;控制时钟源、PLL、电源开…

SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介 Blob&#xff08;Binary Large Object&#xff09;是一种用于存储二进制数据的数据类型&#xff0c;在数据库中常用于存储图片、音频和视频等大型&#xff08;大数据量&#xff09;的二进制数据[1-2]。需要注意的是&#xff0c;SQLite中BLOB类型的单对象最…

如何利用低代码平台进行创业?开启你的数字化转型之旅

在当今这个飞速发展的数字化时代&#xff0c;低代码开发已经成为企业加速业务流程、提升运营效率的关键手段之一。它不仅简化了软件开发过程&#xff0c;使得非技术人员也能参与到应用程序的构建中来&#xff0c;还为企业和个人提供了更加灵活、高效的创业路径。本文将探讨如何…

从0开始深度学习(28)——序列模型

序列模型是指一类特别设计来处理序列数据的神经网络模型。序列数据指的是数据中的每个元素都有先后顺序&#xff0c;比如时间序列数据&#xff08;股票价格、天气变化等&#xff09;、自然语言文本&#xff08;句子中的单词顺序&#xff09;、语音信号等。 1 统计工具 前面介绍…

Xcode无线真机调试

文章目录 Xcode无线真机调试前提条件无线真机调试 Xcode无线真机调试 前提条件 iPhone和Xcode连接在同一WIFI下&#xff1b;或 Xcode通过iPhone的IP地址进行连接&#xff1b;Xcode版本支持无线调试功能&#xff1b; 无线真机调试 首次使用&#xff0c;需要通过数据线连接MAC…

暴雨讲堂|AI算力芯片王者GPGPU是什么?

在AI飞速发展的这几年&#xff0c;市场上涌现一大批诸如DPU、NPU、TPU、IPU等“XPU”的新概念&#xff0c;是真的存在不同的架构&#xff0c;还是只是一些厂商营销出来的噱头&#xff1f;事实上&#xff0c;从CPU的发展角度来看&#xff0c;这些XPU都不是真正的处理器。相反&am…

行车记录打不开?原因分析与数据恢复全攻略

行车记录遭遇困境 行车记录仪&#xff0c;作为现代驾驶中的重要设备&#xff0c;不仅能够帮助我们记录行车过程&#xff0c;还能在关键时刻提供有力的证据。然而&#xff0c;当行车记录突然打不开时&#xff0c;这无疑给车主们带来了不小的困扰。行车记录打不开&#xff0c;可…

SpringMVC总结 我的学习笔记

SpringMVC总结 我的学习笔记 一、SpringMVC简介1.MVC2.SpringMVC概述3. SpringMVC中的核心组件4.SpringMVC核心架构流程 二、SpringMVC框架实例具体实现使用注解实现 四、数据处理及跳转1.结果跳转方式2.处理器方法的参数与返回值处理提交数据数据显示到前端 五、RestFul风格1.…

云计算基础1

声明 学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 云计算基础概念 一、云计算的定义 云计算是一种资源交付和使用模式&#xff0c;指通过网络获得应用所需的…

Guava限流神器:RateLimiter使用指南

1. 引言 可能有些小伙伴听到“限流”这个词就觉得头大&#xff0c;感觉像是一个既复杂又枯燥的话题。别急&#xff0c;小黑今天就要用轻松易懂的方式&#xff0c;带咱们一探RateLimiter的究竟。 想象一下&#xff0c;当你去超市排队结账时&#xff0c;如果收银台开得越多&#…

被复线远传节点机JR-IPAM-1600

产品描述 JR-IPAM-1600J是一款被复线远传节点机&#xff0c;通过传统双绞线电缆&#xff08;被复线\网线\对数电缆\矿用电缆等&#xff09;&#xff0c;用户就可以快速组成一个高速的传输网、局域网。它具有传输速率高、运行稳定、快速安装部署的特点&#xff0c;设备特有的AU…

【React】React 生命周期完全指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 React 生命周期完全指南一、生命周期概述二、生命周期的三个阶段2.1 挂载阶段&a…

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系&#xff1b; 平时在dev环境开发时&#xff0c;会把自己的本地服务也注册上去&#xff0c;但是这样的话&#xff0c;在客户端调用时请求可能会打到自己本地&#xff0c;对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…