使用 Spring Boot + MyBatis开发需要注意的事项以及开发模版

news2025/4/7 11:26:04

前言:

注意,本篇不适用于有相关开发经验的开发者,作为一个在职开发者,我经常在完成从0-1的模块,也就是从数据库表开始到创建实体类,以及dao层,Service层等业务需要添加相关注解,这样就经常忘掉相关注解导致项目启动不起来,这篇博文算是博主在开发中的纪录或者总结吧,对于有相关开发经验的开发者,你可以移步了,本文对你来说,没得一点收获,仅仅就是博主在自己开发过程中的相关总结了。

我们一般进行开发的时候,会要求先设计数据库,我想数据库设计大部分都是上级给你设计好了吧,我相信大部分情况下各位都是采用上级的设计好的数据库,但是也有时候,上级会要你自己设计,但不管是上级设计好数据还是你自己设计数据库,相关实体类,Dao层,Service层,Service实现层,Dao映射层,以及控制层,这几个地方的注解,以及接口稍微出一点问题,你的项目可能就跑不起来相应的模块,甚至他会说,找不到你所调用的方法。

踩过几次坑,但让我记住,我还真不一定每次都记得,故此,在这里记录一下,算是给我自己一个查询错误的机会。

在Java中,我们在Spring Boot框架中通常使用相关注解来标识不用的层级组件,下面和我一起看一下呗:

Mapper层

Mapper层,或者称为Dao层(数据访问层):
@Mapper:标识Mapper接口,用于与数据库进行交互的数据访问层组件。
@Repository:作为通用的注解,也可以用于标识Mapper接口,表示它是一个仓库组件。

@Mapper
@Repository
public interface YourMapper {
    // Mapper方法定义
}

注意:Spring Boot中我们喜欢将@Mapper放到Spring Boot启动类中,如下:
在这里插入图片描述
如果我们没有在Dao层配置@Mapper,那么我们就需要在启动类里边添加@MapperScan避免产生找不到Mapper文件。

Service层

Service层(业务逻辑层):
@Service:标识Service类,用于实现业务逻辑的组件。

@Service
public class YourService implements YouInterface{
    // Service方法实现
}

控制层

@Controller:标识Controller类,用于处理HTTP请求和响应的组件。
@RestController:与@Controller类似,但它还包含了@ResponseBody注解,用于直接返回响应数据。

@Controller
public class YourController {
    // 控制层方法实现
}

或者:

@RestController
@RequestMapping("/**")
public class YourController {
    // 控制层方法实现
}

Mapper层对应的映射文件

<?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">
<mapper namespace="com.*.YourMapper">

这里强调一下,namespace需要和YouMapper中的Dao层名称必须一样,否则就算你映射上去了,他也找不到对应的Mapper里边的SQL方法

案例

要在MyBatis中插入一个List对象到数据库中,你可以使用批量插入的方式来实现。

DAO

DAO层: 在DAO层,可以定义与数据库交互的方法,并使用MyBatis的注解或XML配置来实现具体的数据操作。

@Mapper
public interface YourMapper {
    void insertList(List<YourObject> list);
}

DAO映射文件

在Mapper XML文件中编写对应的SQL语句:

<insert id="insertList" parameterType="java.util.List">
    INSERT INTO your_table (column1, column2, ...) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.property1}, #{item.property2}, ...)
    </foreach>
</insert>

Service接口

public interface YourService {
    // Service方法定义
    void insertList(List<YourObject> list);
}

就一个单一的接口,其他无任何属性添加,没有添加任何注解。它用于定义Service层的方法契约,具体的业务逻辑实现则由对应的Service实现类来完成。

Service实现层

Service层: 在Service层,可以定义业务逻辑的方法,并调用DAO层的方法来实现数据访问和操作。

@Service
public class YourService implements YouServiceInterface{
    @Autowired
    private YourMapper yourMapper;

	//一般我们在做增删改查的时候需要做事务回滚
	@Override
	@Transactional
    public void insertList(List<YourObject> list) {
		List<Object> list = ...; // 前端传递的List<Object>
		for (Object obj : list) {
		    if (obj instanceof YourObject) {
		        YourObject yourObject = (YourObject) obj;
		        List<Object> list1 = yourObject.getList1();
		        // 对list1进行操作
		    }
		}
        yourMapper.insertList(list);
    }
}

