注意,本篇不适用于有相关开发经验的开发者,作为一个在职开发者,我经常在完成从0-1的模块,也就是从数据库表开始到创建实体类,以及dao层,Service层等业务需要添加相关注解,这样就经常忘掉相关注解导致项目启动不起来,这篇博文算是博主在开发中的纪录或者总结吧,对于有相关开发经验的开发者,你可以移步了,本文对你来说,没得一点收获,仅仅就是博主在自己开发过程中的相关总结了。
我们一般进行开发的时候,会要求先设计数据库,我想数据库设计大部分都是上级给你设计好了吧,我相信大部分情况下各位都是采用上级的设计好的数据库,但是也有时候,上级会要你自己设计,但不管是上级设计好数据还是你自己设计数据库,相关实体类,Dao层,Service层,Service实现层,Dao映射层,以及控制层,这几个地方的注解,以及接口稍微出一点问题,你的项目可能就跑不起来相应的模块,甚至他会说,找不到你所调用的方法。
踩过几次坑,但让我记住,我还真不一定每次都记得,故此,在这里记录一下,算是给我自己一个查询错误的机会。
在Java中,我们在Spring Boot框架中通常使用相关注解来标识不用的层级组件,下面和我一起看一下呗:
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
public class YourService implements YouInterface{
// Service方法实现
}
@Controller
:标识Controller类,用于处理HTTP请求和响应的组件。
@RestController
:与@Controller类似,但它还包含了@ResponseBody注解,用于直接返回响应数据。
@Controller
public class YourController {
// 控制层方法实现
}
或者:
@RestController
@RequestMapping("/**")
public class YourController {
// 控制层方法实现
}
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层,可以定义与数据库交互的方法,并使用MyBatis的注解或XML配置来实现具体的数据操作。
@Mapper
public interface YourMapper {
void insertList(List<YourObject> list);
}
在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>
public interface YourService {
// Service方法定义
void insertList(List<YourObject> list);
}
就一个单一的接口,其他无任何属性添加,没有添加任何注解。它用于定义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
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
,并判断每个元素是否为YourObject类型。如果是,则将其转换为YourObject对象,并通过getList1()方法获取嵌套的List
。
insertList(List
方法在出现异常时回滚事务,你可以使用Spring的事务注解来实现。
具体来说,可以在你的服务类中添加@Transactional
注解,这将会将该方法标记为一个事务。当该方法执行时,如果出现异常,事务将会回滚,确保之前的操作都被撤销。
@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");
}
}
YourControlle
r类使用@RestController
注解标识为控制器组件,并使用@RequestMapping
注解定义了接口的基础路径。YourController
类通过@Autowired
注解注入了YourService
对象。
insertList
方法使用@PostMapping
注解标识为POST请求,并使用@RequestBody
注解将请求体中的JSON数据映射为List对象。insertList方法调用了YourService
中的insertList
方法来实现批量插入。