一、MyBatis-Plus的简单应用

1、简介
MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在。

官网文档地址:
  https://baomidou.com/pages/6b03c5/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95

2、使用 SpringBoot 快速使用 MyBatis-Plus

(1)准备工作
  需要 Java 开发环境(JDK)以及相应的开发工具(IDE)。
  需要 maven(用来下载相关依赖的 jar 包)。
  需要 SpringBoot。
  可以使用 IDEA 安装一个 mybatis-plus 插件。
  
(2)创建数据库mybatis_plus和数据表:Stu
数据库为mybatis_plus,id注意使用bigint

或者使用以下数据表:

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 '邮箱',
    PRIMARY KEY (id)
);


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

在这里插入图片描述

自己随便填一些数据即可。

(3)创建springboot项目:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

创建好springboot项目后,引入依赖:mysql驱动版本与自己本机mysql版本一样。

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
        </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

application或者yml配置:

在 application.yml 文件中配置 mysql 数据源信息。


server:
  port: 8080

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
    username: root
    password: root

或者properties:

# mysql 5 驱动不同 com.mysql.jdbc.Driver
# mysql 8 驱动不同com.mysql.cj.jdbc.Driver、需要增加时区的配置 serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
 
# 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

在这里插入图片描述

在这里插入图片描述
编写表对应的 实体类,创建实体类Stu:

package com.fan.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Repository  //让spring管理bean
public class Stu {
    private Long  id;
    private String name;
    private Integer age;
    private String addr;
    private Double score;

}

添加mapper接口:

编写操作实体类的 Mapper 类。
  直接继承 BaseMapper,这是 mybatis-plus 封装好的类。
注意:这里直接继承BaseMapper接口 ,可以省去繁琐的xml的编写。

package com.fan.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fan.demo.entity.Stu;

public interface StuMapper extends BaseMapper<Stu> {
}

在这里插入图片描述

编写启动类: 配置@MapperScan

Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

package com.fan.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.fan.demo.mapper")//mapper包所在的路径
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

编写测试类:

package com.fan.demo;

import com.fan.demo.entity.Stu;
import com.fan.demo.mapper.StuMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
class DemoApplicationTests {

    @Resource
    private StuMapper stuMapper;

    @Test
    void test01() {
        //测试查询所有
        List<Stu> stus = stuMapper.selectList(null);
        for(Stu stu:stus) {
            System.out.println(stu);
        }
    }

}

在这里插入图片描述

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。
注:
  若遇到 @Autowired 标记的变量出现 红色下划线,但是不影响 正常运行。

查看sql输出日志:

想要查看执行的 sql 语句,可以在 yml 文件中添加配置信息,如下。


server:
  port: 8080

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
    username: root
    password: root
#sql输出日志
mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

在这里插入图片描述

二、简单认识一下mybatis-plus常用注解

【1.@TableName 】

描述:表名注解,标识实体类对应的表
使用位置:实体类
@TableName 用于定义表名

@TableName("sys_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

【2.@TableId】
@TableId 用于定义表的主键
注:
常用属性:
value 用于定义主键字段名
type 用于定义主键类型(主键策略 IdType)

主键策略:
在这里插入图片描述
IdType.AUTO 主键自增,系统分配,不需要手动输入
IdType.NONE 未设置主键
IdType.INPUT 需要自己输入 主键值。
IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)。
IdType.ASSIGN_UUID 系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。

