SpringBoot 整合 MybatisPlus 3.0
需求:
存在一张 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>
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、显示结果:
SpringBoot 整合 MybatisPlus 3.0的更多相关文章
- SpringBoot整合Mybatis-Plus
这篇文章介绍一个SpringBoot整合Mybatis-Plus,提供一个小的Demo供大家参考. 已经很久没有写文章了,最近家里有点事刚刚处理完,顺便也趁机休息了一段时间.刚回到公司看了一下码云,发 ...
- SpringBoot整合MyBatisPlus配置动态数据源
目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...
- SpringBoot整合Mybatis-plus实现增删查改
今天给大家分享一下SpringBoot整合Mybatis-plus的增删查改案例. pom.xml <?xml version="1.0" encoding="UT ...
- SpringBoot 整合 MyBatis-Plus 入门体验
一.前言 本文小编将基于 SpringBoot 整合 MyBatis-Plus , MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上做增强并且不改变原本功能 ...
- 5、SpringBoot整合之SpringBoot整合MybatisPlus
SpringBoot整合MybatisPlus 目录(可点击直接跳转,但还是建议按照顺序观看,四部分具有一定的关联性): 实现基础的增删改查 实现自动填充功能 实现逻辑删除 实现分页 首先给出四部分完 ...
- Springboot 整合 MyBatisPlus[详细过程]
Springboot 整合 MyBatisPlus[详细过程] 提要 这里已经将Springboot环境创建好 这里只是整合MyBatis过程 引入Maven依赖 添加MyBatisPlus启动依赖, ...
- 实践丨SpringBoot整合Mybatis-Plus项目存在Mapper时报错
摘要:在SpringBoot运行测试Mybatis-Plus测试的时候报错的问题分析与修复 本文分享自华为云社区<SpringBoot整合MybatisPlus项目存在Mapper时运行报错的问 ...
- Activiti工作流学习之SpringBoot整合Activiti5.22.0实现在线设计器(二)
一.概述 网上有很多关于Eclipse.IDEA等IDE插件通过拖拽的方式来画工作流程图,个人觉得还是不够好,所以花点时间研究了一下Activiti在线设计器,并与SpringBoot整合. 二.实现 ...
- SpringBoot整合MyBatis-Plus实现快速业务功能开发
概览:使用MybatisPlus和它的代码生成整合SpringBoot可以实现快速的业务功能开发,具体步骤如下 一.添加依赖 <dependency> <groupId>org ...
随机推荐
- SpringCloud Alibaba实战(3:存储设计与基础架构设计)
1.存储设计 在上一章中,我们已经完成了基本业务流程的梳理和服务模块的划分,接下来,开始设计数据存储. 虽然在微服务的理论中,没有对数据库定强制性的规范,但一般,服务拆分之后,数据库也会对应的拆分. ...
- 无人驾驶汽车发展需要激光雷达和V2X技术
无人驾驶汽车发展需要激光雷达和V2X技术
- 微信架构 & 支付架构(下)
微信架构 & 支付架构(下) 3. 管理网络请求 首先看看原来 iOS 处理支付网络请求的缺陷: 原来支付的请求,都是通过一个单例网络中心去发起请求,然后收到回包后,通过抛通知,或者调用闭包的 ...
- GitHub上YOLOv5开源代码的训练数据定义
GitHub上YOLOv5开源代码的训练数据定义 代码地址:https://github.com/ultralytics/YOLOv5 训练数据定义地址:https://github.com/ultr ...
- 神经网络AI加速器技术
神经网络AI加速器技术 能够直接加速卷积神经网络,还能够直接运行常见的网络框架,如TensorFlow.Caffe.PyTorch,DarkNet等,支持用户定制化的网络和计算类型. 功能特点: ● ...
- 【SQLite】教程07-C/C++上使用SQLite3
1.配置好C/C++项目环境 2.源码 1 #include <iostream> 2 #include <vector> 3 #include <string> ...
- Django基础之模板层
内容概要 模板层(模板语法) 模板语法传值模板语法过滤器(内置方法)模板语法标签(流程控制)自定义过滤器和标签(了解) 模板的导入与继承(面向对象) 内容详细 1 模板层之模板语法传值 http ...
- EasyExcel随笔
EasyExcel 注意点 不支持的功能 单个文件的并发写入.读取 读取图片 宏 csv读取 出现 NoSuchMethodException, ClassNotFoundException, NoC ...
- pipenv管理模块和包
pipenv安装 1. 在终端输入:pip install pipenv进行安装 用pipenv创建虚拟环境:pipenv install,在哪个文件下运行这个命令,就是给哪个文件创建虚拟环境 这 ...
- Vue3全局APi解析-源码学习
本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...