DAO设计模式
概念:DAO(Data Access Object) 数据库访问对象,**面向数据库SQL操作**的封装。
(一)场景
问题分析
在实际开发中,针对一张表的复杂业务功能通常需要和表交互多次(比如转账)。如果每次针对表的简单操作我们都写一遍,代码中会出现大量的代码冗余。
解决思路
将重复的SQL操作提炼至方法中,达到一条SQL操作多次复用的目的
(二)DAO编程
核心思想
DAO模式目的就是将SQL语句转化为通用SQL语句,并封装成Java方法、提高代码复用性。
编码规范:
-
① 一张表的操作对应一个DAO
-
② 一个通用的SQL封装成一个方法,方法名和对应sql关键词一致,且望文生义
操作 Java 数据库 新增 insertXxx(Xxx x) insert into ... 删除 deleteXxxxxId(Integer id) delete from ... 更新 updateXxx(Xxx x) update t_xxx set ... 查询单个 Xxx selectXxxxxId(Integer id) select * from ... 查询多个 List<Xxx> selectXxxs() select * from ... -
③ 具体实现采用dao接口+impl实现类的形式(目的为提升代码扩展性和维护性)
-
① 接口中做方法声明的约束
-
②实现类中利用JDBCTemplate做具体实现
-
③ 接口命名:对应实体类名+Dao,例如表
t_person,DAO命名为PersonDAO -
④ 实现类名:接口名+Impl,如
PersonDAOImpl -
⑤ 接口存放在
dao包下 -
⑥ 实现类需要存放在
dao.impl包下
-
示例
编写一个关于Person表的DAO操作类。
-
简化版
package com.xx.dao;
import com.xx.entity.Account;
import java.util.List;
/*** t_account表的所有SQL操作*/
public interface AccountDao {/*** 根据账户名查询账户信息* @param accName 被查询的账户名* @return 对应的账户对象*/Account selectAccountxxAccountName(String accName);
/*** 根据账户名修改账户信息* @param account 包含了被修改的账户名和修改后的余额 的对象* @return 受影响的行数*/int updateAccountxxAccountName(Account account);
/*** 新增账户信息* @param account 包含所有信息的对象* @return 受影响的行数*/int insertAccount(Account account);
/*** 根据账户id删除账户信息* @param id 被删除的id* @return 受影响的行数*/int deleteAccountxxAccountId(int id);
/*** 查询所有账户信息* @return 账户对象的list集合*/List<Account> selectAccounts();
}
-
详细代码:结合JDBCUtils
package com.xx.dao.impl;
import com.xx.dao.AccountDao;
import com.xx.entity.Account;
import com.xx.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import java.util.List;
public class AccountDaoImpl implements AccountDao {@Overridepublic Account selectAccountxxAccountName(String accName) {//获取JDBCTemplateJdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();String sql1 = "select * from t_account where account_name=?";//查询转出人信息List<Account> list = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(Account.class), accName);//集合内容为空为返回null,内容不为空将对应对象获取返回return list.isEmpty() ? null : list.get(0);}
@Overridepublic int updateAccountxxAccountName(Account account) {//获取JDBCTemplateJdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();
String sql = "update t_account set balance=? where account_name=?";//执行sqlint n = jdbcTemplate.update(sql, account.getBalance(), account.getAccountName());return n;}
@Overridepublic int insertAccount(Account account) {//获取JDBCTemplateJdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();//书写sqlString sql = "insert into t_account(account_name,account_password,balance) values(?,?,?)";//执行sqlint n = jdbcTemplate.update(sql, account.getAccountName(), account.getAccountPassword(), account.getBalance());return n;}
@Overridepublic int deleteAccountxxAccountId(int id) {//获取JDBCTemplateJdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();
String sql = "delete from t_account where account_id=?";//执行sqlreturn jdbcTemplate.update(sql, id);}
@Overridepublic List<Account> selectAccounts() {//获取JDBCTemplateJdbcTemplate jdbcTemplate = JDBCUtils.getJDBCTemplate();
String sql = "select * from t_account";return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Account.class));
}
}相关文章:
DAO设计模式
概念:DAO(Data Access Object) 数据库访问对象,**面向数据库SQL操作**的封装。 (一)场景 问题分析 在实际开发中,针对一张表的复杂业务功能通常需要和表交互多次(比如转账)。如果每次针对表的…...
【Midjourney】新手指南:参数设置
1.--aspect 或 --ar 用于设置图片长宽比,例如 --ar 16:9就是设置图片宽为16,高为9 2.--chaos 用于设置躁点,噪点值越高随机性越大,取值为0到100,例如 --chaos 50 3.--turbo 覆盖seetings的设置并启用极速模式生成…...
阿里云a10GPU,centos7,cuda11.2环境配置
Anaconda3-2022.05-Linux-x86_64.sh gcc升级 centos7升级gcc至8.2_centos7 yum gcc8.2.0-CSDN博客 paddlepaddle python -m pip install paddlepaddle-gpu2.5.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html 报错 ImportError: libssl.so…...
RTSP/Onvif协议视频平台EasyNVR激活码授权异常该如何解决
TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播、云端…...
React16源码: React中event事件对象的创建过程源码实现
event 对象 1 ) 概述 在生产事件对象的过程当中,要去调用每一个 possiblePlugin.extractEvents 方法现在单独看下这里面的细节过程,即如何去生产这个事件对象的过程 2 )源码 定位到 packages/events/EventPluginHub.js#L172 f…...
深度学习(12)--Mnist分类任务
一.Mnist分类任务流程详解 1.1.引入数据集 Mnist数据集是官方的数据集,比较特殊,可以直接通过%matplotlib inline自动下载,博主此处已经完成下载,从本地文件中引入数据集。 设置数据路径 from pathlib import Path# 设置数据路…...
AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)
Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期(待优化)2.3.5 实测 3.总结 1.简…...
【MySQL复制】半同步复制
介绍 除了内置的异步复制之外,MySQL 5.7 还支持通过插件实现的半同步复制接口。本节讨论半同步复制的概念及其工作原理。接下来的部分将涵盖与半同步复制相关的管理界面,以及如何安装、配置和监控它。 异步复制 MySQL 复制默认是异步的。源服务器将事…...
PHP面试知识点--echo、print、print_r、var_dump区别
echo、print、print_r、var_dump 区别 echo 输出单个或多个字符,多个使用逗号分隔无返回值 echo "String 1", "String 2";print 只可以输出单个字符返回1,因此可用于表达式 print "Hello"; if ($expr && pri…...
centos 7 部署若依前后端分离项目
目录 一、新建数据库 二、修改需求配置 1.修改数据库连接 2.修改Redis连接信息 3.文件路径 4.日志存储路径调整 三、编译后端项目 四、编译前端项目 1.上传项目 2.安装依赖 3.构建生产环境 五、项目部署 1.创建目录 2.后端文件上传 3. 前端文件上传 六、服务启…...
RFID手持终端_智能pda手持终端设备定制方案
手持终端是一款多功能、适用范围广泛的安卓产品,具有高性能、大容量存储、高端扫描头和全网通数据连接能力。它能够快速平稳地运行,并提供稳定的连接表现和快速的响应时,适用于医院、物流运输、零售配送、资产盘点等苛刻的环境。通过快速采集…...
51单片机学习——矩阵按键
目录 gitee链接 小程吃饭饭 (xiaocheng-has-a-meal) - Gitee.comhttps://gitee.com/xiaocheng-has-a-meal 1.图~突突突突突 矩阵键盘原理图 矩阵键盘的实物图 2.矩阵键盘 引入~啦啦啦啦啦 原理~沥沥沥沥沥 代码~嗷嗷嗷嗷嗷 【1】延时函数 【2】 LCD1602 【3】检测按…...
重写Sylar基于协程的服务器(1、日志模块的架构)
重写Sylar基于协程的服务器(1、日志模块的架构) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、日志模…...
ElementUI Form:Radio 单选框
ElementUI安装与使用指南 Radio 单选框 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue (Radio 单选框)页面效果图 项目里el-radio.vue代码 <script> export default {name: el_radio,data() {return {radio: 1,radio2: 2,ra…...
react-activation实现缓存,且部分页面刷新缓存,清除缓存
1.安装依赖 npm i -S react-activation2.使用AliveScope 包裹根组件 import { AliveScope } from "react-activation" <AliveScope><Router><Switch><Route exact path"/" render{() > <Redirect to"/login" push …...
idea 中 tomcat 乱码问题修复
之前是修改 Tomcat 目录下 conf/logging.properties 的配置,将 UTF-8 修改为 GBK,现在发现不用这样修改了。只需要修改 IDEA 中 Tomcat 的配置就可以了。 修改IDEA中Tomcat的配置:添加-Dfile.encodingUTF-8 本文结束...
Modbus协议学习第七篇之libmodbus库API介绍(modbus_write_bits等)
写在前面 在第六篇中我们介绍了基于libmodbus库的演示代码,那本篇博客就详细介绍一下第六篇的代码中使用的基于该库的API函数。另各位读者,Modbus相关知识受众较少,如果觉得我的专栏文章有帮助,请一定点个赞,在此跪谢&…...
第九节HarmonyOS 常用基础组件13-TimePicker
1、描述 时间选择组件,根据指定参数创建选择器,支持选择小时以及分钟。默认以24小时的时间区间创建滑动选择器。 2、接口 TimePicker(options?: {selected?: Date}) 3、参数 selected - Date - 设置选中项的时间。默认是系统当前的时间。 4、属性…...
力扣刷题-55.跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 class Solution { publ…...
Ruby安装演示教程
安装 Ruby 的过程会根据您的操作系统(如 Windows、MacOS、Linux)而有所不同。以下是在这些主要平台上安装 Ruby 的基本指南。 在 Windows 上安装 Ruby 下载 Ruby Installer:访问 RubyInstaller 官方网站下载适合您系统的 Ruby Installer 版…...
一文搞懂RAG分块技术:提升大模型准确性的关键(建议收藏)
文本分块(Chunking)是决定 RAG(检索增强生成)系统成败的核心技术之一,却常常在幕后默默发挥作用。简单来说,分块就是把长文档切分成更小、结构化的片段,让 AI 系统能够真正检索和推理。 分块可以…...
PyTorch 2.8镜像实战:新闻媒体机构AI短视频批量生成与审核系统部署
PyTorch 2.8镜像实战:新闻媒体机构AI短视频批量生成与审核系统部署 1. 项目背景与需求分析 新闻媒体机构每天需要处理大量视频内容,传统视频制作流程面临三大挑战: 时效性压力:突发新闻需要快速生成视频报道人力成本高…...
MiniCPM-o-4.5-nvidia-FlagOS进阶:使用Matlab进行模型输出数据的可视化分析
MiniCPM-o-4.5-nvidia-FlagOS进阶:使用Matlab进行模型输出数据的可视化分析 最近在折腾MiniCPM-o-4.5-nvidia-FlagOS这个本地大模型,用它处理了不少文本分析任务。模型跑起来挺顺畅,生成的结果也很有料,但看着满屏的文本输出&…...
深入操作系统原理:Qwen3.5-9B-AWQ-4bit解读进程调度与内存管理
深入操作系统原理:Qwen3.5-9B-AWQ-4bit解读进程调度与内存管理 1. 操作系统教学的新助手 计算机操作系统课程向来以抽象难懂著称。学生们常常被进程状态转换、死锁条件、页面置换算法等概念困扰,而传统教学方式又难以直观展示这些动态过程。这正是Qwen…...
[特殊字符] 第72课:杨辉三角
想系统提升编程能力、查看更完整的学习路线,欢迎访问 AI Compass:https://github.com/tingaicompass/AI-Compass 仓库持续更新刷题题解、Python 基础和 AI 实战内容,适合想高效进阶的你。📖 第72课:杨辉三角模块:动态规划 | 难度:…...
基于Matlab实现 IEEE33节点配电网系统simulink仿真模型,并配套前推回代法潮流计算程序
基于Matlab实现 IEEE33节点配电网系统simulink仿真模型,并配套前推回代法潮流计算程序。 改进的IEEE33节点,潮流计算,电压分析,可自行加风机光伏,接电动机负载。 结果图如图所展示,附带IEEE33节点数据MATLA…...
OpenClaw跨模型路由:按图片类型分配Qwen3.5-9B与本地LLM
OpenClaw跨模型路由:按图片类型分配Qwen3.5-9B与本地LLM 1. 为什么需要跨模型路由 去年我在处理大量技术文档截图时,发现一个有趣的现象:流程图和表格类图片需要强大的多模态理解能力,而纯文字截图往往只需要基础的OCR功能。当时…...
【2026年最新600套毕设项目分享】校园水电费管理微信小程序(30004)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
百度百舸 x 昆仑芯,加速 GLM-5.1 从开源发布到规模化应用
今日,智谱正式开源新一代大模型 GLM 5.1。作为智谱 GLM 系列的最新力作,GLM-5.1 的整体能力得到了全面提升。尤其在代码能力上:在最接近真实软件开发的 SWE-bench Pro 基准测试中,GLM-5.1 超过 GPT-5.4、Claude Opus 4.6ÿ…...
OpenClaw+百川2-13B-4bits:智能客服模拟器搭建教程
OpenClaw百川2-13B-4bits:智能客服模拟器搭建教程 1. 为什么需要本地化客服模拟器 去年参与一个电商项目时,我遇到了一个典型痛点:每次修改客服话术都需要重新训练线上模型,既消耗API费用又影响真实客户体验。当时就萌生了搭建本…...
