【SSM基础】Mybatis Plus 使用

【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 的部分功能,其他还有一些很好用的功能,例如多数据源,分布式主键等,后续博客也会使用,欢迎继续观看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值