YourService类使用@Service注解标识为Service组件,并通过@Autowired注解注入了YourMapper对象。insertList方法调用了YourMapper中的insertList方法来实现批量插入。

我遍历了前端传递的List<Object>,并判断每个元素是否为YourObject类型。如果是,则将其转换为YourObject对象,并通过getList1()方法获取嵌套的List<Object>

insertList(List<YourObject> list)方法在出现异常时回滚事务,你可以使用Spring的事务注解来实现。

具体来说,可以在你的服务类中添加@Transactional注解,这将会将该方法标记为一个事务。当该方法执行时,如果出现异常,事务将会回滚,确保之前的操作都被撤销。

控制层Controller:

@RestController
@RequestMapping("/your-api")
public class YourController {
    @Autowired
    private YourService yourService;

    @PostMapping("/insert-list")
    public ResponseEntity<String> insertList(@RequestBody List<YourObject> list) {
        yourService.insertList(list);
        return ResponseEntity.ok("Insert success");
    }
}

YourController类使用@RestController注解标识为控制器组件,并使用@RequestMapping注解定义了接口的基础路径。YourController类通过@Autowired注解注入了YourService对象。

insertList方法使用@PostMapping注解标识为POST请求,并使用@RequestBody注解将请求体中的JSON数据映射为List对象。insertList方法调用了YourService中的insertList方法来实现批量插入。

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

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

相关文章

海凌科HLK-V2语音识别模块更新词条

简介 HLK-V20 是海凌科的离线语音识别模块, 中英文不同时支持, 只支持中文/英文, 具体识别看每次的SDK更新设置;资料下载 可以在微信公众包搜索海凌科或HI-LINK, 下载资料 感知模块->HLK-V20 模块限制 中英文被限制, 需要根据你在官网设置的SDK信息进行确定;可以仅设置3…

Prometheus快速入门实战

介绍 prometheus 受启发于 Google 的 Brogmon 监控系统&#xff08;相似 kubernetes 是从 Brog 系统演变而来&#xff09;。2016 年 5 月继 kubernetes 之后成为第二个加入 CNCF 基金会的项目&#xff0c;同年 6 月正式发布 1.0 版本。2017 年底发布基于全新存储层的 2.0 版本…

软件设计师——数据库系统(三)

&#x1f4d1;前言 本文主要是【数据库系统】——软件设计师——数据库系统的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

深入浅出理解TensorFlow的padding填充算法

一、参考资料 notes_on_padding_2 二、TensorFlow的padding算法 本文以TensorFlow v2.14.0版本为例&#xff0c;介绍TensorFlow的padding算法。 1. 引言 tf.nn.conv2d and tf.nn.max_pool2d 函数都有padding参数&#xff0c;在执行函数之前&#xff0c;都需要进行填充padd…

【进收藏夹吃灰系列】Python学习指南

文章目录 [toc]Python基础字符串判断语句循环语句异常文件读写迭代器生成器闭包线程 个人主页&#xff1a;丷从心 系列专栏&#xff1a;进收藏夹吃灰系列 Python基础 字符串 【Python基础】字符串 判断语句 【Python基础】判断语句 循环语句 【Python基础】循环语句 异常 …

【华为OD机试真题2023CD卷 JAVAJS】手机App防沉迷系统

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 手机App防沉迷系统 知识点数组字符串编程基础循环统计 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 智能手机方便了我们生活的同时,也侵占了我们不少的时间。“手机App防沉迷系统”能够让我们每天合理的规…

WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印+全局异常捕捉

文章目录 前言相关文章Nlog配置HandyControl配置简单使用显示效果文本内容 全局异常捕捉异常代码运行结果 前言 我将简单的HandyControl的消息打印系统和Nlog搭配使用&#xff0c;简化我们的代码书写 相关文章 .NET 控制台NLog 使用 WPF-UI HandyControl 控件简单实战 C#更改…

行人重识别(ReID)基础知识入门

这里写目录标题 1、ReID技术概述1.1 基本原理1.2 实现流程1.3 重识别存在的技术挑战 2、训练数据格式介绍 1、ReID技术概述 1.1 基本原理 ReID&#xff0c;全称Re-identification&#xff0c;目的是利用各种智能算法在图像数据库中找到与要搜索的目标相似的对象。ReID是图像检…

阿里开源大模型 Qwen-72B 私有化部署

