045-mybatis plus

MyBatis是目前最流行的JDBC持久层框架,著名的ssm框架中的m。关于springboot集成mybatis可以参考本系列前面的文章(003和004)。关于MyBatis不再介绍。

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



MyBatis-Plus特性

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库

支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动

支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击



框架结构

关于其它,可以参考官方文档





项目依赖

接下来开始写代码例子,首先创建一个项目,依赖如下:

可以看到除了正常的ssm依赖之外,只多了一个mybatis-plus-boot-starter依赖。

注意:针对目前的版本,有一点值得注意,我们在使用MyBatis的时候,习惯使用的分页组件是pagehelper,但是在使用mybatis plus的时候,如果引入pagehelper依赖,会让mybatis plus的分页发生错误,所以,使用mybatis plus不要再引入pagehelper。



单表增删改查

MyBatis Plus多表的复杂的SQL操作同mybatis没有太大的区别,同样是麻烦的SQL语句和方法调用,但是单表简化了很多。上面的特性中提到,MyBatis Plus(以下简称mp)仅需少量的配置,即可实现单表的大部分crud操作。首先我们在配置文件中只配置简单的数据源,其它不做任何配置:

在启动类中,增加一个mapper扫描注解:

@MapperScan("mp.mapper")

mp.mapper为mapper的接口包路径。这个注解是MyBatis原生的。

简单的配置基本完成了,下面开始写业务代码,首先看实体类:

简单的用户信息,上面的注解是基于lombok,如果不习惯可以使用get/set。

再来看mapper:

mapper只需要继承BaseMapper即可,不需要写任何代码。再来看service类:

可以看到service单表操作只需要继承ServiceImpl即可,也不需要写任何代码,接下来看一下controller中对应的接口:

简单的单表增删改查就写好了,与原生的MyBatis相比,没有SQL语句,mapper接口和service类几乎是零代码,所以说mp是MyBatis的增强工具。通过上面可以看到,直接调用userService里面有很多实现好的方法,这些方法都在ServiceImpl中,下面简单看一下都有哪些:

可以看到,ServiceImpl里面包含了很多有用的单表crud方法(具体内容查看源码),这种做法类似于JPA,以前很多人抱怨说MyBatis在单表的时候也要写大量的SQL语句,现在有了mp,这些都不再是问题。

现在启动项目,简单运行一下上面四个接口,先看新增方法:

修改方法:

查询方法:

删除方法:

四个接口都没有问题。其它自带的方法可以自行学习测试。


分页查询

分页需要加入分页插件,在springboot的启动类中加入如下方法:

如果不加返回的分页数据的总页数和总记录数会有问题,接下来先看单表的简单的分页查询。

返回的数据如下:

这是service中调用的selectPage方法,返回Page对象,需要传入两个参数,第一个主要是当前页码和每页记录数,第二个Wrapper主要用来组合条件,也是实体包装器,用于处理 sql 拼接,排序,实体参数查询等!实体包装器 EntityWrapper 继承 Wrapper。简单的实例如下:

或者:

具体的使用方法如下:

不仅在分页查询中,在单表的列表查询selectList方法中,也可以传参数wrapper,这样我们对单表的操作基本上就不用写service代码和SQL语句了。其它详细内容可以参考官方文档



单表的分页十分好实现,虽然mp封装了单表的大部分操作,但是就像JPA一样,复杂的情况还是需要手写SQL,下面看一下自定义SQL的分页。首先配置SQL语句的xml文件的位置:

mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml

然后在对应的的目录下创建userMapper.xml文件,并写一个SQL:

可以看到SQL语句的定义和以前并没有什么区别。接下来在mapper接口中定义方法:

方法的定义几乎和以前一样,唯一的区别是参数列表的第一个参数增加了一个Pagination类型的page,这是翻页对象,可以作为 xml 参数直接使用,传递参数 Page 即自动分页。

然后看一下service的调用方式:

service调用mapper虽然和以前有区别,但也很简单。

最后是controller调动service,这里就没有什么特别的了:

最后重启项目,测试接口:

可以看到自定义SQL的分页也很容易实现,复杂的SQL同样如此。


执行效率插件

接下来介绍一个实用的执行效率插件,即性能分析拦截器,用于输出每条 SQL 语句及其执行时间。在springboot中只需要在启动类中加入如下方法:

这个时候,执行任何数据库操作都会在控制台打印SQL语句和执行的时间:

是一个非常实用的插件!

注意!该插件只用于开发环境,不建议生产环境使用。。。



官方还提供了很多很多的插件:

包括读写分离,idea快速开发等等都非常实用,有兴趣可以自行学习,此处不再一一列举。


代码地址: https://gitee.com/blueses/spring-boot-demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容