SpringBoot 整合 MybatisPlus 3.0


 
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
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM