<Spring Boot>开发基于三层架构设计:Dao层、Service层、Controller层及案例一

三层架构设计:基于Spring Boot开发要使用三层架构:

数据访问层(Dao)、业务逻辑层(Service)、控制层(Control-ler)

(1)数据访问层(Dao):Dao层是最底层的设计,用户操作数据库。通过MyBatis持久化实现接口开发,XML文件。Dao层的设计步骤:1、在数据库中生成数据库表 2通过XML文件实现数据库的映射和操作。

(2)业务逻辑层(Service):Service层是中间层,在Dao层和Controller层之间进行逻辑处理工作。考虑到程序 的耦合度问题,为了降低各个模块的关联,每个接口都封装有各自的业务处理方法。

(3)控制层(Controller):Controller是第三层,通过调用Service层,与前端页面交互。

CRUD案例如下:

Controller层:


@Slf4j
@RestController
@RequestMapping("/xxxList")
public class XxxListController {@Autowiredprivate XxxListService xxxListService;/*** 查询:配置* 权限-管理员** @param param* @return*/@PostMapping(value = "/selectXxxConfig")@AuthInterceptor("mag:getXxx:selectXxxConfig")public Result selectXxxConfig(@RequestBody String param) {try {Map<String, Object> paramMap = JsonUtils.readValue(param, Map.class);return Result.success().result(xxxListService.selectXxxConfig(paramMap));} catch (Exception e) {log.error("XxxListController selectXxxConfig is error===:" + e.getMessage(), e);return Result.failure("查询失败");}}/*** 新增/修改:配置* 权限-管理员** @param param* @return*/@PostMapping(value = "/addOrModifyXxxConfig")@AuthInterceptor("mag:getXxx:addOrModifyXxxConfig")public Result addOrModifyXxxConfig(@RequestBody String param) {try {Map<String, Object> paramMap = JsonUtils.readValue(param, Map.class);xxxListService.addOrModifyXxxConfig(paramMap);} catch (Exception e) {log.error("XxxListController addOrModifyXxxConfig is error===:" + e.getMessage(), e);return Result.failure("更新失败");}return Result.success().result(null);}/*** 删除:表单数据* 权限-管理员** @param param* @return*/@PostMapping(value = "/deleteData")@AuthInterceptor("mag:getXxx:deleteData")public Result deleteFormData(@RequestBody String param) {try {Map<String, Object> paramMap = JsonUtils.readValue(param, Map.class);xxxListService.deleteData(paramMap);} catch (Exception e) {log.error("XxxListController deleteData is error===:" + e.getMessage(), e);return Result.failure("数据删除失败");}return Result.success().result(null);}}	

