加入收藏 | 设为首页 |

周笔畅-SpringBoot系列(四):SpringBoot整合Mybatis完成不一样的CRUD

海外新闻 时间: 浏览:166 次

本文咱们将回归介绍、共享Spring Boot在企业级运用开发的进程中所表现出来的效果, 特别是在运用体系事务模块的开发进程中,它跟Mybatis/MybatisPlus(某种耐久层结构)整合所表现出来的“双剑合璧”的巨大成效!在本篇文章中,咱们将首要共享怎么根据Spring Boot整合Mybatis完成根本的CRUD!

作为一款用于与数据库打交道的耐久层结构,Mybatis/MybatisPlus着实给咱们的企业级运用体系的开发带来了不可磨灭的效果,其高度封装后的数据库操作接口,即DAO API,可认为企业级运用开发进程中的底层数据库操作带来极大的快捷性,省去了在纯生JDBC年代所需求编写的很多样板式的代码的费事!

能够毫不夸大地讲,大部分企业级运用的开发工作量,其间心事务逻辑便是在完成或许处理事务模块的CRUD上,下面咱们就根据前文建立的规范企业级Spring Boot项目为奠基,整合Mybatis,并完成最根本的CRUD。

在开端开发之前,咱们需求在数据库创立一个数据库表artile,即文章表,其数据库建表句子DDL如:


CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '文章标题',
`user_id` int(11) DEFAULT NULL COMMENT '作者',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章';

完了之后,选用Mybatis逆向工程生成该数据库表对应的实体类Entity、Mapper操作接口、Mapper操作接口对应的动态Sql装备文件mapper.xml。其对应的代码,各位小伙伴能够自行check下来进行检查。

在此之前,需求新建一个ArticleController、IArticleService接口以及ArticleService完成类!

1. 新增与修正

(1)关于新增跟修正而言,其实首要有三点需求留意,第一点是前端提交过来的恳求参数的校验;第二点是查询是否有新增了相同字段信息的记载;最终一点则是直接履行“新增逻辑”。其Controller对应的代码如下所示:


