CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本操作功能

需求:
存在一张 message 表,且已有对应的实体类 Message,实现message 表的 CRUD 操作我们需要做什么呢?
基于 Mybatis:
需要编写 MessageMapper 接口,并在 MessageMapper.xml 映射文件中手动编写 CRUD 方法对应的sql语句。
基于 MP:
只需要创建 MessageMapper 接口, 并继承 BaseMapper 接口。
我们已经有了Message、message了,并且MessageDao也继承了BaseMapper了,接下来就使用crud方法。

前言:

mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。

一、mybatis-plus简介:

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

二、spring整合mybatis-plus:

正如官方所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦非常简单。只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可。接下来看具体操作:
1、pom.xml:
核心依赖如下:

<!-- druid数据库连接池启动器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.46</version>
</dependency>
<!-- mybatis-plus启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.0.1</version>
</dependency>
注意:这些是核心依赖,本项目还用到了mysql驱动、c3p0、日志(slf4j-api,slf4j-log4j2)、lombok。集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突;lombok是一个工具,添加了这个依赖,开发工具再安装Lombok插件,就可以使用它了,最常用的用法就是在实体类中使用它的@Data注解,这样实体类就不用写set、get、toString等方法了。关于Lombok的更多用法,请自行百度。

2、application.properties配置:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false

3、 编写实体类:

/**
* @create 2019.08.14
**/
@AllArgsConstructor
@NoArgsConstructor
@Accessors
@Data
@TableName(value = "message")
public class Message implements Serializable {
  //value与数据库主键列名一致,若实体类属性名与表主键列名一致可省略value
@TableId(value = "id",type = IdType.AUTO)//指定自增策略 
private Integer id;
private Integer mid;
private String content;
@TableField(value = "column_200")
private String column1;
@TableField(value = "column_500")
private String column2;
@TableField(value = "column_5000")
private String column3;
}

解说:(1)@TableName是mybatis plus对表的注解,每个实体必须要加,不然会导致表不存在异常。

(2)@TableId对主键的注解 @TableId中有一个属性叫type是枚举类型,该属性主要作用是主键以什么形式存在,例如IdType.AUTO自增或UUID。

(3)@TableField像及了mybatis中的resultMap,在mybatis中为什么要使用resultMap,因为当实体中的属性名与数据库中的表不一致时需要手动映射,resultMap的作用在于手动映射,既然说了resultMap就不能不说resultType,resultType当实体属性与表字段一致时自动映射。 在mybatis plus使用@TableField的场景与mybatis中使用resultMap的是一致的。@TableField中还有一个属性不能不提,就是exist,这个属性属于boolean类型,默认为true,意思是是否在数据表中存在,true存在,false不存在,这个的应用场景是当某个实体中需要包含其他实体时,可使用该属性,否则自动生成的查会报错,使用自动生成的查有关方法,默认是查所有数据表所有字段,当然可使用setSqlSelect()方法指定需要查的字段,可以在一定程度上避免该错误的出现,不然导致的错误最有可能就是找不到该字段异常(column not exist),使用exist属性可直接避免,当然也可以在该属性中加入static或transient修饰,与exist的作用本质上是一样的。

4.、编写mapper接口继承BaseMapper接口的数据操作方法:

/**
* @create 2019.08.14
**/
@Mapper
public interface MessageMapper extends BaseMapper<Message> {}

解说:BaseMapper<T>中包含的就是一系列增删改查,maven项目中可Ctrl+鼠标点击进去查看源码,源码所有注释都有,非常浅显易懂,如果你需要加入自定义sql直接写就行,跟mybatis一样,在该类中新增方法,只需在对应的xml中配置即可

5、编写Service

/**
* @create 2019.08.14
**/
public interface MessageService {
List<Message> getAllMessage();
List<Message> getMessageByMid(Integer mid);
Integer fetchOne(Integer id,Integer mid);
Integer updateMessageByModuleIdAndMessageId(Message message);
Integer addMessage(Message message);
Integer deleteMessage(Integer mid,Integer id);
}