@TableName("sys_user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

【@TableField】

在这里插入图片描述

@TableField 用于定义表的非主键字段。

注:
常用属性:
value 用于定义非主键字段名
exist 用于指明是否为数据表的字段, true 表示是,false 为不是。
fill 用于指定字段填充策略(FieldFill)。

字段填充策略:(一般用于填充 创建时间、修改时间等字段)
    FieldFill.DEFAULT         默认不填充
    FieldFill.INSERT          插入时填充
    FieldFill.UPDATE          更新时填充
    FieldFill.INSERT_UPDATE   插入、更新时填充。

【@TableLogic】
Logic:逻辑的意思
@TableLogic 用于定义表的字段进行逻辑删除(非物理删除)
注:
常用属性:
value 用于定义未删除时字段的值
delval 用于定义删除时字段的值

【@Version】
@Version 用于字段实现乐观锁

【@Accessors(chain = true)】

这个注解是来至于lombok里面的 只需要在实体类加上就可以开启链式编程了



主键id的自动生成策略:

主键策略:
IdType.AUTO 主键自增,系统分配,不需要手动输入
IdType.NONE 未设置主键
IdType.INPUT 需要自己输入 主键值。
IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)。
IdType.ASSIGN_UUID 系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
主键策略可以在代码自动生成器中设置:gc.setIdType(IdType.ASSIGN_ID);//设置主键策略

自动填充数据功能

1)简介
  添加、修改数据时,每次都会使用相同的方式进行填充。比如 数据的创建时间、修改时间等。
  Mybatis-plus 支持自动填充这些字段的数据。

给之前的数据表新增两个字段:创建时间、修改时间。

第一步:使用 @TableField 注解,标注需要进行填充的字段updateTime/createTime
  
在实体类中修改如下:


/**
 * 创建时间
 */
@TableField(fill = FieldFill.INSERT)
private Date createTime;

