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

发布时间:2023年12月23日

前言:

注意,本篇不适用于有相关开发经验的开发者,作为一个在职开发者,我经常在完成从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方法来实现批量插入。

文章来源:https://blog.csdn.net/qq_45922256/article/details/135158525
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。