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

前言:

注意,本篇不适用于有相关开发经验的开发者,作为一个在职开发者,我经常在完成从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{@Autowiredprivate YourMapper yourMapper;//一般我们在做增删改查的时候需要做事务回滚@Override@Transactionalpublic 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 {@Autowiredprivate 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.hqwc.cn/news/295382.html

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

相关文章

WEB渗透—PHP反序列化(八)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

【C语言】打印内存数据

C语言&#xff0c;用函数封装&#xff1a;16进制打印unsigned char *p指向的内存&#xff0c;长度为int l。16个字节&#xff0c;换一次行。16个字节用一个字符串缓存&#xff0c;一次打印。 以下是一个使用函数封装的C语言代码&#xff0c;用于以16进制格式打印unsigned char …

Tomcat远程调试

windows环境 写一个 startup-debug.bat&#xff0c;指定tomcat的根目录&#xff0c;端口自己定义 rem *******设置Tomcat目录*******-- set CATALINE_HOMED:\asd\A8-2\tomcat d: rem 8787为可用端口,为远程调试监听端口-- cd %CATALINE_HOME%/bin set JPDA_ADDRESS8787 set J…

单片机原理及应用:流水灯的点亮

流水灯是一种简单的单片机控制电路&#xff0c;由许多LED组成&#xff0c;电路工作时LED会按顺序点亮&#xff0c;类似于流水的效果。 下面是运行在keil上的代码&#xff0c;分别使用了数组&#xff0c;移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…

跨平台应用程序开发软件,携RAD Studio 12新版上线

RAD Studio 是一款专为程序员而准备的跨平台应用程序开发软件&#xff0c;内置Delphi和CBuilder这两种开发工具&#xff0c;另外还提供了新的C功能&#xff0c;扩展了对ExtJS的RAD服务器支持&#xff0c;增强了对vcL的高dpi支持&#xff0c;提高了firemonk (FMX)的质量等等&…

今日港股期货(港股期货今日交易动向)

港股期货收涨0.6% 首次突破31000点 今日港股期货大涨&#xff0c;形势一时看好。其中&#xff0c;恒生指数期货一度突破31000点关口&#xff0c;创出历史新高。分析人士表示&#xff0c;市场情绪积极&#xff0c;投资者对于全球经济复苏前景和中国经济增长的预期不断提高&…

异方差 的 BP检验 方法及原理详解

异方差 的 BP检验详解            文章目录 1. `BP`检验的步骤2. 场景示例步骤 ①步骤 ②BP检验,也称为Breusch-Pagan检验,是一种用于检验线性回归模型中异方差性(即误差项方差不恒定)的统计方法。该方法由Trevor S. Breusch和Adrian R. Pagan在1980年提出。 1.…

【已解决】解决Springboot项目访问本地图片等静态资源无法访问的问题

今天在开发一个招聘系统的时候&#xff0c;有投递简历功能&#xff0c;有投递就会有随之而来的查看简历对吧&#xff0c;我投递过的简历&#xff0c;另存为一个文件夹&#xff0c;就是说本地磁盘(或者服务器)有一个专门存放投递过的简历的文件夹&#xff0c;用于存放PDF&#x…

2009-2022年31省细分产品出口数据/按hs码分的22类细分产品的出口数据

2009-2022年31省细分产品出口数据/按hs码分的22类细分产品的出口数据 1、时间&#xff1a;2009-2022年 2、指标&#xff1a;时间、流向名称、商品编码、商品名称、伙伴名称、主题编码、方式名称、金额&#xff08;美元&#xff09; 3、来源&#xff1a;海关贸易统计数据/海关…

dubbo线程池为什么耗尽

文章概述 大家可能都遇到过DUBBO线程池打满这个问题&#xff0c;报错如下&#xff0c;本文我们就一起分析DUBBO线程池打满这个问题。 cause: org.apache.dubbo.remoting.RemotingException: Server side(10.0.0.100,20881) thread pool is exhausted, detail msg:Thread pool …

大数运算·字符串相加·阶乘

大数&#xff0c;就是C/C中利用基本类型所不能存储的数字&#xff0c;少则数十位&#xff0c;大则几万位&#xff0c;如何存储和计算大数就是本文的内容。 在C和C中&#xff0c;没有存储大数的数据结构&#xff0c;就算 unsigned long long也只能表示19位的数字  如果我们用d…

【JAVA面试题】什么是引用传递?什么是值传递?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 前言 博客的正文部分可以详细介绍Java中参数传递的机制&#xff0c;强调Java是按值传递的&#xff0c;并解释了基本数据类型和对象引用在这种传…