/**
 * 最后修改时间
 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

第二步:编写自动填充的处理器类
  自定义一个类(handler包下),实现 MetaObjectHandler 接口,并重写方法。
  添加 @Component 注解,交给 Spring 去管理。

package com.fan.handler;
 
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
 
import java.util.Date;
 
@Slf4j
@Component // 一定不要忘记把处理器加到IOC容器中!
public class MyMetaObjectHandler implements MetaObjectHandler {
    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill.....");
        // setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
 
    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill.....");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

第三步:简单测试一下:

 @Resource
    StuService stuService;
    @Test
    public void testAutoFill() {
        Stu stu = new Stu();
        stu.setName("tom333");
        stu.setAge(20);
        stu.setScore(90.0);
        if (stuService.save(stu)) {
            stuService.list().forEach(System.out::println);
        } else {
            System.out.println("添加数据失败");
        }
    }

效果:
在这里插入图片描述

乐观锁配置

在这里插入图片描述
乐观锁配置需要两步

#1.配置插件

package com.fan.mybatis_plus1.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.fan.mybatis_plus1.mapper")
public class MyConfig {

    /**
     * 新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

2.在实体类的字段上加上@Version注解
@Version
private Integer version;

测试:

 @Test
    public void testVerson() {
        Stu stu = stuService.getById(1L);
        stu.setAge(898);
        boolean update = stuService.updateById(stu);

    }

在这里插入图片描述

在这里插入图片描述

逻辑删除配置

在这里插入图片描述

1)简介
  删除数据,可以通过物理删除,也可以通过逻辑删除。
  物理删除指的是直接将数据从数据库中删除,不保留。
  逻辑删除指的是修改数据的某个字段,使其表示为已删除状态,而非删除数据,保留该数据在数据库中,但是查询时不显示该数据(查询时过滤掉该数据)。

给数据表增加一个字段:deleted,用于表示该数据是否被逻辑删除。

逻辑删除(0 未删除、1 删除)

例: 1.application.yml

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

2: 实体类字段上加上@TableLogic注解
@TableLogic
private Integer deleted;

测试逻辑删除:先将deleted修改成0

在这里插入图片描述

在这里插入图片描述

成功:
在这里插入图片描述

三、MyBatis-Plus代码生成器:

(1)AutoGenerator 简介
  AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
  与 mybatis 中的 mybatis-generator-core 类似。

(2)添加依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1.tmp</version>
</dependency>
<!-- 添加 模板引擎 依赖 -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.2</version>
</dependency>

完整的表数据:
在这里插入图片描述

工具类:自动代码生成器:

package com.fan.utils;
 
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Scanner;
 
public class CodeGenerator {
 
 
    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");//设置代码生成路径:用户路径+/src/main/java
        gc.setFileOverride(true);//是否覆盖以前文件
        gc.setOpen(false);//是否打开生成目录
        gc.setAuthor("fan");//设置项目作者名称
        gc.setIdType(IdType.AUTO);//设置主键策略
        gc.setBaseResultMap(true);//生成基本ResultMap
        gc.setBaseColumnList(true);//生成基本ColumnList
        gc.setServiceName("%sService");//去掉服务默认前缀
        gc.setDateType(DateType.ONLY_DATE);//设置时间类型
        mpg.setGlobalConfig(gc);
 
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);
 
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.fan");
        pc.setMapper("mapper");
        pc.setXml("mapper.xml");
        pc.setEntity("pojo");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setController("controller");
        mpg.setPackageInfo(pc);
 
        // 策略配置
        StrategyConfig sc = new StrategyConfig();
        sc.setNaming(NamingStrategy.underline_to_camel);
        sc.setColumnNaming(NamingStrategy.underline_to_camel);
        sc.setEntityLombokModel(true);//自动lombok
        sc.setRestControllerStyle(true);
        sc.setControllerMappingHyphenStyle(true);
 
        sc.setLogicDeleteFieldName("deleted");//设置逻辑删除
 
        //设置自动填充配置
        TableFill gmt_create = new TableFill("create_time", FieldFill.INSERT);
        TableFill gmt_modified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills=new ArrayList<>();
        tableFills.add(gmt_create);
        tableFills.add(gmt_modified);
        sc.setTableFillList(tableFills);
 
        //乐观锁
        sc.setVersionFieldName("version");
        sc.setRestControllerStyle(true);//驼峰命名
 
 
 
      //  sc.setTablePrefix("tbl_"); 设置表名前缀
        sc.setInclude(scanner("表名,多个英文逗号分割").split(","));
        mpg.setStrategy(sc);
 
        // 生成代码
        mpg.execute();
    }
 
}

执行代码生成器后的效果:
在这里插入图片描述

四、MyBatis-Plus查询功能:

多个id的批量查询:

在这里插入图片描述

server的查询方法list:

// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

mapper的查询:

// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

//测试查询

   @Test
   public void testFindBach() {
       List<Stu> stus = stuService.listByIds(Arrays.asList(1, 2, 3));
       System.out.println(stus);
   }

@Test
   public void testFind2() {
       HashMap<String, Object> map = new HashMap<>();
       map.put("id",1L);
       map.put("score",90.0);
       List<Stu> stus = stuService.listByMap(map);
       System.out.println(stus);
   }

在这里插入图片描述

简单条件查询:

在这里插入图片描述

在这里插入图片描述

分页查询:

Step1:
  配置分页插件。
  编写一个 配置类,内部使用 @Bean 注解将 PaginationInterceptor 交给 Spring 容器管理。
分页插件:配置在config包下:

  /**
     * 分页插件
     * @return 分页插件的实例
     */
    @Bean
    public PaginationInnerInterceptor paginationInterceptor() {
        return new PaginationInnerInterceptor();
    }

Step2:
  编写分页代码。
  直接 new 一个 Page 对象,对象需要传递两个参数(当前页,每页显示的条数)。
  调用 mybatis-plus 提供的分页查询方法,其会将 分页查询的数据封装到 Page 对象中。

@Test
    public void testPage() {
        // Step1:创建一个 Page 对象
        Page<Stu> page = new Page<>(1, 3);
        // Step2:调用 mybatis-plus 提供的分页查询方法
        stuService.page(page, null);
        // Step3:获取分页数据
        System.out.println(page.getCurrent()); // 获取当前页
        System.out.println(page.getTotal()); // 获取总记录数
        System.out.println(page.getSize()); // 获取每页的条数
        System.out.println(page.getRecords()); // 获取每页数据的集合
        System.out.println(page.getPages()); // 获取总页数
        System.out.println(page.hasNext()); // 是否存在下一页
        System.out.println(page.hasPrevious()); // 是否存在上一页
    }

在这里插入图片描述

在这里插入图片描述

五、条件构造器:QueryWrapper

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参考::

https://www.cnblogs.com/l-y-h/p/12859477.html#_label2

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习