Service实现类:

/**
* @create 2019.08.14
**/
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private MessageMapper messageMapper;
private Logger logger = LoggerFactory.getLogger(getClass()); @Override
public List<Message> getAllMessage() {
return messageMapper.selectList(new QueryWrapper<Message>());
} @Override
public List<Message> getMessageByMid(Integer mid) {
return messageMapper.selectList(new QueryWrapper<Message>().eq("mid",mid));
} @Override
public Integer fetchOne(Integer id,Integer mid){
return messageMapper.selectCount(new QueryWrapper<Message>().eq("id",id).eq("mid",mid));
} @Override
public Integer updateMessageByModuleIdAndMessageId(Message message){
System.out.println(message);
logger.debug(message.toString());
return messageMapper.updateById(message);
}
@Override
public Integer addMessage(Message message){
System.out.println(message);
logger.debug(message.toString());
return messageMapper.insert(message);
}
@Override
public Integer deleteMessage(Integer mid,Integer id){
logger.debug(mid+"-"+id);
return messageMapper.delete(new QueryWrapper<Message>().eq("id",id).eq("mid",mid));
}
}

解说:@Service注解的作用也是同mybatis之前那样也是一样,这个注解的作用扫描Service层,自动注解spring容器

6、编写Controller

/**
* @create 2019.08.14
**/
@RestController
public class MainController {
@Autowired
private MessageService messageService; @GetMapping("/messages")
public ModelMap getMessages(){
ModelMap map = new ModelMap();
return map.addAttribute("messages",messageService.getAllMessage());
} @GetMapping("module1")
public Object getMessageType1(){
return messageService.getMessageByMid(1);
} @GetMapping("module2")
public Object getMessageType2(){
return messageService.getMessageByMid(2);
} @PostMapping("/message")
public ModelMap addMessage(@RequestBody Message message){
ModelMap map = new ModelMap();
Integer result = messageService.addMessage(message);
if (result==1){
map.addAttribute("result",true);
map.addAttribute("tip","添加成功!");
}else{
map.addAttribute("result",false);
map.addAttribute("tip","添加失败!");
}
return map;
} @DeleteMapping("/{mid}/{id}")
public ModelMap deleteMessage(@PathVariable Integer mid,@PathVariable Integer id){
System.out.println(mid);
System.out.println(id);
ModelMap map = new ModelMap();
Integer result = messageService.deleteMessage(mid,id);
if (result==1){
map.addAttribute("result",true).addAttribute("tip","删除成功!");
}else{
map.addAttribute("result",false).addAttribute("tip","删除失败!");
}
return map;
} @PatchMapping("/message")
public ModelMap updateMessage(@RequestBody Message message){
Integer one = messageService.fetchOne(message.getId(), message.getMid());
ModelMap map = new ModelMap();
if (one==1){
Integer result = messageService.updateMessageByModuleIdAndMessageId(message);
if (result==1){
map.addAttribute("result",true).addAttribute("tip","更新成功!");
}else{
map.addAttribute("result",false).addAttribute("tip","更新失败!");
}
System.out.println(message);
}else{
map.addAttribute("tip","查询异常!");
}
return map;
}
}

7、显示结果:

https://yq.aliyun.com/articles/713779?spm=a2c4e.11163080.searchblog.9.5b4f2ec1UxSaKD
 