近期大家都知道阿里推出了自己的开源的大模型千问72B&#xff0c;据说对于中文非常友好&#xff0c;在开源模型里面&#xff0c;可谓是名列前茅。 千问拥有有强大的基础语言模型&#xff0c;已经针对多达 3 万亿个 token 的多语言数据进行了稳定的预训练&#xff0c;覆盖领域、…

《微信小程序开发从入门到实战》学习六十七

6.6 网络API 部分小程序服务端不是用云开发技术实现&#xff0c;而是由开发人员使用后端开发语言实现。 在小程序用网络API与&#xff08;开发人员使后端开发语言建设的&#xff09;服务端进行交互&#xff0c;可与服务端交换数据、上传或下载文件。 6.6.1 服务器域名配置 …

C#使用条件语句判断用户登录身份

目录 一、示例 二、生成 利用条件语句判断用户登录身份&#xff0c;根据用户登录身份的不同&#xff0c;给予相应的操作权限。 一、示例 主要用if语句及ComboBox控件。其中&#xff0c;ComboBox是窗体中的下拉列表控件&#xff0c;在使用ComboBox控件前&#xff0c;可以先向…

Spring6入门

1、入门 1.1、环境要求 JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09;Maven&#xff1a;3.6Spring&#xff1a;6.1.2 1.2、构建模块 &#xff08;1&#xff09;构建父模块spring6 在idea中&#xff0c;依次单击 File -> New -> Proj…

Vue3-30-路由-嵌套路由的基本使用

什么是嵌套路由 嵌套路由 &#xff1a;就是一个组件内部还希望展示其他的组件&#xff0c;使用嵌套的方式实现页面组件的渲染。 就像 根组件 通过路由渲染 普通组件一样&#xff0c;嵌套路由也是一样的道理。 嵌套路由的相关关键配置 1、<router-view> 标签 声明 被嵌套组…

乒乓球廉价底板及套胶评测4

球拍找到适应自己的不容易&#xff0c;因为初学者或者说业余爱好者无法确定是按打法特点选拍还是按拍子练打法特点&#xff0c;所以有时候就要孤注一掷&#xff0c;想想练球的初衷&#xff0c;不用被打的好的对手所左右。我和朋友打球的时候发现大家借力的能力越来越强&#xf…

三巨头对决:深入了解pnpm、yarn与npm

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 三巨头对决&#xff1a;深入了解pnpm、yarn与npm 前言包管理器简介npm&#xff08;Node Package Manager&#xff09;&#xff1a;Yarn&#xff1a;pnpm&#xff08;Performant Npm&#xff09;&#…

FL Studio 21.2.2官方中文版重磅发布

纯正简体中文支持&#xff0c;更快捷的音频剪辑及素材管理器&#xff0c;多样主题随心换&#xff01; Mac版新增对苹果M2/1家族芯片原生支持。 丰富的主题换肤 现在大家可以通过控制色调、饱和度、亮度、文本、仪表和步进序列器的颜色来改变你的DAW外观&#xff0c; DAW“情绪…

Docker 概述以及整体架构

文章目录 一、Docker概述1.1 什么是 Docker1.2 Docker 如何工作1.3 底层技术 二、Docker架构2.1 Docker 整体架构2.2 Docker daemon2.3 Docker client2.4 Docker registries2.5 Docker objects2.6 Docker Desktop 参考资料 一、Docker概述 1.1 什么是 Docker Docker是一个用于…

JVM工作原理与实战(二):字节码编辑器jclasslib

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、字节码编辑器jclasslib介绍和安装 1.介绍 2.安装 3.IntelliJ IDEA 插件安装 二、字节码编辑器jclasslib的使用 1.使用jclasslib bytecode viewer打开字节码文件 2.使用Intell…

Spring 是如何解决循环依赖的

1.什么是循环依赖? 所谓的循环依赖是指&#xff0c;A 依赖 B&#xff0c;B 又依赖 A&#xff0c;它们之间形成了循环依赖。或者是 A 依赖 B&#xff0c;B 依赖 C&#xff0c;C 又依赖 A。它们之间的依赖关系如下&#xff1a; 2.通过手写代码演示理解Spring循环依赖 DEMO: pu…

模型性能评估简介

模型评估 混淆矩阵 Positive - 正例Negative (N) - 负例 结果: 预测为正类别 预测为负类别 真实为正类别 True Positive (TP) False Negative (FN) 真实为负类别 False Positive (FP) True Negative (TN)TP - 预测 P, 实际 P, 模型预测正确FP - 预测 P, …