Servicer层:

	
public interface XxxListService {//查询:配置PageInfo<Map<String, Object>> selectXxxConfig(Map<String, Object> paramMap);//新增/修改:配置Result addOrModifyXxxConfig(Map<String, Object> paramMap);//删除:表单数据void deleteData(Map<String, Object> paramMap);}

ServicerImpl层:

	
@Slf4j
@Service
public class XxxListServiceImpl implements XxxListService {@Autowiredprivate XxxListMapper xxxListMapper;/** 查询:配置**/@Overridepublic PageInfo<Map<String, Object>> selectXxxConfig(Map<String, Object> paramMap) {CommonUtil.getPageHelper(paramMap);List<Map<String, Object>> list = xxxListMapper.selectXxxConfig(paramMap);PageInfo<Map<String, Object>> result = new PageInfo<>(list);return result;}	/** 新增/修改:配置**/@Overridepublic Result addOrModifyXxxConfig(Map<String, Object> paramMap) {String addOrModify = String.valueOf(paramMap.get("addOrModify"));if(addOrModify.equals("add")){paramMap.remove("addOrModify");List<Map<String,String>> reg = getRegionList();  // 获取地域信息List<Map<String,String>> list = xxxListMapper.selectXxxRegAll();  // 查询本数据库地域信息Iterator<Map<String, String>> iterator = reg.iterator();while (iterator.hasNext()){Map<String, String> next = iterator.next();String name = String.valueOf(next.get("name"));String code = String.valueOf(next.get("code"));next.put("isEnable","1");Iterator<Map<String, String>> iterator2 = list.iterator();while (iterator2.hasNext()){Map<String, String> next2 = iterator2.next();String regionName = String.valueOf(next2.get("name"));String RegionCode = String.valueOf(next2.get("code"));if(name.equals(regionName) && code.equals(RegionCode)){iterator.remove();}}}if(reg.size() > 0){xxxListMapper.addXxxConfig(reg);}}else if(addOrModify.equals("modify")){  // "isEnableVal",1:"使用",2:"停用"String sortId = String.valueOf(paramMap.get("sortId"));String isEnable = String.valueOf(paramMap.get("isEnable"));if(!sortId.equals("null") && !sortId.equals("") || !isEnable.equals("null") && !isEnable.equals("")){xxxListMapper.modifyXxxConfig(paramMap);}}return Result.success().result(null);}/** 删除:表单数据**/@Overridepublic void deleteData(Map<String, Object> paramMap) {xxxListMapper.deleteData(paramMap);}}

Mapper层(又称Dao层):

	
@Mapper
public interface XxxListMapper {//查询:所有配置(先查所有配置)List<Map<String, String>> selectXxxRegAll();//查询:配置List<Map<String, Object>> selectXxxConfig(Map<String, Object> paramMap);//新增:配置void addXxxConfig(List<Map<String, String>> paramList);//修改:配置void modifyXxxConfig(Map<String, Object> paramMap);//删除:表单数据void deleteData(Map<String, Object> paramMap);}

Mapper.xml层(MyBatis层):

	
<?xml version="1.0" encoding="UTF-8"?>
<!--约束条件-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间:找到所在的XxxListMapper接口的位置-->
<mapper namespace="com.itheima.service.mapper.XxxListMapper"><!--sql语句代码--><!-- 查询:所有配置(先查所有配置) --><select id="selectXxxRegAll" resultType="map">SELECT *FROM xxx_region_list_dic where 1 = 1</select><!-- 查询:配置 --><select id="selectXxxConfig" parameterType="map" resultType="map">SELECT *FROM xxx_region_list_dic where 1 = 1<!-- 分页字段 --><if test="null != processResult">and processResult = #{processResult}</if><if test="null != name and '' != name">and name = #{name}</if><if test="null != code and '' != code">and code = #{code}</if><if test="null != isEnable and '' != isEnable">and isEnable = #{isEnable}</if>order by sortId</select><!-- 新增:配置 --><insert id="addXxxConfig" parameterType="java.util.List"><foreach collection="list" item="region" index="index" separator=";">INSERT IGNORE INTO xxx_region_list_dic<foreach collection="region.entrySet()" index="key" separator="," open="(" close=")">${key}</foreach>VALUES<foreach collection="region.entrySet()" item="value" separator="," open="(" close=")">#{value}</foreach></foreach></insert><!-- 修改:配置 --><update id="modifyXxxConfig" parameterType="map">update xxx_region_list_dic<set><if test = "null != sortId and '' != sortId">sortId = #{sortId},</if><if test = "null != isEnable and '' != isEnable">isEnable = #{isEnable}</if></set>where<if test = "null != seqId and '' != seqId">seqId = #{seqId}</if></update><!-- 删除:表单数据 --><delete id="deleteData">delete from xxx_form_data_listwhere<if test = "null != No and '' != No">No = #{No}</if></delete></mapper>

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

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

相关文章

更新合集 | 七月功能上新记

点击链接了解详情 七月来临&#xff0c;正式开启 2023 下半年的新征途&#xff01;这个盛夏&#xff0c;腾讯云 CODING 上线了微信扫码注册、微信通知、Go 制品管理等重点能力&#xff0c;为企业及团队研发管理带来更多便利&#xff01;以下是 CODING 新功能速递&#xff0c;快…

会议室预约系统-检验是否被预约核心SQL

会议室预约时&#xff0c;判断能否被预约&#xff0c;即查询是否已经有预约记录&#xff0c;存在不能被预约。 s,e&#xff1b;表示已经预约的开始结束时间&#xff1b; ns,ne&#xff0c;表示表单提交的预约时间&#xff1b; 只需要(ns,ne)与(s,e)区间没有交集&#xff0c;可…

登录页的具体实现 (小兔鲜儿)【Vue3】

登录页 整体认识和路由配置 整体认识 登录页面的主要功能就是表单校验和登录登出业务 准备模板 <script setup></script><template><div><header class"login-header"><div class"container m-top-20"><h1 cl…

详解go的hex.Encode原理

简言 今天看nsq的messageID生成的时候&#xff0c;发现它使用了hex.Encode函数来产生编码&#xff0c;那就顺道研究一下这个编码方式。 原理 hex是16进制的意思&#xff0c;encode是进行编码的意思&#xff0c;内部实现也很简单&#xff0c;就是 每4位计算出十六进制的值&a…

mac最好用的解压缩工具,支持tar,rar,zip,ios,exe,msi等多种格式

mac系统最好用的压缩工具&#xff0c;支持多种文件压缩格式&#xff0c;甚至你想不到的压缩格式都支持 The Unarchiver&#xff0c;官网地址 包括gui版和命令行版本 不需要gui版本的&#xff0c;可以直接命令安装brew install unar unar使用方法&#xff1a; unar 压缩文件…

基于Python机器学习、深度学习在气象、海洋、水文等技能提升教程

详情点击链接&#xff1a;基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用 前言 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。…

数据可视化(1)

使用python带的matplotlib库进行简单的绘图。使用之前先进行安装&#xff0c;pip install matplotlib。如果安装了Anaconda,则无需安装matplotlib。 1.简单折线图 #绘制简单图表 import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show() import matplotlib.pyp…

iOS原生 输入框短信自动填充多遍 原生解决办法

短信自动填充 只有当输入框text无值的时候才会显示 所以不需要考虑这种情况 监听输入框内容变化的其中两种方法 1. [[NSNotificationCenter defaultCenter] addObserver:self selector:selector(textChange123:) name:UITextFieldTextDidChangeNotification object:nil]; 2. …

2023年的深度学习入门指南(19) - LLaMA 2源码解析

2023年的深度学习入门指南(19) - LLaMA 2源码解析 上一节我们学习了LLaMA 2的补全和聊天两种API的使用方法。本节我们来看看LLaMA 2的源码。 补全函数text_completion源码解析 上一节我们讲了LLaMA 2的编程方法。我们来复习一下&#xff1a; generator Llama.build(ckpt_di…

logback-spring.xml日志配置文件详解

目录 前言logback-spring.xml 配置 前言 打印日志是一个系统的基本功能&#xff0c;系统出现异常可以通过查找日志弄清楚是什么原因&#xff0c;从而更加快速地定位问题&#xff0c;修复系统。 logback-spring.xml 配置 文件位置 具体配置 <?xml version"1.0"…

MGRE实验

实验步骤 第⼀步&#xff1a;IP地址规划 PC地址 设备地址 第⼆步&#xff1a;配置IP地址 R1配置 [R1]interface g0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1]interface s4/0/0 [R1-Serial4/0/0]ip address 15.1.1.1 24 R2配置 [R2]interface g0/0/…

TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以?

TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以? 1. 什么是TCP协议? TCP&#xff1a;Transmission Control Protocol翻译过来就是传输控制协议,TCP协议是一个面向连接的、可靠的、基于字节流的传输层协议RFC 793对TCP连接的定义 > Connections: >…

Windows 在VMware16.x安装Win11系统详细教程

文章目录 一、准备二、创建虚拟机1. 创建新的虚拟机2. 选择虚拟机硬件兼容性3. 安装客户机操作系统4. 选择客户机操作系统5. 命名虚拟机6. 固件类型7. 处理器配置8. 此虚拟机内存9. 网络类型10. 选择I/O控制器类型11. 选择磁盘类型12. 选择磁盘13. 指定磁盘容量14. 指定磁盘文件…

Centos7.6安装RocketMQ4.9.2并配置开机自启

1、下载RocketMQ 编译后的压缩包 wget https://dlcdn.apache.org/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip2、解压 unzip rocketmq-all-4.9.2-bin-release.zip3、进入解压文件夹 cd rocketmq-all-4.9.2/4、编辑配置文件/usr/local/rocketmq/rocketmq-all-4.9.4-…

Docker-Compose 轻松搭建 Grafana+InfluxDb 实用 Jmeter 监控面板

目录 前言&#xff1a; 1、背景 2、GranfanaInfluxDB 配置 2.1 服务搭建 2.2 配置 Grafana 数据源 2.3 配置 Grafana 面板 3、Jmeter 配置 3.1 配置 InfluxDB 监听器 3.2 实际效果 前言&#xff1a; Grafana 和 InfluxDB 是两个非常流行的监控工具&#xff0c;它们可…

Java网络编程(一)基本网络概念

一、网络 网络(network) 是几乎可以实时相互发送和接收数据的计算机和其他设备的集合。网络通常用线缆连接&#xff0c;数据位转换为电磁波&#xff0c;通过线缆移动。不过&#xff0c;无线网络会通过无线电波传输数据&#xff0c;许多长距离的传输现在会用通过玻璃纤维发送可见…

生信专题十余种案例

集成多组学数据的机器学习在生物医学中的应用 原文链接 案例部分图示&#xff1a; 案例图示一&#xff1a;基于自编码器的单细胞转录组-蛋白组学整合分析 案例图示二&#xff1a;基于蛋白组学-代谢组学的肿瘤生物标志物发现 案例图示三&#xff1a;基于GWAS-表型组学的肺癌风…

URL中有%20报错 forbidden 403禁止错误

场景&#xff1a; 网站&#xff1a;www.abc.com/s/搜索key 名字&#xff0c;能正常访问&#xff08;名字和key 中间有空格&#xff09; 转义后的URL&#xff1a;www.abc.com/s/搜索key%20名字。 后来莫名其妙的就不能访问了&#xff0c;报Forbidden 错误&#xff0c;程序一直…

vscode ssh插件连接本地linux失败

新版本的vscode连接本地虚拟机中的linux失败&#xff0c;一直处于retry密码状态&#xff0c;浏览cpp代码不方便&#xff0c;处理方法如下&#xff1a; 1.打开远程机器上面的~/.vscode-server/bin目录下面找到commit 如784b0177c56c607789f9638da7b6bf3230d47a8c 2.在外网机器…