SpringBoot 整合 MybatisPlus 3.0的更多相关文章

  1. SpringBoot整合Mybatis-Plus

    这篇文章介绍一个SpringBoot整合Mybatis-Plus,提供一个小的Demo供大家参考. 已经很久没有写文章了,最近家里有点事刚刚处理完,顺便也趁机休息了一段时间.刚回到公司看了一下码云,发 ...

  2. SpringBoot整合MyBatisPlus配置动态数据源

    目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...

  3. SpringBoot整合Mybatis-plus实现增删查改

    今天给大家分享一下SpringBoot整合Mybatis-plus的增删查改案例. pom.xml <?xml version="1.0" encoding="UT ...

  4. SpringBoot 整合 MyBatis-Plus 入门体验

    一.前言 本文小编将基于 SpringBoot 整合 MyBatis-Plus , MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上做增强并且不改变原本功能 ...

  5. 5、SpringBoot整合之SpringBoot整合MybatisPlus

    SpringBoot整合MybatisPlus 目录(可点击直接跳转,但还是建议按照顺序观看,四部分具有一定的关联性): 实现基础的增删改查 实现自动填充功能 实现逻辑删除 实现分页 首先给出四部分完 ...

  6. Springboot 整合 MyBatisPlus[详细过程]

    Springboot 整合 MyBatisPlus[详细过程] 提要 这里已经将Springboot环境创建好 这里只是整合MyBatis过程 引入Maven依赖 添加MyBatisPlus启动依赖, ...

  7. 实践丨SpringBoot整合Mybatis-Plus项目存在Mapper时报错

    摘要:在SpringBoot运行测试Mybatis-Plus测试的时候报错的问题分析与修复 本文分享自华为云社区<SpringBoot整合MybatisPlus项目存在Mapper时运行报错的问 ...

  8. Activiti工作流学习之SpringBoot整合Activiti5.22.0实现在线设计器(二)

    一.概述 网上有很多关于Eclipse.IDEA等IDE插件通过拖拽的方式来画工作流程图,个人觉得还是不够好,所以花点时间研究了一下Activiti在线设计器,并与SpringBoot整合. 二.实现 ...

  9. SpringBoot整合MyBatis-Plus实现快速业务功能开发

    概览:使用MybatisPlus和它的代码生成整合SpringBoot可以实现快速的业务功能开发,具体步骤如下 一.添加依赖 <dependency> <groupId>org ...

随机推荐

  1. SpringCloud Alibaba实战(3:存储设计与基础架构设计)

    1.存储设计 在上一章中,我们已经完成了基本业务流程的梳理和服务模块的划分,接下来,开始设计数据存储. 虽然在微服务的理论中,没有对数据库定强制性的规范,但一般,服务拆分之后,数据库也会对应的拆分. ...

  2. 无人驾驶汽车发展需要激光雷达和V2X技术

    无人驾驶汽车发展需要激光雷达和V2X技术

  3. 微信架构 & 支付架构(下)

    微信架构 & 支付架构(下) 3. 管理网络请求 首先看看原来 iOS 处理支付网络请求的缺陷: 原来支付的请求,都是通过一个单例网络中心去发起请求,然后收到回包后,通过抛通知,或者调用闭包的 ...

  4. GitHub上YOLOv5开源代码的训练数据定义

    GitHub上YOLOv5开源代码的训练数据定义 代码地址:https://github.com/ultralytics/YOLOv5 训练数据定义地址:https://github.com/ultr ...

  5. 神经网络AI加速器技术

    神经网络AI加速器技术 能够直接加速卷积神经网络,还能够直接运行常见的网络框架,如TensorFlow.Caffe.PyTorch,DarkNet等,支持用户定制化的网络和计算类型. 功能特点: ● ...

  6. 【SQLite】教程07-C/C++上使用SQLite3

    1.配置好C/C++项目环境 2.源码 1 #include <iostream> 2 #include <vector> 3 #include <string> ...

  7. Django基础之模板层

    内容概要 模板层(模板语法) 模板语法传值​模板语法过滤器(内置方法)​模板语法标签(流程控制)​自定义过滤器和标签(了解) 模板的导入与继承(面向对象) 内容详细 1 模板层之模板语法传值 http ...

  8. EasyExcel随笔

    EasyExcel 注意点 不支持的功能 单个文件的并发写入.读取 读取图片 宏 csv读取 出现 NoSuchMethodException, ClassNotFoundException, NoC ...

  9. pipenv管理模块和包

    pipenv安装 1. 在终端输入:pip install pipenv进行安装 用pipenv创建虚拟环境:pipenv install,在哪个文件下运行这个命令,就是给哪个文件创建虚拟环境   这 ...

  10. Vue3全局APi解析-源码学习

    本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...