1. 前言

上一文中我根据MybatisMapper的生命周期手动实现了一个简单的通用Mapper功能,但是遗憾的是它缺乏实际生产的检验。因此我选择更加成熟的一个Mybatis开发增强包。它就是已经获得Gitee获得 6900 starMybatis Plus

Gitee: https://gitee.com/felord/kono day04 分支

GitHub: https://github.com/NotFound403/kono day04 分支

2. Mybatis Plus的优势

我认为如果你需要在你的框架中引用第三方包,需要考量的最大因素不是它功能的强大而是它社区的活跃度。文档是否齐全,是否拥有完善的Q/A,版本维护周期是否持续。目前来看Mybatis Plus经过数年的打磨算是比较成熟的类库。目前我认为它几个突出的优点:

  • 单表的通用Mapper功能,这个算一个基本的需求。
  • 在单表查询的基础之上增加了语义化查询,可通过UpdateWrapperQueryWrapper等条件构造器丰富单表个性化操作。
  • 多种主键策略的支持,常见的UUID、雪花算法等。
  • 基础的代码生成器,减少样板代码编写、提高效率的利器。
  • 其它还有一些多租户、乐观锁等功能。

3. 集成依赖

以mybatis-plus-boot-starter 3.3.2 版本为例。

我们只需要将kono项目day02分支pom.xml中的mybatis-spring-boot-starter依赖替换为即可:

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

如果你还需要代码生成器功能请引入下面的模块:

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<!-- 引入freemarker包作为代码生成器引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<scope>compile</scope>
<optional>true</optional>
</dependency>

关于代码生成器可参阅Mybatis Plus代码生成器Java代码生成器的原理这两篇文章,本文不再对代码生成器进行详细解释。

4. 配置

Mybatis Plus重写了starter,所以配置上有了变化。使用原生MybatisStarter配置为:

mybatis:
configuration:
# 下划线转驼峰
map-underscore-to-camel-case: true
# 扫描 xml 文件位置
mapper-locations: classpath:mapper/*Mapper.xml

对应的Mybatis Plus配置为:

mybatis-plus:
configuration:
# 下划线转驼峰
map-underscore-to-camel-case: true
# 扫描 xml 文件位置
mapper-locations: classpath:mapper/*Mapper.xml

我们还可以增加一些Mybatis Plus所集成的特性,诸如新增修改查询填充策略、逻辑删除、主键填充等等个性化能力。这里以最常用的主键填充策略为例,如果我们使用分布式主键策略雪花算法的话,可以增加如下配置:

mybatis-plus:
global-config:
db-config:
id-type: assign_id

分页也是我们非常常用的功能,最后我们加入Mybatis Plus分页功能,整体的配置如下:

/**
* mybatis configuration.
*
* @author felord.cn
*/
@MapperScan("cn.felord.kono.mapper")
@Configuration
public class MybatisConfiguration {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}

请注意这里的分页只支持一对一分页,一对多分页还不支持。原因请阅读一对多分页SQL应该怎么写

5. 使用

Mybatis Plus使用了一种叫Active Record的领域模型范式,特点是一个模型类(Model)对应关系型数据库中的一个表(table),而模型类的一个实例对应表中的一行记录。因此我们的POJO对象这么编写,以UserInfo为例:

/**
* @author felord.cn
* @since 15:43
**/
@EqualsAndHashCode(callSuper = false)
@Data
public class UserInfo extends Model<UserInfo> { private static final long serialVersionUID = -8938650956516110149L;
@TableId
private Long userId;
private String name;
private Integer age; @Override
protected Serializable pkVal() {
return this.userId;
}
}

不适用lombok的情况下请对POJO增加Getter/Setter方法。

对应的Mapper接口只需要继承BaseMapper就可以了:

public interface UserInfoMapper extends BaseMapper<UserInfo> {}

这时就已经具有了通用Mapper提供的一些接口能力了,当然你可以使用传统的模式去实现自定义的操作方法。

服务层的接口范式是这样的,需要继承IService接口:

public interface UserInfoService extends IService<UserInfo> {}

实现类UserInfoServiceImpl同时继承了ServiceImpl:

@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
}

接下来就是使用了,首先我们来用通用Mapper进行查询:

final String userId ="12334343455457";

UserInfo byId = userInfoService.getById(userId);

我们也可以使用更加灵活的方式来实现上面的查询:

final String userId ="12334343455457";
UserInfo one = userInfoService.getOne(new QueryWrapper<UserInfo>().lambda()
.eq(UserInfo::getUserId, userId));

你可以根据你的业务灵活地增加更多的条件或者指定查询字段进行单表查询,而无需编写SQL,其它新增、更新、删除同理。对于上面的范式,Mybatis Plus提供了代码生成器来实现,详情请参阅我在Mybatis Plus代码生成器一文中的讲解。

6. 总结

