【SSM基础】Mybatis Plus 使用
其他文章: bookcase微服务实战
1、前言
我们使用Mybatis 的好处是编写灵活的SQL语句,方便动态生成SQL语句。 但是我们每进行一次新需求进行数据库交互就必须写一条SQL,哪怕是再简单的SQL都必须写Xml文件,进行映射。 有没有一种方案使我们少写SQL,又像Spring
Data Jpa 那么便捷。
我感觉MyBaits Plus 就可以满足我们的需求。对我而言MyBatis Plus 就省略了我编写简单SQL的麻烦。 而且在其他方面我也可以使用Mybatis Plus 满足我的业务需求,例如多数据源,例如分布式主键,代码自动生成等等。
官方地址: https://baomidou.com/
2、使用
这里我们从零开始领略Mybatis Plus 的方便之处。
2.1、Generator
首先创建SpringBoot子模块bk1,Maven工程子模块generator。
在generator中创建 Class MybatisPlusGenerate,并编写自动化脚本。
官方示例地址: https://baomidou.com/pages/779a6e/#%E5%AE%89%E8%A3%85
说明下具体内容:
1、创建数据库链接 -> create
2、全局配置 -> globalConfig
3、包配置 -> packageConfig
4、模板配置 -> templateConfig
5、注入配置 -> injectionConfig
6、策略配置 -> templateEngine
7、模板引擎选择 -> templateEngine
配置内容: https://baomidou.com/pages/981406/#%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE
配置的内容比较多,其他还有一些细节内容可以参考官网详细说明。一般常用的按照我上面的配置即可,一些参数按照自己的数据修改。
这里大部分是按照官方示例编写,自定义部分不生成service,serviceImpl,controller。 xml 文件生成 BaseResultMap 和BaseColumnList。
这里有个点我着重提下,之前的版本是不支持这种lambda式写法的,这种生成代码这里使用的是最新的版本。当我直接使用的时候,发现BaseResultMap 和 BaseColumnList没有,最后在生成策略中找到了,我都快要到github上提issue了。 旧版本是在globalConfig 内的,之前使用了版本V3.4.0,最新使用V3.5.2。
public class MybatisPlusGenerate {
public static final String MAPPER_URL = "D:\\workspace\\test_bk\\bk1\\src\\main\\resources\\mapper";
public static final String CLASS_URL = "D:\\workspace\\test_bk\\bk1\\src\\main\\java";
public static final String PACKAGE = "com.fans.bk1";
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/bookcase?useUnicode=true&characterEncoding=UTF-8" +
"&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai";
FastAutoGenerator
.create(url, USERNAME, PASSWORD)
.globalConfig(builder -> builder.author("fans").outputDir(CLASS_URL))
.packageConfig(builder -> {
builder.parent(PACKAGE).pathInfo(Collections.singletonMap(OutputFile.xml, MAPPER_URL)); // 设置mapperXml生成路径
})
.templateConfig(builder -> builder.disable(TemplateType.CONTROLLER, TemplateType.SERVICE, TemplateType.SERVICEIMPL))
.injectionConfig(builder -> builder.fileOverride().build())
.strategyConfig(builder -> {
builder.addInclude("book")
.addTablePrefix("t_", "c_")
.mapperBuilder().enableBaseResultMap().enableBaseColumnList()
.entityBuilder().enableTableFieldAnnotation().enableLombok();
})
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
2.2、MybatisX 插件使用
说到Mybatis 就必须提下Spring Data JPA,我感觉JPA的写法可以按照条件自动生成方法是比Mybatis 方便的一点。 而在Mybatis Plus 这里也提供了MybatisX 提供了类似的方法,会自动生SQL语句。
官方示例: https://baomidou.com/pages/ba5b24/
MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。
这里会使用BaseResultMap,这也是我为什么使用 Generator 生成 BaseResultMap 的原因。
具体示例按照官方即可,我这里在bk1,生成方法selectAllByBookName:
List<Book> selectAllByBookName(@Param("bookName") String bookName);
<select id="selectAllByBookName" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from book
where
book_name = #{bookName,jdbcType=VARCHAR}
</select>
2.3、MyBatis Plus 使用
这里只举例平时CRUD ing 时最常用的部分功能,后续博客会陆续使用其他的功能。
添加maven依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
添加注解:
在SpringBootApplication 上添加@MapperScan即可,例如@MapperScan(“com.fans.*.mapper”)。
MybatisPlus 添加了mapper接口默认映射,这里就不需要再次添加。
功能介绍:
- BaseMapper
我们常用的CRUD,例如按照主键查询,可以直接在serivice 中直接使用。 因为自动生成BookMapper的使用会继承BaseMapper。
BookMapper extends BaseMapper<Book>
- BaseService
假如自动生成serviceImpl 和 service,那么ServiceImpl 也会继承基础service。
BookServiceImpl extends ServiceImpl<BookMapper, Book> implements IBookService
我感觉业务最好编写在service中,所以没有使用后service的CRUD功能。当然这是我的个人习惯,假如你想用也是可以的。 相关的用法可以参考官方文档。
- 条件构造器
条件构造器分为两种方式,正常写法和Lambda写法。都是对AbstractWrapper的具体实现。
假如我们想在service中使用上述Mapper中的selectAllByBookName方法,那么我们就可以这样写:
Wrapper<Book> queryWrapper = new LambdaQueryWrapper<Book>()
.eq(Book::getBookName, bookName);
List<Book> books = bookMapper.selectList(queryWrapper);
这里的LambdaQueryWrapper<> 中的泛型不能省略。 eq代表相等,类似的还有:
ne 不等于
gt ge 大于,大于等于
lt le 小于,小于等于
...
分别对应SQL语句中的各种条件,这里比较多,就不一一列举,使用的时候基本可以见名知意。
- 分页
之前使用PageHelper的时候分页很方便,这里都使用Mybatis Plus 就可以使用自带的分页。
假如我们使用上面的BookMapper中的selectAllByBookName直接添加IPage参数即可,返回也修改成IPage。 修改前后如下:
List<Book> selectAllByBookName(@Param("bookName") String bookName);
IPage<Book> selectAllByBookName(IPage<Book> page,@Param("bookName") String bookName);
也可以在service 中使用使用selectPage 方法,同样是传入IPage 参数即可。
Wrapper<Book> queryWrapper = new LambdaQueryWrapper<Book>()
.eq(Book::getBookName, bookName);
IPage<Book> page = new Page<>();
page.setPages(1);
page.setSize(10);
IPage<Book> bookIPage = bookMapper.selectPage(page, queryWrapper);
具体就可以直接使用IPage的相关分页数据了,例如total,size,current,record等。
current就是当前页,record即为当前页数据内容。
3、总结
总结来讲就是Mybatis Plus使用起来太方便了,就和我们为什么不用eclipse而使用idea的原因相同。
为效率而生,让你更快更强。
这里使用了Mybatis Plus 的部分功能,其他还有一些很好用的功能,例如多数据源,分布式主键等,后续博客也会使用,欢迎继续观看。