mybatisplus简明介绍

本文深入探讨MyBatis Plus框架,介绍其简化MyBatis单表操作的特性,包括自动化的CRUD操作、防SQL注入、分页插件、ActiveRecord模式等。通过与MyBatisGenerator对比,展示代码生成器的灵活性与便捷性,以及如何集成到SpringBoot项目中。
摘要由CSDN通过智能技术生成

是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

回顾mybatis的特点.png

但mybatis有个让我比较头疼的一个问题是sql工作量很大,尤其是字段多的时候。虽然说单表的增删改查操作可以通过mybatis generator工具来生成(或者自己写模板工具生成),但项目开发的过程中总免不了要新添加新字段,这些工具就帮不了我了,我得把新字段写到原来的所有增删改查的sql中。这是个痛苦的过程,特别是当你重复了很多次之后。

mybatis的单表操作也是贼麻烦的事,因为筛选的条件可能会各种各样,所以你不得不写很多动态sql来兼容查询条件,这也让我不能集中精力去处理业务。

每当这时候,我怀念Hibernate了。嘿嘿,Hibernate加字段就贼简单,单表操作也是贼方便。但我依然不喜欢用Hibernate,哈哈。

mybatis-plus

而mybatis-plus这样一个框架,一种集mybatis与hibernate的优点一起的框架。它提供了hibernate的单表CRUD操作的方便同时,又保留了mybatis的特性。

先来看看官方怎么解释mybatis-plus的:

  • Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

Mybatis-Plus与Mybatis.png

  • 我们的愿景是成为Mybatis最好的搭档,就像 Contra Game 中的1P、2P,基友搭配,效率翻倍。

Contra Game的1P、2P.png

带问题去学习,请思考

  • mybatis-plus怎么实现单表URUD操作?
  • mybatis-plus的底层实现原理是什么?
  • mybatis-plus与其他同类框架如mybatis helper有很什么优势?
  • 如何集成mybatis-plus快速搭建一个spring boot项目。

特性

image.png

从上图可以看出,mybatis-plus不仅仅封装了基本的CRUD操作,还内置了防SQL注入操作、常用的分页插件,还有我最喜欢的ActiveRecord模式。

用过jfinal的人应该都知道ActiveRecord是啥。Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射。

常用实体注解

MP通过ORM模式封装了常用的CRUD操作,自然少不了实体注解,先来看看都有哪些注解

MP常用实体注解.png

其中实体无注解化设置可以如下处理:

  • 当数据库的表字段名是驼峰命名时无需注解处理。
  • 或者全局配置: 下划线命名 dbColumnUnderline 设置 true , 大写 isCapitalMode 设置 true

但其实我压根就没管过手写过这些注解,使用mp代码生成器自动生成主体后直接覆盖原来的就行了,减少人工的失误,方便快捷。至于@Version与@KeySequence这两个注解,貌似我还真没用过。嘿嘿。。。

简化 CRUD

前面已经说了mp已经简化了mybatis的单表基本操作,先来看看。

MP增删改查.png

相比两种写法,我更喜欢ActiveRecord的模式写法,因为我不用注入userMapper,new了一个对象之后直接调用方法操作就行了。

复杂的查询也很简单,新建一个EntityWrapper作为查询对象,Wrapper接口封装了很多常用的方法。几乎sql能写出来的条件调用Wrapper的方法就能表现出来。

筛选条件Wrapper的方法.png

架构原理

参考答案略。

不过我建议你去mp官网或者这里看看,哈哈 -> mybatis-plus 实践及架构原理.pdf

mybatis plus代码生成器 与 mybatis generator

说起mybatis plus代码生成器的代码,我记得以前这这篇文章中介绍过

现在再拿来用下哈。原理其实很简单,定义好velocity模板(当然你也可以自定义),然后传参数渲染模板生成对应的文件。

我建议你生成的位置最好不要直接覆盖原来的文件,你可能已经有过修改,直接覆盖的话会导致丢失。

mp代码生成器原理.png

而mybatis generator生成的代码就是基本的增删改查和实体。模板好像改不了,灵活性明显不够。

mp插件拓展

mp不仅仅帮我们实现了基本的增删改查操作,同时还扩展了很多实用的插件。让开发的过程更加简单。

