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. 单线程service服务

    1.@Service修饰类名,同时类继承Thread类 @Service public class MasterSchedulerService extends Thread { /** * logg ...

  2. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  3. L4自动驾驶技术

    L4自动驾驶技术 一.SAE的五个级别分别是: L0:驾驶员完全掌控车辆,无任何自动化能力. L1:自动系统有时能够辅助驾驶员完成某些驾驶任务.比如高速自动巡航(自动认知所在车道),和一些驾驶辅助功能 ...

  4. MySQL笔记04(黑马)

    今日内容 多表查询 事务 DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...

  5. Etcd中Raft joint consensus的实现

    Joint consensus 分为2个阶段,first switches to a transitional configuration we call joint consensus; once ...

  6. 【C++】共用体\联合体(union)

    共用体的用法与结构体差不多,只不过将关键字由struct变成了union.共用体使不同的类型变量存放到同一段内存单元中,所以共用体在同一时刻只能存储一个数据成员的值,共用体的大小等于最大成员的大小(结 ...

  7. windows 上 OpenSSH 服务 启用秘钥登录(微软真心逆天)

    windows 上 OpenSSH 服务 启用秘钥登录(微软真心逆天) windows 安装 OpenSSH 服务 最近需要在windows 服务器上部署自动发布程序,那么就需要用到 scp 和 ss ...

  8. 『心善渊』Selenium3.0基础 — 8、使用CSS选择器定位元素

    目录 1.CSS选择器介绍 2.CSS选择器定位语法 3.Selenium中使用CSS选择器定位元素 (1)通过属性定位元素 (2)通过标签定位元素 (3)通过层级关系定位元素 (4)通过索引定位元素 ...

  9. Windows下安装kubectl及Node和Pod操作常用命令

    kubernetes通过kube-apiserver作为整个集群管理的入口.Apiserver是整个集群的主管理节点,用户通过Apiserver配置和组织集群,同时集群中各个节点同etcd存储的交互也 ...

  10. Android开发万能Utils(工具大全)

    AndroidUtils Android开发不得不收藏的Utils About AndroidUtilCode  是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo ...