Spring Boot环境下Mybatis Plus的快速应用操作
一、简介
Mybatis-Plus(简称MP)是一个Mybatis的一个增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。其愿景是成为Mybatis最好的搭档,将开发效率翻倍,由于受到学习研究深入限制,本例只进行MybatisPlus在SpringBoot环境下的基本应用(如Select、Insert、Update、Delete等基本操作,其中还包括动态生成组合查询与更新的动态SQL语句)。
特性:
无侵入:Mybatis-Plus在Mybatis的基础上进行扩展,只做增强不做改变,引入Mybatis-Plus不会对您现有的Mybatis构架产生任何影响,而且MP支持所有Mybatis原生的特性。
依赖少:仅仅依赖Mybatis以及Mybatis-Spring
损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作。
预防Sql注入:内置Sql注入剥离器,有效预防Sql注入攻击。
通用CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题。
支持ActiveRecord:支持ActiveRecord形式调用,实体类只需继承Model类即可实现基本CRUD操作。
支持代码生成:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S.比Mybatis官方的Generator更加强大!)。
支持自定义全局通用操作:支持全局通用方法注入(Writeonce,useanywhere)。
支持关键词自动转义:支持数据库关键词(order、key……)自动转义,还可自定义关键词。
内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询。
内置全局拦截插件:提供全表delete、update操作智能分析阻断,预防误操作。
二、快速入门开发
1、依赖配置(SpringBoot方式)
pom.xml引入MyBatis依赖类
com.baomidou mybatisplus-spring-boot-starter 1.0.5 com.baomidou mybatis-plus 2.1.9
application.yaml配置内容如下:
#mybatisplus配置 mybatis-plus: #由于本例中采用注解方式编写sql,故而此处可不配置 #mapper-locations:classpath:/mapper/*Mapper.xml #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage:com.szss.admin.model #枚举扫描配置(本示例未使用到) #typeEnumsPackage:com.szss.admin.model.domain global-config: #主键类型0:"数据库ID自增",1:"用户输入ID",2:"全局唯一ID(数字类型唯一ID)",3:"UUID"; id-type:0 #字段策略0:"忽略判断",1:"非NULL判断"),2:"非空判断" field-strategy:2 #驼峰下划线转换 db-column-underline:true #刷新mapper调试神器(由于本例中采用注解方式编写sql,故而不需要刷新mapper.xml文件) #refresh-mapper:true #数据库大写下划线转换 capital-mode:true #序列接口实现类配置,在新的mybatis-plus-boot-starter中不推荐此方式进行配置,推荐自定义bean注入 key-generator:com.baomidou.mybatisplus.incrementer.H2KeyGenerator #逻辑删除配置(下面3个配置) logic-delete-value:1 logic-not-delete-value:0 sql-injector:com.baomidou.mybatisplus.mapper.LogicSqlInjector #SQL解析缓存,开启后多租户@SqlParser注解生效 sql-parser-cache:true configuration: map-underscore-to-camel-case:true cache-enabled:false
这样我们就完成了MyBatisPlus基本快速开发配置,接下来我们看看具体如何快速进行开发。
2、简单示例
假设我们已存在一张Role表,且已有对应的实体类Role,实现Role表的CRUD操作我们需要做什么呢?
importcom.baomidou.mybatisplus.mapper.BaseMapper; importcom.szss.admin.model.domain.RoleDO; importjava.util.List; importorg.apache.ibatis.annotations.Insert; importorg.apache.ibatis.annotations.Mapper; importorg.apache.ibatis.annotations.Param; importorg.apache.ibatis.annotations.Select; importorg.apache.ibatis.annotations.Update; /** *@authorAllen *@date2018/3/7 **RoleDO实体数据操作对象 */ @Mapper publicinterfaceRoleDAOextendsBaseMapper
{ //其他公共方法! }
以上就是所需的所有操作,不需要您创建任何XML文件,接下来我们如何使用它基本的CRUD呢?
*角色的CRUD操作代码信息
/** *根据角色ID查询角色 * *@paramid角色ID *@return角色信息 */ RoleDOroleDO=roleDAO.selectById(id); /** *根据查询条件查询角色列表(分页) * *@roleParam查询条件 *@return角色列表分页信息 */ Pagepage=newPage (roleParam.getPi().intValue(),roleParam.getPs().intValue()); //这里会动态根据前台所传入的值自动组合需要查询的字段信息,从而实现动态查询语句 EntityWrapper eWrapper=newEntityWrapper (roleDO); List roleDOList=roleDAO.selectPage(page,eWrapper); /** *角色新增 * *@paramroleParam角色信息 *@return角色信息 */ roleDAO.insert(roleDO); /** *角色更新(这里mybatisplus的CRUD操作会自动更新所需要更新的字段动态生成更新语句) * *@paramroleParam角色信息 *@return角色信息 */ roleDAO.updateById(roleDO); /** *角色删除(如果需要逻辑删除而非物理删除的话,需要结合@TableLogic标签使用,后续会说明) * *@paramid角色Id *@return删除角色 */ roleDAO.deleteById(id);
以上是基本的CRUD操作,当然可用的API远不止这几个,目前最新版本可提供了多达19个方法给大家使用,可以极其方便的实现单一、批量、分页等操作,上述中selectPage即是MP实现分页的强大操作,而对于EntityWrapper还可以动态组合各种复杂的查询条件各种组合。如上述所见,仅仅需要继承一个BaseMapper即可实现大部分单表CRUD操作,极大的减少的开发负担。有人也许会质疑:这难道不是通用Mapper么?别急,咱们接着往下看。
现有一个需求,我们需要分页查询User表中,年龄在18~50之间性别为男且姓名为张三的所有用户,这时候我们该如何实现上述需求呢?
传统做法是Mapper中定义一个方法,然后在MapperXML中填写对应的SELECT语句或者使用@SelectProvider注解来进行SQL语句代码的硬拼接,且还要集成分页,实现以上一个简单的需求,往往需要我们做很多重复单调的工作,普通的通用Mapper或@SelectProvider能够解决这类痛点么?答案是肯定的,不能!
用MP的方式打开以上需求
//分页查询10条姓名为‘王五'、性别为男,且年龄在18至50之间的用户记录 ListuserList=userMapper.selectPage( newPage (1,10), newEntityWrapper ().eq("name","王五") .eq("sex",0) .between("age","18","50") );
以上操作,等价于
SELECT* FROMsys_user WHERE(name='王五'ANDsex=0ANDageBETWEEN'18'AND'50') LIMIT0,10
Mybatis-Plus通过EntityWrapper(简称EW,MP封装的一个查询条件构造器)或者Condition(与EW类似)来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率。关于具体的EntityWrapper与Condition的用法请关注后续更多的文章说明,本例中不进行详细展开叙述。
ActiveRecord一直广受动态语言(PHP、Ruby等)的喜爱,而Java作为准静态语言,对于ActiveRecord往往只能感叹其优雅,所以我们也在AR道路上进行了一定的探索,喜欢大家能够喜欢,也同时欢迎大家反馈意见与建议。
我们如何使用AR模式?
三、开启AR模式
直接贴代码观内容:
packagecom.szss.admin.model.domain; importcom.baomidou.mybatisplus.activerecord.Model; importcom.baomidou.mybatisplus.annotations.TableField; importcom.baomidou.mybatisplus.annotations.TableId; importcom.baomidou.mybatisplus.annotations.TableLogic; importcom.baomidou.mybatisplus.annotations.TableName; importcom.baomidou.mybatisplus.enums.IdType; importcom.baomidou.mybatisplus.mapper.SqlCondition; importedu.umd.cs.findbugs.annotations.SuppressFBWarnings; importjava.io.Serializable; importjava.util.Date; importlombok.Data; /** *@authorAllen *@date2018/3/7角色实体 */ @Data @TableName("admin_role") publicclassRoleDOextendsModel{ /** *角色ID */ @TableId(type=IdType.AUTO) privateLongid; /** *角色名称 */ @TableField(condition=SqlCondition.LIKE) privateStringname; /** *角色描述 */ privateStringdescription; /** *是否启用:0-不可用,1-可用 */ privateBooleanenabled; /** *删除标示:0-未删除,1-已删除 */ @TableLogic privateBooleandeleted; /** *创建人ID */ protectedLongcreatorId; /** *创建人 */ protectedStringcreator; /** *创建时间 */ @SuppressFBWarnings("EI_EXPOSE_REP") protectedDatedateCreated; /** *修改人ID */ protectedLongmodifierId; /** *修改人 */ protectedStringmodifier; /** *更新时间 */ @SuppressFBWarnings("EI_EXPOSE_REP") protectedDatelastModified; /**指定主键*/ @Override protectedSerializablepkVal(){ returnthis.id; } }
如上所述仅仅需要继承Model类且实现主键pkVal指定方法即可让实体开启AR之旅,开启AR之路后,又将如何使用它呢?其实比较简单,在上述<角色的CRUD操作代码信息>中角色新增、更新与查询角色列表我们通过roleDAO.selectPage方法进行分页查询,而现在只需要直接通过roleDO.selectPage直接进行查询,具体代码如下所示:
/** *查询角色列表(分页) * *@paramroleParam角色参数 *@return查询角色分页列表 */ publicPageselectListPage(ListRoleParamroleParam){ RoleDOroleDO=newRoleDO(); BeanUtils.copyProperties(roleParam,roleDO); Page page=newPage ((int)roleParam.getPi(),(int)roleParam.getPs()); EntityWrapper eWrapper=newEntityWrapper (roleDO); //Page roleDOList=roleDAO.selectPage(page,eWrapper);//非AR方式的调用. Page roleDOList=roleDO.selectPage(page,eWrapper);//这里使用的就是Model提供的AR returnroleDOList; }
AR模式提供了一种更加便捷的方式实现CRUD操作,其本质还是调用的Mybatis对应的方法。
通过以上两个简单示例,我们简单领略了Mybatis-Plus的魅力与高效率,可以快速开发代码开发,真正的做到了即开即用。
对于上述RoleDO中的部分注解现就进行说明如下:
@TableName("admin_role")//注解指定表名
//主键类型AUTO:"数据库ID自增",INPUT:"用户输入ID",UUID:"全局唯一IDUUID";
@TableId(type=IdType.AUTO)
@TableField(condition=SqlCondition.LIKE)//在查询时匹配like动态语句
MP支持以下4中主键类型策略,可根据需求自行选用:
值 | 描述 |
---|---|
IdType.AUTO | 数据库ID自增 |
IdType.INPUT | 用户输入ID |
IdType.ID_WORKER | 全局唯一ID,内容为空自动填充(默认配置) |
IdType.UUID | 全局唯一ID,内容为空自动填充 |
上述三个注解是最为基本注解,也较为常用,对于各注解里面的参数详细部分不属于本示例范畴故而不一一详细说明。
四、总结
通过上述三个注解可以动态生成Insert语句,在插入新增角色时,自动生成Insertintoadmin_role(name,description,enableddeleted,...)values(...)对应的字段,而自动忽略id字段,因id主键通过@TableId注解为数据库自增类型。
而对于name这样的字段在日常查询中往往是通过like方式来进行匹配的而非精确匹配,所以此处通过@TableField(condition=SqlCondition.LIKE)来实现动态组合查询条件,其应用示例如上<根据查询条件查询角色列表(分页)>selectPage的应用,会根据前台传入的参数自动组合查询语句并进行分页。
其他update操作本示例中通过指定ID字段进行动态语句更新操作,当传入的值不为空时自动组合所需要更新的字段,而where条件即为指定的主键,自动生成updateadmin_rolesetname='王五'whereid=1,当然如果想实现某些字段更新成空的情况下,也可通过field-strategy属性配置的方式来进行实现。通过newEntityWrapper
在本例中delete操作并不是真正意义上的物理删除,而是逻辑删除,如果不配置@TableLogic注解的话,则为物理删除,会自动生成deleteadmin_rolewhereid=1的语句。如yml文件中配置了逻辑删除结合使用@TableLogic注解的话为逻辑删除,自动生成UPDATEadmin_roleSETdeleted=1WHEREid=1的语句(本例中不删除为0(False),删除为1(Ture),故而logic-delete-value:1与logic-not-delete-value:0如是配置)。
注:当配置了@TableLogic注解时在mp自带查询和更新方法的sql后面,追加『逻辑删除字段』=『LogicNotDeleteValue默认值』删除方法:deleteById()和其他delete方法,底层SQL调用的是updatetbl_xxxset『逻辑删除字段』=『logicDeleteValue默认值』
至此我们完成了数据库的DML与DQL的基本操作,在不改变现有的框架下,快速启用Mybatisplus的插件,简化操作提高开发效率,极大了解决了编写SQL语句的繁重工作,同时集成分页实现,减少代码量,从而为快速开发做好基础!
以上这篇SpringBoot环境下MybatisPlus的快速应用操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。