到这里基本的Mybatis Plus整合就完成了,更多特性可去官方文档去了解使用。多多关注:码农小胖哥 继续来和我一起整合脚手架。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

从零搭建Spring Boot脚手架(5):整合 Mybatis Plus的更多相关文章

  1. 从零搭建Spring Boot脚手架(7):整合OSS作为文件服务器

    1. 前言 文件服务器是一个应用必要的组件之一.最早我搞过FTP,然后又用过FastDFS,接私活的时候我用MongoDB也凑合凑合.现如今时代不同了,开始流行起了OSS. Gitee: https: ...

  2. 从零搭建Spring Boot脚手架(1):开篇以及技术选型

    1. 前言 目前Spring Boot已经成为主流的Java Web开发框架,熟练掌握Spring Boot并能够根据业务来定制Spring Boot成为一个Java开发者的必备技巧,但是总是零零碎碎 ...

  3. 从零搭建Spring Boot脚手架(2):增加通用的功能

    1. 前言 今天开始搭建我们的kono Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节.如果你看了本文有什么问 ...

  4. 从零搭建Spring Boot脚手架(3):集成mybatis

    1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文集成了一些基础的功能,比如统一返回体.统一异常处理.快速类型转换.参数校验等常用必备功能,并编写了一些单元测试进行验证,今天 ...

  5. 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper

    1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...

  6. 从零搭建Spring Boot脚手架(7):Elasticsearch应该独立服务

    1. Spring Data Elasticsearch Spring Data Elasticsearch是Spring Data项目的子项目,提供了Elasticsearch与Spring的集成. ...

  7. 从零搭建Spring Boot脚手架(6):整合Redis作为缓存

    1. 前言 上一文我们整合了Mybatis Plus,今天我们会把缓存也集成进来.缓存是一个系统应用必备的一种功能,除了在减轻数据库的压力之外.还在存储一些短时效的数据场景中发挥着重大作用,比如存储用 ...

  8. SpringBoot 源码解析 (九)----- Spring Boot的核心能力 - 整合Mybatis

    本篇我们在SpringBoot中整合Mybatis这个orm框架,毕竟分析一下其自动配置的源码,我们先来回顾一下以前Spring中是如何整合Mybatis的,大家可以看看我这篇文章Mybaits 源码 ...

  9. spring boot 1.4 整合 mybatis druid

    http://www.jianshu.com/p/cef49ad91ba9spring boot 1.4 整合 mybatis druid

随机推荐

  1. 网课神器之obs-studio的安装使用

    obs-studio 首先,下载obs-studio安装文件,然后点击安装. 建议安装完后直接跳过配置,然后进入文件-设置-通用-系统托盘-勾选"总是最小化到系统托盘,而不是任务栏" ...

  2. smartJQueryZoom(smartZoom) 存在的兼容性BUG,以及解决方法

    smartJQueryZoom 是一个很好用的库. 它基于jQuery,可以对某个元素(比如 img)进行渲染,渲染之后可以放大这个区域,在做图片浏览时很好用. 但它有一个兼容性BUG: 当浏览器不是 ...

  3. [转载]Python ImportError: No module named 'requests'解决方法

    windows解决办法1.找到easy_install.exe.一般在python的安装路径下的Scripts文件夹中,如C:\Python34\Scripts\easy_install.exe2.从 ...

  4. C++语法小记---继承中的构造和析构顺序

    继承中构造和析构的顺序 先父母,后客人,最后自己 静态变量和全局变量在最开始 析构和构造的顺序完全相反 #include <iostream> #include <string> ...

  5. Apache Tomcat目录结构与版本升级

    升级原因: 由于当前操作系统内的tomcat版本过低,存在大量高中危漏洞,存在一定的安全隐患.如下图所示,使用绿盟扫描器进行扫描爆出大量漏洞. 升级思路: 既然决定要升级,那么我觉得首先要做的就是自己 ...

  6. 不是吧,阿sir,2020年程序员要不好过?

    自从网传程序员到了35岁之后必须要转行,现在又有人传言:“疫情之下,程序员今年要过苦日子了,降薪裁员是大趋势.” 不是,我就不明白了,你们怎么就看不得程序员好呢?天天巴望着程序员降薪.转行.裁员…   ...

  7. Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载|百度云盘

    百度云盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载 提取码:8nki 目录  · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 1 ...

  8. java并发包提供的三种常用并发队列实现

    java并发包中提供了三个常用的并发队列实现,分别是:ConcurrentLinkedQueue.LinkedBlockingQueue和ArrayBlockingQueue. ConcurrentL ...

  9. JPA第一天

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springdata"获取视频和教程资料! b站在线视 ...

  10. Vue数据产生变化需要页面渲染完之后执行某操作

    1.数据产生变化或者页面需要vue数据渲染完之后加载的东西 Vue.nextTick(function () { alert(123); }); 2 调用vue方法 --------------Vue ...