mybatis-plus与Spring boot的使用

  • 前言
  • 一、什么是mybatis-plus?
  • 二、mybatis-plus的特性
  • 三 mybatis-plus基本配置
  • 三 mybatis-plus的使用案例
  • 1.增加 insert
  • 2.普通删除
  • 3.逻辑删除
  • 2.读入数据
  • 4.修改 update
  • 4.查询 select
  • 三 mybatis-plus的快速生成
  • 1.新增依赖
  • 2.快速生成代码类
  • 总结



前言

随着现在数据持久层框架的兴起,mybatis-plus作为现在新秀的一员,我们有必要学习掌握它


一、什么是mybatis-plus?

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

就像双人小游戏互相搭配通关一样。

二、mybatis-plus的特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 【JDK1.8 的新特性】
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

三 mybatis-plus基本配置

1.导入依赖

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

2.配置连接参数等

#配置数据库连接
spring.datasource.druid.url=jdbc:mysql:///test1?serverTimezone=Asia/Shanghai
#mysql8以下的驱动,8以上需要使用com.mysql.cj.jdbc.Driver
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=123456

3.在数据库内创建表,这里没加主键自增,自己添加

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	version BIGINT(20) NOT NULL COMMENT '乐观锁',
	PRIMARY KEY (id)
);
DELETE FROM user;

INSERT INTO user (id, name, age, email,version) VALUES
(1, 'Jone', 18, 'test1@baomidou.com',0),
(2, 'Jack', 20, 'test2@baomidou.com',0),
(3, 'Tom', 28, 'test3@baomidou.com',0),
(4, 'Sandy', 21, 'test4@baomidou.com',0),
(5, 'Billie', 24, 'test5@baomidou.com',0);

4.创建模型层(entity),数据访问层(dao/mapper),dao层必须继承BaseMapper接口

mybatisplusspringboot 版本对应 mybatisplus和springboot_自定义


5. 在主启动类上添加dao接口的扫描

mybatisplusspringboot 版本对应 mybatisplus和springboot_mybatis_02

三 mybatis-plus的使用案例

1.增加 insert

mybatisplusspringboot 版本对应 mybatisplus和springboot_mybatis_03

mybatisplusspringboot 版本对应 mybatisplus和springboot_mysql_04

2.普通删除

@Test
    public void deleteUser(){
        //两种删除方式,第一种通过id删除
        userMapper.deleteById(1388054562404802562L);//这是我刚才生成的id
    }

3.逻辑删除

3.1 需要在表上新加字段

mybatisplusspringboot 版本对应 mybatisplus和springboot_java_05

3.2 实体类新加字段设置

@ApiModelProperty(value = "是否删除,0没删除,1删除")
    @TableLogic
    private Integer isdelete;

3.3 设置逻辑删除的配置

#逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
#逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

2.读入数据

3.4 测试

mybatisplusspringboot 版本对应 mybatisplus和springboot_spring boot_06

mybatisplusspringboot 版本对应 mybatisplus和springboot_mysql_07

4.修改 update

4.1 普通修改

@Test
    public void update(){
        //默认使用了动态sql。 增加列 gmt_update  gmt_create
        User user=new User();
        user.setId(4L);
        user.setName("张三"); //如果数据库没有设置默认值。
        userDao.updateById(user);
    }

mybatisplusspringboot 版本对应 mybatisplus和springboot_自定义_08


4.2 加了version乐观锁的修改

在实体类User 字段version上加上注释@Version

新增乐观锁配置类

package com.hy.test.configure;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Configuration
public class MybatisPlusPageConfig {
    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //乐观锁配置
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

再次执行前面的修改代码,发现version字段加一了

mybatisplusspringboot 版本对应 mybatisplus和springboot_mybatis_09

4.查询 select

4.1 普通查询

@Test
    public void select(){
        //模拟传来的数据封装对象
        User user=new User();
        user.setName("张三");
        
        //根据条件查询多条记录Wrapper----子类有QueryWrapper
        QueryWrapper wrapper=new QueryWrapper();
        //只查询name和email字段
        wrapper.select("name","email");
        //如果名字不为空,就查询姓名包含张的人
        if(StringUtils.isNotEmpty(user.getName())){
            wrapper.like("name","张");
        }
        //如果年龄不为空,就查询年龄在10-25岁的人
        if(user.getAge()!=null){
            wrapper.between("age",10,25);
        }
        List list = userMapper.selectList(wrapper);
        System.out.println(list);
    }

mybatisplusspringboot 版本对应 mybatisplus和springboot_spring boot_10

4.2 分页查询

在前面乐观锁的配置类增加分页配置

interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

4.3 测试

代码
@Test
    public void selectByPage(){
        Page<User> page=new Page<>(1,5);
        page=userDao.selectPage(page,null);
        System.out.println("当前的页码:"+page.getCurrent());
        System.out.println("得到总页码:"+page.getPages());
        System.out.println("总条数:"+page.getTotal());
        System.out.println("当前页码的记录:"+page.getRecords());
    }

mybatisplusspringboot 版本对应 mybatisplus和springboot_自定义_11

三 mybatis-plus的快速生成

1.新增依赖

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

代码如下(示例):

2.快速生成代码类

package com.hy.test;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        //设置作者名
        gc.setAuthor("");
        gc.setOpen(false);
        //设置业务层类名
        gc.setServiceName("%sService");
        //设置实体层类名
        gc.setMapperName("%sDao");
        // 是否开启Swagger2 注解
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/vue_springboot?useUnicode=true&useSSL=false&characterEncoding=utf8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //设置模块名
        pc.setModuleName(scanner("test"));
        pc.setParent("com.hy").setMapper("dao");
        mpg.setPackageInfo(pc);


        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 freemarker
        // String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        /*
        cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判断自定义文件夹是否需要创建
                checkDir("调用默认方法创建的目录,自定义目录用");
                if (fileType == FileType.MAPPER) {
                    // 已经生成 mapper 文件判断存在,不想重新生成返回 false
                    return !new File(filePath).exists();
                }
                // 允许生成模板文件
                return true;
            }
        });
        */
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        // templateConfig.setEntity("templates/entity2.java");
        // templateConfig.setService();
        // templateConfig.setController();

        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //  strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        // 公共父类
        // strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
        // 写于父类中的公共字段
        /*strategy.setSuperEntityColumns("id");
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
        strategy.setControllerMappingHyphenStyle(true);*/

        // 设置数据表的名字前缀(忽略前缀)
        //strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        //mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }

}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了mybatis-plus的使用,想要更深入的了解学习mybatis-plus