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

但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最好的搭档,就像 Contra Game 中的1P、2P,基友搭配,效率翻倍。

带问题去学习,请思考
- mybatis-plus怎么实现单表URUD操作?
- mybatis-plus的底层实现原理是什么?
- mybatis-plus与其他同类框架如mybatis helper有很什么优势?
- 如何集成mybatis-plus快速搭建一个spring boot项目。
特性

从上图可以看出,mybatis-plus不仅仅封装了基本的CRUD操作,还内置了防SQL注入操作、常用的分页插件,还有我最喜欢的ActiveRecord模式。
用过jfinal的人应该都知道ActiveRecord是啥。Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射。
常用实体注解
MP通过ORM模式封装了常用的CRUD操作,自然少不了实体注解,先来看看都有哪些注解

其中实体无注解化设置可以如下处理:
- 当数据库的表字段名是驼峰命名时无需注解处理。
- 或者全局配置: 下划线命名 dbColumnUnderline 设置 true , 大写 isCapitalMode 设置 true
但其实我压根就没管过手写过这些注解,使用mp代码生成器自动生成主体后直接覆盖原来的就行了,减少人工的失误,方便快捷。至于@Version与@KeySequence这两个注解,貌似我还真没用过。嘿嘿。。。
简化 CRUD
前面已经说了mp已经简化了mybatis的单表基本操作,先来看看。

相比两种写法,我更喜欢ActiveRecord的模式写法,因为我不用注入userMapper,new了一个对象之后直接调用方法操作就行了。
复杂的查询也很简单,新建一个EntityWrapper作为查询对象,Wrapper接口封装了很多常用的方法。几乎sql能写出来的条件调用Wrapper的方法就能表现出来。

架构原理
参考答案略。
不过我建议你去mp官网或者这里看看,哈哈 -> mybatis-plus 实践及架构原理.pdf
mybatis plus代码生成器 与 mybatis generator
说起mybatis plus代码生成器的代码,我记得以前这这篇文章中介绍过
现在再拿来用下哈。原理其实很简单,定义好velocity模板(当然你也可以自定义),然后传参数渲染模板生成对应的文件。
我建议你生成的位置最好不要直接覆盖原来的文件,你可能已经有过修改,直接覆盖的话会导致丢失。

而mybatis generator生成的代码就是基本的增删改查和实体。模板好像改不了,灵活性明显不够。
mp插件拓展
mp不仅仅帮我们实现了基本的增删改查操作,同时还扩展了很多实用的插件。让开发的过程更加简单。