@RestController
@RequestMapping("article")
public class ArticleController extends AbstractController{
@Autowired
public IArticleService articleService;
//新增
@RequestMapping(value = "save",method = 周笔畅-SpringBoot系列(四):SpringBoot整合Mybatis完成不一样的CRUDRequestMethod.POST)
public BaseResponse save(@RequestBody @Validated Article article, BindingResult result){
String error=ValidatorUtil.checkResult(result);
if (StringUtils.isNotBlank(error)){
return new BaseResponse(StatusCode.Fail.getCode(),error);
}
BaseResponse response=new BaseR周笔畅-SpringBoot系列(四):SpringBoot整合Mybatis完成不一样的CRUDesponse(StatusCode.Success);
try {
Integer id=articleService.saveEntity(article);
response.setData(id);
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}
//更新
@RequestMapping(value = "update",method = RequestMethod.POST)
public BaseResponse update(@RequestBody @Validated Article article, BindingResult result){
String error=ValidatorUtil.checkResult(result);
if (StringUtils.isNotBlank(error)){
return new BaseResponse(StatusCode.Fail.getCode(),error);
}
if (article.getId()==null || article.getId()<=0){
return new BaseResponse(StatusCode.InvalidParams);
}
BaseResponse response=new BaseResponse(StatusCode.Success);
try {
articleService.updateEntity(article);
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}
}

(2)在这儿,咱们开发了一个一致的用于“校验前端恳求参数”的校验东西类ValidatorUtil,该东西是跟Hibernate-Validator组件一同结合运用的,首要用于校验一些加了指定注解的参数,如,上面的Article类,其实是加了一些校验注解参数的,如下所示:


import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class Article {
private Integer id;
@NotBlank(message = "文章标题不能为空")
private String title;
@NotNull
private Integer userId;}

其间的@NotBlank等注解即能够用于校验指定的恳求参数,当前端提交过来的对应的恳求参数的取值为NULL或许空字符串时,则会报相应的过错,这些过错信息会被BindingResult所捕获,而下面的ValidatorUtil即展现了其关于这些过错的一致处理方法:


/**恳求参数一致校验东西
* @Author:debug (SteadyJack)
* @Date: 2019/8/27 11:52
**/
public class ValidatorUtil {
//一致校验处理的成果
public static String checkResult(BindingResult result){
StringBuilder sb=new StringBuilder("");
if (result!=null && result.hasErrors()){
//java8 stream写法
result.getAllErrors().stream().forEach(error -> sb.append(error.getDefaultMessage()).append("\n"));
}
return sb.toString();
}
}

(3)从该代码中,能够得知,校验处理的方法首要是经过遍历获取其间的errors列表,然后获取每个error目标实例的message,这个message即为注解@NotBlank上的message特点的取值,这一点咱们在自测的时分即可看到!

完了之后,便是开发相应的Service的处理逻辑,其完好源代码如下所示:


@Override

public Integer saveEntity(Article article) throws Exception {

article.setId(null);

articleMapper.insertSelective(article);

//能够回来成功刺进到数据时那条记载对应的主键id

return article.getId();

}

@Override

public void updateEntity(Article article) throws Exception {

if (article.getId()!=null && article.getId()>=0){

articleMapper.updateByPrimaryKeySelective(article);

}

}

在这儿,咱们设置了成功刺进记载时,主动回来对应的数据库记载的主键id。接下来就能够进入自测了,如下两张图即可阐明全部:

2. 分页列表查询

关于分页列表查询,我信任关于触摸过企业级运用开发的小伙伴而言都是不生疏的,分页列表查询,其实其要点首要在于两点,第一点是需求确保前端传递的参数具有分页的参数pageNo、pageSize;第二点是后端在履行完相应的分页查询后不只需求将得到的列表数据回来到前端,还需求回来其他的分页参数,如netxPage,total,size等等,意图是为了便利前端做分页插件的开发与显现。

(1)首要是Controller的代码:


//查询
@RequestMapping(value = "query",method = RequestMethod.GET)
public BaseResponse query(@Validated ArticleQueryDto dto, BindingResult result){
String error=ValidatorUtil.checkResult(result);
if (StringUtils.isNotBlank(error)){
return new BaseResponse(StatusCode.Fail.getCode(),error);
}
BaseResponse re周笔畅-SpringBoot系列(四):SpringBoot整合Mybatis完成不一样的CRUDsponse=new BaseResponse(StatusCode.Success);
try {
response.setData(articleService.pageList(dto));
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}

向右滑动检查

其间的ArticleQueryDto首要用于接纳前端恳求过来的参数,如下所示:


import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**@Author:debug (SteadyJack)
* @Date: 2019/8/27 9:41
**/
@Data
public class ArticleQueryDto implements Serializable{
@NotNull
private Integer pageNo=1;
@NotNull
private Integer pageSize=10;
//待查找的内容
private String search;
}

(2)接下来是Service的代码(首要便是借助于PageHelper分页插件来完成):


@Override
public PageInfo
pageList(ArticleQueryDto dto) throws Exception {
PageHelper.startPage(dto.getPageNo(),dto.getPageSize());
return new PageInfo<>(articleMapper.pageSelect(dto.getSearch()));
}

最终是对应的Mapper操作接口及其对应的动态Sql的装备mapper.xml,代码如下所示:


List
pageSelect(@Param("search") String search);

对应的实践的Sql写法如下所示:



(3)最终,当然是进入自测啦,下图即可阐明全部:

3. 删去

关于删去,也没啥好说的,值得留意的是,一般在开发删去的时分,咱们都是选用批量删去的方法进行开发(批量当然也适合于删去单个的逻辑!)

(1)首要是Controller对应的代码:


//删去
@RequestMapping(value = "delete",method = RequestMethod.POST)
public BaseResponse delete(@RequestBody DeleteDto dto){
if (dto.getIds()==null || dto.getIds().isEmpty()){
return new BaseResponse(StatusCode.InvalidParams);
}周笔畅-SpringBoot系列(四):SpringBoot整合Mybatis完成不一样的CRUD
BaseResponse response=new BaseResponse(StatusCode.Success);
try {
articleService.deleteEntity(dto.getIds());
}catch (Exception e){
respo周笔畅-SpringBoot系列(四):SpringBoot整合Mybatis完成不一样的CRUDnse=new BaseResponse(St刘淼麟atusCode.Fail.getCode(),e.getMessage());
}
return response;
}

其间的DeleteDto,首要包含了待批量删去的id列表:


import lombok.Data;
import java.io.Serializable;
import java.util.Set;
/**
* @Author:debug (SteadyJack)
* @Date: 2019/8/27 10:09
**/
@Data
public class DeleteDto implements Serializable{
private Set ids;
}

(2)在Service中完成批量删去的代码逻辑如下所示:


@Override
public void deleteEntity(Set ids) throws Exception {
//第一种方法
/*if (ids!=null && !ids.isEmpty()){
ids.stream().forEach(id -> articleMapper.deleteByPrimaryKey(id));
}*/
//第二种方法
if (ids!=null && !ids.isEmpty()){
articleMapper.deleteBatch(Joiner.on(",").join(ids));
}
}

在这儿,Debug选用了两种不同的方法进行完成,一种是循环遍历逐一删去;一种是选用“Delete From 表名 Where id IN(xxx)”的sql进行删去,为了能让mybatis履行这样的批量删去sql,咱们需求将Set ids转化为“id + 逗号”拼接起来的字符串格局,即Joiner.on(“,”).join(xx)即可完成,其对应的动态sql如下所示:


void deleteBatch(@Param("ids") String ids);

对应的动周笔畅-SpringBoot系列(四):SpringBoot整合Mybatis完成不一样的CRUD态Sql:



DELETE FROM article
WHERE id IN (${ids})

(3)最终当然是进入自测了,一图就足以阐明全部了:

至此,根据Spring Boot整合Mybatis的共享介绍就到这儿了,各位小伙伴能够将源代码check下来,然后照着文中的介绍敲一遍、自测一遍,完了之后就根本上能够说了把握了Spring Boot项目下Mybatis的根本运用了!

引荐阅览:

SpringBoot系列(一):怎么构建一个规范的Spring Boot项目

SpringBoot系列(二):怎么构建一致的音讯呼应模型

SpringBoot系列(三):不要告诉我你还不会运用IDEA热布置功用