摘要: Mybatis-Plus(简称MP)是一个Mybatis的加强工具,在 Mybatis 的基础上只作加强不作改变,为简化开发、提升效率而生。php
mybatis-plus与mybatisjava
mybatisnginx
Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎全部的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。git
但mybatis有个让我比较头疼的一个问题是sql工做量很大,尤为是字段多的时候。虽说单表的增删改查操做能够经过mybatis generator工具来生成(或者本身写模板工具生成),但项目开发的过程当中总免不了要新添加新字段,这些工具就帮不了我了,我得把新字段写到原来的全部增删改查的sql中。这是个痛苦的过程,特别是当你重复了不少次以后。github
mybatis的单表操做也是贼麻烦的事,由于筛选的条件可能会各类各样,因此你不得不写不少动态sql来兼容查询条件,这也让我不能集中精力去处理业务。spring
每当这时候,我怀念Hibernate了。嘿嘿,Hibernate加字段就贼简单,单表操做也是贼方便。但我依然不喜欢用Hibernate,哈哈。sql
mybatis-plus数据库
而mybatis-plus这样一个框架,一种集mybatis与hibernate的优势一块儿的框架。它提供了hibernate的单表CRUD操做的方便同时,又保留了mybatis的特性。设计模式
先来看看官方怎么解释mybatis-plus的:api
Mybatis
最好的搭档,就像 Contra Game 中的1P、2P,基友搭配,效率翻倍。带问题去学习,请思考
特性
从上图能够看出,mybatis-plus不只仅封装了基本的CRUD操做,还内置了防SQL注入操做、经常使用的分页插件,还有我最喜欢的ActiveRecord模式。
用过jfinal的人应该都知道ActiveRecord是啥。Active Record 是一种数据访问设计模式,它能够帮助你实现数据对象Object到关系数据库的映射。
经常使用实体注解
MP经过ORM模式封装了经常使用的CRUD操做,天然少不了实体注解,先来看看都有哪些注解
其中实体无注解化设置能够以下处理:
但其实我压根就没管过手写过这些注解,使用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不只仅帮咱们实现了基本的增删改查操做,同时还扩展了不少实用的插件。让开发的过程更加简单。
分页插件 按以下步骤:
<plugins> <!-- | 分页插件配置 | 插件提供二种方言选择:一、默认方言 二、自定义方言实现类,二者均未配置则抛出异常! | 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 { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
public interface UserMapper{//能够继承或者不继承BaseMapper /** * <p> * 查询 : 根据state状态查询用户列表,分页显示 * </p> * * @param page * 翻页对象,能够做为 xml 参数直接使用,传递参数 Page 即自动分页 * @param state * 状态 * @return */ List<User> selectUserList(Pagination page, Integer state); }
public Page<User> selectUserPage(Page<User> page, Integer state) { return page.setRecords(userMapper.selectUserList(page, state)); }
<select id="selectUserList" resultType="User"> SELECT * FROM user WHERE state=#{state} </select>
逻辑删除插件
逻辑删除的效果 ---> 会在mp自带查询和更新方法的sql后面,追加『逻辑删除字段』=『LogicNotDeleteValue默认值』 删除方法: deleteById()和其余delete方法, 底层SQL调用的是update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue默认值』
配置以下:
@Bean public GlobalConfiguration globalConfiguration() { GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector()); conf.setLogicDeleteValue("-1"); conf.setLogicNotDeleteValue("1"); conf.setIdType(2); return conf; }
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
@TableName("tbl_user") public class UserLogicDelete { private Long id; ... @TableField(value = "delete_flag") @TableLogic private Integer deleteFlag; }
spring整合mybatis-plus的优秀案例
基本集成案例 mybatisplus-spring-boot
Java EE(J2EE)快速开发框架 SpringWind
SSM 后台框架 KangarooAdmin
JAVA分布式快速开发基础平台 iBase4J
又一个 SSM 后台管理框架 framework
猫宁Morning公益商城 Morning
简单实用的权限系统 spring-shiro-training Shiro 案例