分页插件
按如下步骤:
- 自定义查询语句分页(自己写sql/mapper)
- spring 注入 mybatis 配置分页插件
<plugins>
<!--
| 分页插件配置
| 插件提供二种方言选择:1、默认方言 2、自定义方言实现类,两者均未配置则抛出异常!
| overflowCurrent 溢出总页数,设置第一页 默认false
| optimizeType Count优化方式 ( 版本 2.0.9 改为使用 jsqlparser 不需要配置 )
| -->
<!-- 注意!! 如果要支持二级缓存分页使用类 CachePaginationInterceptor 默认、建议如下!! -->
<plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<property name="sqlParser" ref="自定义解析类、可以没有" />
<property name="localPage" value="默认 false 改为 true 开启了 pageHeper 支持、可以没有" />
<property name="dialectClazz" value="自定义方言类、可以没有" />
</plugin>
</plugins>
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
<span class="hljs-comment"><span class="hljs-comment">/**
* 分页插件
*/</span></span>
<span class="hljs-meta"><span class="hljs-meta">@Bean</span></span>
<span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span><span class="hljs-function"> PaginationInterceptor </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">paginationInterceptor</span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">()</span></span></span><span class="hljs-function"> </span></span>{
<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-keyword"><span class="hljs-keyword">new</span></span> PaginationInterceptor();
}
}
- UserMapper.java 方法内容
public interface UserMapper{//可以继承或者不继承BaseMapper
/**
* <p>
* 查询 : 根据state状态查询用户列表,分页显示
* </p>
*
* @param page
* 翻页对象,可以作为 xml 参数直接使用,传递参数 Page 即自动分页
* @param state
* 状态
* @return
*/
List<User> selectUserList(Pagination page, Integer state);
}
- UserServiceImpl.java 调用翻页方法,需要 page.setRecords 回传给页面
public Page<User> selectUserPage(Page<User> page, Integer state) {
return page.setRecords(userMapper.selectUserList(page, state));
}
- UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页
<select id="selectUserList" resultType="User">
SELECT * FROM user WHERE state=#{state}
</select>
逻辑删除插件
逻辑删除的效果 ---> 会在mp自带查询和更新方法的sql后面,追加『逻辑删除字段』=『LogicNotDeleteValue默认值』 删除方法: deleteById()和其他delete方法, 底层SQL调用的是update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue默认值』
配置如下:
- 修改 集成 全局注入器为 LogicSqlInjector
@Bean
public GlobalConfiguration globalConfiguration() {
GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());
conf.setLogicDeleteValue("-1");
conf.setLogicNotDeleteValue("1");
conf.setIdType(2);
return conf;
}
- application.yml全局注入值:
logicDeleteValue // 逻辑删除全局值
logicNotDeleteValue // 逻辑未删除全局值
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.baomidou.springboot.entity
typeEnumsPackage: com.baomidou.springboot.entity.enums
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 2
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
db-column-underline: true
#逻辑删除配置
logic-delete-value: 0
logic-not-delete-value: 1
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
- 逻辑删除的字段需要注解 @TableLogic
@TableName("tbl_user")
public class UserLogicDelete {
<span class="hljs-keyword"><span class="hljs-keyword">private</span></span> Long id;
...
<span class="hljs-meta"><span class="hljs-meta">@TableField</span></span>(value = <span class="hljs-string"><span class="hljs-string">"delete_flag"</span></span>)
<span class="hljs-meta"><span class="hljs-meta">@TableLogic</span></span>
<span class="hljs-keyword"><span class="hljs-keyword">private</span></span> Integer deleteFlag;
}
spring整合mybatis-plus的优秀案例
基本集成案例 mybatisplus-spring-boot
Java EE(J2EE)快速开发框架 SpringWind
SSM 后台框架 KangarooAdmin
JAVA分布式快速开发基础平台 iBase4J
又一个 SSM 后台管理框架 framework
猫宁Morning公益商城 Morning
简单实用的权限系统 spring-shiro-training Shiro 案例
原文地址:https://www.jianshu.com/p/df543044e8e2
mybatis-plus思维导图,让mybatis-plus不再难懂的更多相关文章
- Mybatis-plus 思维导图,让 Mybatis-plus 不再难懂
摘要: Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. mybatis-plus与mybatis myba ...
- java基础思维导图,让java不再难懂
java基础思维导图,让java不再难懂 原文链接 https://my.oschina.net/u/3080373/blog/873056 最近看了一些文章的思维导图,发现思维导图真是个强大的工具 ...
- Spring思维导图,让spring不再难懂(一)
写在前面 很多人在微信公众号中给我留言说想看spring的思维导图,正好也打算写.与其他框架相比,spring项目拥有更多的模块,我们常用的ioc,mvc,aop等,这些是spring的主要板块.一篇 ...
- 思维导图让 Spring MVC 不再难懂
spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器 ...
- mybatis思维导图(二)
写在前面 上一篇文章写了mybatis的基本原理和配置文件的基本使用,这一篇写mybatis的使用,主要包括与sping集成.动态sql.还有mapper的xml文件一下复杂配置等.值得注意的是,导图 ...
- mybatis思维导图(一)
写在前面 与hibernate相比,我无疑更喜欢mybatis,就因为我觉得它真的好用,哈哈.它简单上手和掌握:sql语句和代码分开,方便统一管理和优化:当然缺点也有:sql工作量很大,尤其是字段多. ...
- 2020面试还搞不懂MyBatis?快看看这27道面试题!(含答案和思维导图)
前言 MyBatis是一个优秀的持久层ORM框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statem ...
- 面试BAT问的最多的27道MyBatis 面试题(含答案和思维导图总结)
前言 关于MyBatis总结了一个思维导图希望对大家有帮助 什么是 Mybatis? Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身, ...
- 浅谈Java的主要学习要点_上海尚学堂java培训课程思维导图
Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥 ...
随机推荐
- 微信支付URL编解码小方法
--> 打开chrome --> F12或Fn+F12打开控制台 --> encodeURIComponent("url") --> 回车
- 订单风险系统BI
最近被公司叫去协助传统做维表查询服务,项目已经做完.和前端联调过程发现oracle对查询 sql和产品设计还是挺重要的.不能全部堆给代码去做,如何方便代码,代码优化到最高性能才是首要解决的事,前端才能 ...
- 微信小程序之组件的集合(六)
这个将是最后一篇关于小程序的记录了,课程接近尾声,最后一个是关于用户的page页面,看看这个页面中有哪些值得学习的地方! 一.page中my开发 这个主要是展示用户喜欢的杂志,以及用户的信息,需要创建 ...
- webstorm激活破解方法
注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下面的网址: http://idea.imsxm.com/ 点击:Activate即可. 如 ...
- node.js 安装步骤
1.打开链接(http://nodejs.cn/download/) 2.下载自己所需的安装包(32位 or 64位.哪个系统) 3.双击直接安装(成功如下图) 4.点击 Node.js comman ...
- java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
HTTP Status 500 - Request processing failed; nested exception is org.hibernate.exception.ConstraintV ...
- netbeans 8.2 系统找不到指定的文件。
系统找不到指定的文件.Using CATALINA_BASE: "C:\Users\wishr\AppData\Roaming\NetBeans\8.2\apache-tomcat-8.0. ...
- SpringBoot Jar应用Linux后台部署执行
nohup java -jar shop-h5.jar > log_h5.file 2>&1 &
- 2.android工具使用及appium启动
1.adb devices 可以查看手机是否连接成功. 2.aapt dump badging xxx.apk 查看app信息. 3.启动appium需配置platformName和deviceN ...
- Codeforces 360A(找性质)
反思 写一写可以发现上限不断更新 一直在想怎么判断NO,刻板拘泥于错误的模型,想要像往常一样贪心地.读入当前值就能判断会不会NO,实际上只要构造完以后,最后把所有操作重新跑一遍看会不会冲突即可判断NO ...