插件拓展.png

分页插件 按如下步骤:

  • 自定义查询语句分页(自己写sql/mapper)
  • spring 注入 mybatis 配置分页插件
 
  1. <plugins>

  2. <!--

  3. | 分页插件配置

  4. | 插件提供二种方言选择:1、默认方言 2、自定义方言实现类,两者均未配置则抛出异常!

  5. | overflowCurrent 溢出总页数,设置第一页 默认false

  6. | optimizeType Count优化方式 ( 版本 2.0.9 改为使用 jsqlparser 不需要配置 )

  7. | -->

  8. <!-- 注意!! 如果要支持二级缓存分页使用类 CachePaginationInterceptor 默认、建议如下!! -->

  9. <plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor">

  10. <property name="sqlParser" ref="自定义解析类、可以没有" />

  11. <property name="localPage" value="默认 false 改为 true 开启了 pageHeper 支持、可以没有" />

  12. <property name="dialectClazz" value="自定义方言类、可以没有" />

  13. </plugin>

  14. </plugins>

 
  1. //Spring boot方式

  2. @EnableTransactionManagement

  3. @Configuration

  4. @MapperScan("com.baomidou.cloud.service.*.mapper*")

  5. public class MybatisPlusConfig {

  6.  
  7. /**

  8. * 分页插件

  9. */

  10. @Bean

  11. public PaginationInterceptor paginationInterceptor() {

  12. return new PaginationInterceptor();

  13. }

  14. }

  • UserMapper.java 方法内容
 
  1. public interface UserMapper{//可以继承或者不继承BaseMapper

  2. /**

  3. * <p>

  4. * 查询 : 根据state状态查询用户列表,分页显示

  5. * </p>

  6. *

  7. * @param page

  8. * 翻页对象,可以作为 xml 参数直接使用,传递参数 Page 即自动分页

  9. * @param state

  10. * 状态

  11. * @return

  12. */

  13. List<User> selectUserList(Pagination page, Integer state);

  14. }

  15.  
  • UserServiceImpl.java 调用翻页方法,需要 page.setRecords 回传给页面
 
  1. public Page<User> selectUserPage(Page<User> page, Integer state) {

  2. return page.setRecords(userMapper.selectUserList(page, state));

  3. }

  • UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页
 
  1. <select id="selectUserList" resultType="User">

  2. SELECT * FROM user WHERE state=#{state}

  3. </select>

  4.  

逻辑删除插件

逻辑删除的效果 ---> 会在mp自带查询和更新方法的sql后面,追加『逻辑删除字段』=『LogicNotDeleteValue默认值』 删除方法: deleteById()和其他delete方法, 底层SQL调用的是update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue默认值』

配置如下:

  1. 修改 集成 全局注入器为 LogicSqlInjector
 
  1. @Bean

  2. public GlobalConfiguration globalConfiguration() {

  3. GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());

  4. conf.setLogicDeleteValue("-1");

  5. conf.setLogicNotDeleteValue("1");

  6. conf.setIdType(2);

  7. return conf;

  8. }

  1. application.yml全局注入值: logicDeleteValue // 逻辑删除全局值 logicNotDeleteValue // 逻辑未删除全局值
 
  1. mybatis-plus:

  2. mapper-locations: classpath:/mapper/*Mapper.xml

  3. #实体扫描,多个package用逗号或者分号分隔

  4. typeAliasesPackage: com.baomidou.springboot.entity

  5. typeEnumsPackage: com.baomidou.springboot.entity.enums

  6. global-config:

  7. #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";

  8. id-type: 2

  9. #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"

  10. field-strategy: 2

  11. db-column-underline: true

  12. #逻辑删除配置

  13. logic-delete-value: 0

  14. logic-not-delete-value: 1

  15. sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector

  1. 逻辑删除的字段需要注解 @TableLogic
 
  1. @TableName("tbl_user")

  2. public class UserLogicDelete {

  3.  
  4. private Long id;

  5. ...

  6.  
  7. @TableField(value = "delete_flag")

  8. @TableLogic

  9. private Integer deleteFlag;

  10. }

spring整合mybatis-plus的优秀案例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值