目录

  • 一、简介
  • 二、快速入门
    • 1. 创建数据库及数据表
    • 2. 新建项目,导入依赖
    • 3. 编写数据库配置文件&连接
    • 4. 创建pojo实体类
    • 5. 编写mapper&扫描
    • 6. 测试类简单测试
    • 7. 小结
  • 三、配置日志
  • 四、CRUD及其拓展
    • 1. 插入insert & 主键生成策略
      • 1. 测试插入
      • 2. 主键生成策略
        • 更改策略:主键自增AUTO
        • 更改策略:手动输入INPUT
    • 2. 更新update & 自动填充功能
      • 1. 测试更新
      • 2. 自动填充
        • 方式一:数据库级别
        • 方式二:代码级别
    • 3. 查询select & 分页查询插件
      • 1. 测试查询
      • 2. 分页查询
    • 4. 删除delete & 逻辑删除
      • 1. 测试删除
      • 2. 逻辑删除
  • 五、乐观锁插件
    • 1. 实现方式
    • 2. 测试乐观锁插件
      • 1、添加version字段
      • 2、同步实体类
      • 3、注册乐观锁组件
      • 4、测试
  • 六、性能分析插件
    • 1. 导入插件
    • 2. 配置开发环境
    • 3. 配置插件
    • 4. 测试
  • 七、条件构造器
    • 1. 条件查询
    • 2. 子查询
    • 3. 分组查询
    • 4. 排序查询
  • 八、代码自动生成器

一、简介

官网:https://mybatis.plus/

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

本文MyBatis-Plus版本基于3.0.5,最新的新版本会有些许改变

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

二、快速入门

1. 创建数据库及数据表

首先创建一个数据库mybatis_plus,再新建一个user

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');
-- 真实开发中,version(乐观锁)、deleted(逻辑删除)、gmt_create、gmt_modified

最后得到user


2. 新建项目,导入依赖

首先新建一个springboot项目,勾选组件时勾选Spring Web,然后导入以下依赖

本文的mybatis-plus版本基于3.0.5

<!--数据库驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version>
</dependency>
<!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version>
</dependency>
<!--mybatis-plus-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version>
</dependency>

加粗样式说明:尽量不要同时导入 mybatis 和 mybatisplus,会存在依赖问题和版本的差异!


3. 编写数据库配置文件&连接

在springboot配置文件application.properties中配置数据库连接

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

注意:mysql 5mysql 8版本的驱动不同,8版本需要增加时区设置

然后连接数据库,打开我们创建的mybatis_plus数据库


4. 创建pojo实体类

在主程序同级目录下新建pojo包,其中创建User表对应的实体类

package com.zsr.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private int age;private String email;
}

5. 编写mapper&扫描

在主程序同级目录下新建mapper包,其中新建mapper接口UserMapper,继承BaseMapper接口

  • 到此,所有的crud方法即编写完成,来源于父接口;不再需要像以前一样编写很多配置

  • 注意使用@Repository注解声明为mapper(dao)层的bean,或者使用@Mapper注解标注

    @Mapper@Repository的区别:https://www.cnblogs.com/yanghj/archive/2019/09/24/11580830.html

    @Mapper注解爆红问题:https://www.cnblogs.com/del88/p/12516969.html、

    这里建议两个注解一起使用

package com.zsr.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zsr.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {}

然后为了使我们的mapper生效,我们需要到主程序增加一个注解进行相应的扫描并识别

(其实使用了@Repository可以忽略这一步,为了规范,尽量写上)

//扫描mapper目录
@MapperScan("com.zsr.mapper")


6. 测试类简单测试

我们在springboot提供的测试类进行查询全部用户测试

  • 首先需要注入UserMapper对象,然后便可调用MyBatis已经封装好的的crud方法
package com.zsr;import com.zsr.mapper.UserMapper;
import com.zsr.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class MybatisPlusApplicationTests {@Autowiredprivate UserMapper userMapper;//查询全部用户@Testvoid QueryAllUsers() {//参数是一个wrapper条件构造器,这里先不用,写nullList<User> userList = userMapper.selectList(null);userList.forEach(System.out::println);}
}

测试运行,成功查到所有的信息


7. 小结

通过上述简单的几步,就可以实现 User 表的 CRUD 功能,以往的 XML 文件不再需要

  • 集成MyBatis-Plus非常的简单,只需要引入对应的依赖,并配置 mapper 扫描路径即可
  • MyBatis-Plus 的强大远不止如此,我们继续深入学习学习

三、配置日志

虽然我们已经实现了基本的CRUD功能,但是相应的sql语句是不可见的,为了看每条sql是怎么执行的,我们必须查看日志;

MyBatis Plus本身集成了log日志功能,我们打开即可

接下来在application.properties中启动MyBatis plus本身日志;我们也可以使用第三方的日志,但是需要导入相应的依赖

#配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

我们再次运行上述的查询全部用户方法,即可查看到所执行sql的相关日志信息


四、CRUD及其拓展

1. 插入insert & 主键生成策略

1. 测试插入

首先在测试类添加一个方法InsertUser测试插入用户的功能,这里省略主键id的赋值

//插入用户
@Test
public void InsertUser() {val user = new User();user.setName("zsr");user.setAge(20);user.setEmail("1241@qq.com");userMapper.insert(user);
}

测试一下,查看日志信息,成功插入数据,且可以看到为我们自动生成了一个ID

刷新我们的数据表查看,可以看到新插入的数据

我们并没有设置主键id的值,但是MyBatis Plus自动为我们生成了一个id,这个id是如何生成的?


2. 主键生成策略

系统唯一ID(主键)是我们在设计一个系统的时候常常会遇见的问题,生成ID的方法有很多,适应不同的场景、需求以及性能要求;有些比较复杂的系统甚至会有多个ID生成的策略

分布式系统唯一ID生成方案汇总:https://www.cnblogs.com/haoxinyue/p/5208136.html

MyBatis Plus中,生成主键id的方法是 雪花算法,我们也可以通过@TableId注解设置修改使用其他的生成策略,我们看看该注解的源码


可以看到有一个参数type,我们就是通过设置该参数的值IdType来指定ID的生成策略,查看参数值IdType的源码

可以发现这是一个枚举类,其中有五种方式,默认生成ID的方式是ID_WORKER,底层也就是通过雪花算法实现的

  • AUTO:数据库ID自增
  • NONE:未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
  • INPUT:插入前自己设置主键的值
  • ID_WORKER:分布式全局唯一ID(长整型类型)
  • UUID:32位UUID字符串
  • ID_WORKER_STR:分布式全局唯一ID(字符串类型)

接下来我们通过@TableID注解指定其他策略试试

更改策略:主键自增AUTO

我们在我们实体类的主键上可以指定所需的方式,这里配置为主键自增方式

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private int age;private String email;
}

同时要在数据库中设置主键id自增,然后保存。否则会报错

再次测试一下上述插入方法,成功插入,且新插入user的id实现了自增

我们可以多测试几次,可以发现每次id都+1,成功实现了主键自增功能


更改策略:手动输入INPUT

将主键id上的注解更改为

@TableId(type = IdType.INPUT)

再次测试一下插入

这里之所以id自增的方式插入了一个用户,是因为我们的数据表设置了主键自增

查看日志信息,发现id为null,因此我们需要手动设置id

//插入用户
@Test
public void InsertUser() {val user = new User();user.setName("zsr");user.setAge(20);user.setEmail("1241@qq.com");user.setId(6L);userMapper.insert(user);
}

再次测试,成功插入指定id用户


2. 更新update & 自动填充功能

1. 测试更新

在测试类中新建一个方法,注意updateById()方法传入的参数为User对象

更新id为6的用户信息

//更新用户
@Test
public void updateUser() {User user = new User();user.setId(6L);user.setName("gcc");user.setAge(18);userMapper.updateById(user);//传入的参数是一个对象
}

运行该测试方法,成功更新指定用户的信息

总结:在MyBatisPlus中,所有的sql都是自动动态配置的(动态sql)

2. 自动填充

数据库写入一些东西时,比如创建时间、修改时间!更新这些字段时,一般都是自动化完成的,不希望自己手动更新

在阿里巴巴开发手册中,所有的数据库表几乎都有两个字段:gmt_creategmt_modified;这两个字段都是自动化更新的

接下来我们来实现一下这两个字段的自动填充

方式一:数据库级别

1. 首先在数据库表user中新增两个字段crate_timeupdate_time

默认值都设置为CURRENT_TIMESTAMPupdata_time字段勾选根据当前时间戳更新,然后保存


然后在IDEA中刷新数据表查看,添加成功

2. 同步实体类,新增两个字段

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {@TableId(type = IdType.INPUT)private Long id;private String name;private int age;private String email;private Date createTime;private Date updateTime;
}

3. 运行测试

修改一下updateUser方法后运行测试

//更新用户
@Test
public void updateUser() {User user = new User();user.setId(6L);user.setName("gcc");user.setAge(19);userMapper.updateById(user);//传入的参数是一个对象
}


可以发现出了我们更新的6号用户的update_time更新了,其他的用户都没有更新,这就是自动填充的实现,我们在代码中并没有设置其更新的值,而是通过修改数据表的设置在数据库级别实现自动更新


方式二:代码级别

1. 首先删除数据表中上述两个字段的默认值以及update_time的更新操作


2. 我们可以在实体类字段属性上添加注解@TableField实现自动填充,来看看该注解的源码

其中有个fill属性用于设置字段自动填充策略FieldFill,我们在看看可以设置的策略

可以看到,FiledFill同样是个枚举类,有四种填充策略,默认是DEFAULT不处理

接下来我们使用该注解在字段上进行设置

  • createTime时填充策略为INSERT:插入填充字段

  • updateTime时填充策略位INSER_UPDATE:插入和更新时填充字段

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {@TableId(type = IdType.AUTO)//更改为自增private Long id;private String name;private int age;private String email;//字段添加填充内容@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;
}

3. 编写自动填充处理器处理这个注解

在主程序同级目录下新建handler包,其中创建自己的处理器MyMetaObjectHandler类,继承MetaObjectHandler接口,重写其方法

package com.zsr.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 {//插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {log.info("开始插入填充...");//在插入时填充`crateTime`和`updateTime`字段this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);}//更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {//在更新时填充`updateTime`字段this.setFieldValByName("updateTime", new Date(), metaObject);}
}

4. 运行测试

首选运行插入方法InsertUser

//插入用户
@Test
public void InsertUser() {User user = new User();user.setName("zsr");user.setAge(20);user.setEmail("1241@qq.com");userMapper.insert(user);
}

运行后可以发现新插入的用户两个时间与其他不同,实现了自动填充更新

然后我们update一下新插入的用户试试

//更新用户
@Test
public void updateUser() {User user = new User();user.setId(1318125068800643078l);user.setName("gcc");user.setAge(19);userMapper.updateById(user);//传入的参数是一个对象
}

运行完可以看到update_time成功更新


3. 查询select & 分页查询插件

1. 测试查询

1、通过id查询用户

//查询指定用户
@Test
public void selectUserByID() {User user = userMapper.selectById(3l);System.out.println(user);
}

2、查询批量用户

//批量查询用户
@Test
public void selectUserByBatchID() {List<User> users = userMapper.selectBatchIds(Arrays.asList(4, 5, 6, 7, 8));//参数为列表集合System.out.println(users);
}

3、条件查询

//条件查询
@Test
public void selectUserWithCondition() {HashMap<String, Object> map = new HashMap<>();//自定义查询条件map.put("name", "gcc");List<User> users = userMapper.selectByMap(map);System.out.println(users);
}

2. 分页查询

在MyBatisPlus内部内置了分页插件,我们稍加配置即可使用

1、配置拦截器组件

在主程序同级目录下新建config包,其中新建MyBatisConfig,其中配置分页插件

同时将扫描包注解@MapperScan("com.zsr.mapper")从我们主程序转移到该配置类,更加规范

package com.zsr.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;@MapperScan("com.zsr.mapper")//扫描mapper目录
@EnableTransactionManagement//自动管理事务
@Configuration//配置类
public class MyBatisConfig {//分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}}

2、直接使用page对象进行分页操作

在测试类中测试分页查询

//测试分页查询
@Test
public void queryByPage() {Page<User> userPage = new Page<>(1, 5);//第一个参数为当前页,第二个参数为页面大小userMapper.selectPage(userPage, null);//需要传入page对象和wrapper(这里设置为null)userPage.getRecords().forEach(System.out::println);
}


成功查出1~5号用户,同时可以发现本质还是使用limit进行分页


4. 删除delete & 逻辑删除

1. 测试删除

1、删除指定id用户

//删除指定用户
@Test
public void deleteByID() {userMapper.deleteById(1318125068800643078l);
}

运行测试成功删除

2、批量删除

//批量删除
@Test
public void deleteByBatchID() {userMapper.deleteBatchIds(Arrays.asList(1318125068800643077l,1318125068800643076l));
}

运行后结果:

3、条件删除

//条件删除
@Test
public void deleteByCondition() {HashMap<String, Object> map = new HashMap<>();map.put("name", "zsr");//自定义条件:删除所有name为zsr的userMapper.deleteByMap(map);
}

运行后结果:


2. 逻辑删除

物理删除:从数据库中直接移除

逻辑删除:数据库中没有移除,而是通过一个变量来让其失效(delete=0 —> delete=1)

1、在数据表中增加一个deleted字段

2、同步pojo实体类

@TableLogic注解标名这是逻辑删除子u按

@TableLogic//逻辑删除
private int deleted;

3、配置逻辑删除组件

首先在MyBatisConfig中配置组件,然后再application.properties添加相应的配置

//逻辑删除组件
@Bean
public ISqlInjector iSqlInjector() {return new LogicSqlInjector();
}

在springboot配置文件中配置:

  • 已删除deleted=1
  • 未删除deleted=0
#配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

4、测试

//删除1号用户
@Test
public void deleteByID() {userMapper.deleteById(1l);
}

运行该删除方法,查看日志信息

可以看到,我们执行的删除方法本质上是更新操作,更新了deleted的值,刷新user表看看

可以看到1号用户并没有删除,记录仍在数据库,只是deleted变为1,代表已删除

我们查询所有用户试试

//查询全部用户
@Test
public void QueryAllUsers() {//参数是一个wrapper条件构造器,这里先不用,写nullList<User> userList = userMapper.selectList(null);userList.forEach(System.out::println);
}

运行查看日志信息

可以看到,查询的时候带了条件deleted=0,即未删除的用户才能被查询到;自动过滤被逻辑删除的字段,所以我们查询不到用户1,因为已经逻辑删除


五、乐观锁插件

乐观锁:故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,再次更新值测试

悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

1. 实现方式

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时,set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败
-- A 先查询,获得版本号 version = 1
update user set name = "zsr", version = version + 1
where id = 2 and version = 1-- B 如果此时B线程抢先完成,这个时候 version = 2,会导致 A 修改失败!
update user set name = "zsr", version = version + 1
where id = 2 and version = 1

2. 测试乐观锁插件

1、添加version字段

首先给数据库表添加一个version字段,设置默认值为1

查看是否添加成功

2、同步实体类

添加version字段,注意添加@version注解

@Version//代表这是一个乐观锁
private int version;

3、注册乐观锁组件

MyBatisConfig中注册乐观锁插件

//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();
}

4、测试

我们去测试类测试一下,分别测试乐观锁成功和失败的两种情况

1、首先测试单线程对用户进行修改的情况

//测试单线程修改
@Test
public void TestOptimisticLocker_success() {//获取用户User user = userMapper.selectById(1L);//修改用户信息user.setName("new zsr");user.setEmail("1234@qq.com");//执行更新操作userMapper.updateById(user);
}

运行测试一下,修改成功信息,查看打印的日志

可以看到,第一次的查询和第二次的更新操作的sql语句都附加了version信息,第一次查出来version为1,更新操作时,version+1更改为2,这就是乐观锁的作用,修改成功

2、再测试两个线程都对用户进行修改的情况

//测试多线程修改
@Test
public void TestOptimisticLocker_fail() {//线程1,设置了值但未修改User user1 = userMapper.selectById(1L);user1.setName("zsr1");user1.setEmail("1234@qq.com");//线程2,设置了值且更新User user2 = userMapper.selectById(1L);user2.setName("zsr2");user2.setEmail("4567@qq.com");userMapper.updateById(user2);//线程1进行更新:如果没有乐观锁就会覆盖线程2设置的值userMapper.updateById(user1);
}

运行测试一下,查看日志信息,可以看到线程2的更新操作成功了,线程1并未成功,这是因为线程2更新前,version的值为2,更新后变为3,但是线程1最后的更新操作的附加条件version仍未2,与当下version不同,所以更新失败

同时可以查看user表,最终结果是线程2修改的结果


六、性能分析插件

开发过程中,会遇到一些慢sql,我们通常需要将其提取出来并进行相应的优化,优化查询效率;

MyBatisPlus就提供了一个性能分析插件:性能分析拦截器

  • 作用:用于输出每条SQL语句执行的时间,如果sql语句的时间超过我们指定的时间,就可以停止运行

1. 导入插件

MyBatisConfig中添加组件

//性能分析插件
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {return new PerformanceInterceptor();
}

2. 配置开发环境

在springboot配置文件中设置开发环境

#设置开发环境
spring.profiles.active=dev

3. 配置插件

在上述组件方法performanceInterceptor()中添加自己的配置

//性能分析插件
@Bean
@Profile({"dev", "test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(1);//设置sql执行的最大时间,如果超过了该时间则不执行,以ms为单位performanceInterceptor.setFormat(true);//设置sql格式化return performanceInterceptor;
}

4. 测试

测试一下查询全部用户

//查询全部用户
@Test
public void QueryAllUsers() {//参数是一个wrapper条件构造器,这里先不用,写nullList<User> userList = userMapper.selectList(null);userList.forEach(System.out::println);
}

运行测试,可以看到sql语句格式化的效果

发现报错了,我们可以看到sql执行的时间为63ms,超过我们设定的时间1ms,所以报错

我们修改一下,将sql执行的最大时间更改为100ms,在进行测试

即可成功运行


七、条件构造器

1. 条件查询

一、简单条件运算符

  • eq:等于 =

  • ne:不等于 <>

  • gt:大于 >

  • ge:大于等于 >=

  • lt:小于 <

  • le:小于等于 <=

二、逻辑运算符

  • or:拼接or
  • and
  • nest

三、模糊查询

  • between:between 值1 and 值2
  • notbetween:notbetween 值1 and 值2
  • like:like ‘%值%’
  • not like:notlike ‘%值%’
  • likeLeft:like ‘%值’
  • likeRight:like ‘值%’
  • isNull:字段为空
  • isNotNull:字段不为空
  • in:字段 in(value1,value2 …)
  • notIn:字段 notIn(value1,value2 …)

1、查询name不为空,邮箱不为空且年龄>=20的用户

//查询name不为空,邮箱不为空且年龄>=20的用户
@Test
public void test1() {QueryWrapper<User> wrapper = new QueryWrapper<>();//链式编程wrapper.isNotNull("name").isNotNull("email").ge("age", 20);userMapper.selectList(wrapper).forEach(System.out::println);
}

运行测试,查看输入信息,可以发现附加了我们所需的条件语句

2、查询年龄小于20或大于25的用户

//查询年龄小于20或大于25的用户
@Test
public void test2() {QueryWrapper<User> wrapper = new QueryWrapper<>();//链式编程wrapper.lt("age", 20).or().gt("age", 25);userMapper.selectObjs(wrapper);
}


3、查询年龄介于20~30之间的用户

//查询年龄介于20~30之间的用户
@Test
public void test3() {QueryWrapper<User> wrapper = new QueryWrapper<>();//链式编程wrapper.between("age", 20, 30);userMapper.selectCount(wrapper);//返回结果数
}

4、查询名字中不包含e的,且邮箱以t开头的

//查询名字中不包含e的,且邮箱以t开头的
@Test
public void test4() {QueryWrapper<User> wrapper = new QueryWrapper<>();//链式编程wrapper.notLike("name", "e").likeRight("email", "t");//相当于右边加一个百分号:t%userMapper.selectMaps(wrapper);
}

2. 子查询

  • inSql:字段 in(sql语句)

  • notInSql:字段 notIn(sql语句)

//子查询
@Test
public void test5() {QueryWrapper<User> wrapper = new QueryWrapper<>();//链式编程wrapper.inSql("id", "select id from user where id<3");userMapper.selectObjs(wrapper);
}

3. 分组查询

  • groupBy:group by 字段,…
  • having:having(sql语句)

1、根据不同的更新时间进行分组

//根据update_time分组查询
@Test
public void test9() {QueryWrapper<User> wra pper = new QueryWrapper<>();//链式编程wrapper.select("count(*)","update_time").groupBy("update_time");userMapper.selectObjs(wrapper);
}

4. 排序查询

  • orderByAsc:order by 字段,… asc
  • orderByDesc:order by 字段,… desc

1、按id降序排序查询

//按id降序排序查询
@Test
public void test6() {QueryWrapper<User> wrapper = new QueryWrapper<>();//链式编程wrapper.orderByDesc("id");//id降序排序userMapper.selectObjs(wrapper);
}


2、按id降序升序查询

//按id降序排序查询
@Test
public void test7() {QueryWrapper<User> wrapper = new QueryWrapper<>();//链式编程wrapper.orderByAsc("id");//id降序排序userMapper.selectObjs(wrapper);
}


八、代码自动生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

代码生成器配置文档:https://mybatis.plus/config/generator-config.html#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE

模板配置:其余的可以根据官方配置文档自定配置

package com.zsr;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
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 java.util.ArrayList;// 代码自动生成器
public class CodeAutoGenerate {public static void main(String[] args) {//需要构建一个代码自动生成器对象AutoGenerator generator = new AutoGenerator();//配置策略//1.全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");//获取当前项目路径gc.setOutputDir(projectPath + "/src/main/java");//设置代码的生成目录gc.setAuthor("zsr");//设置作者名gc.setOpen(false);//设置是否打开资源管理器gc.setFileOverride(false); //是否覆盖原来生成的代码gc.setServiceName("%sService"); //去Service的I前缀gc.setIdType(IdType.ID_WORKER);//设置主键生成策略gc.setDateType(DateType.ONLY_DATE);//设置日期类型gc.setSwagger2(true);//设置自动配置swagger文档//将全局配置装入自动代码生成器generator.setGlobalConfig(gc);//2.数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("200024");dsc.setDbType(DbType.MYSQL);//将数据源配置装入自动代码生成器generator.setDataSource(dsc);//3.包的配置PackageConfig pc = new PackageConfig();pc.setModuleName("blog");//设置模块名pc.setParent("com.zsr");//设置放置的包名pc.setEntity("pojo");//pojo层包名pc.setMapper("mapper");//mapper层包名pc.setService("service");//service层包名pc.setController("controller");//controller层包名//将包配置装入自动代码生成器generator.setPackageInfo(pc);//4.策略配置StrategyConfig strategy = new StrategyConfig();strategy.setInclude("user"); //设置要映射的数据表名strategy.setNaming(NamingStrategy.underline_to_camel);//设置包命名的规则:下划线转驼峰命名strategy.setColumnNaming(NamingStrategy.underline_to_camel);//设置数据库字段命名规则strategy.setEntityLombokModel(true); //开启自动生成lombokstrategy.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名//自动填充配置TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);//创建时间TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);//修改时间ArrayList<TableFill> tableFills = new ArrayList<>();//自动填充策略集tableFills.add(gmtCreate);tableFills.add(gmtModified);strategy.setTableFillList(tableFills);//设置自动填充策略//乐观锁strategy.setVersionFieldName("version");strategy.setRestControllerStyle(true);//开启restful驼峰命名格式strategy.setControllerMappingHyphenStyle(true);//设置请求链接格式,例如localhost:8080/hello_id_2generator.setStrategy(strategy);//设置乐观锁策略//执行代码构造器generator.execute();}
}

快速上手MyBatisPlus~(基友搭配,效率翻倍)相关推荐

  1. GitHub Desktop + 码云,基友搭配体验翻倍!

    基友搭配体验翻倍! 本篇简单整理一个好用的版本管理工具,尤其是 GitHub Desktop,超级好用啊,吹爆~ 0. 其它 vue实战(1):准备与资料整理 1. GitHub Desktop Gi ...

  2. word域变成正常文本_超级干货|最全的PPT、Excel、Word实用宝典,助你办公效率翻倍!...

    在日常办公中,无论你是初入职场的新手,还是经验老道的职场人,都离不开Office Word.Excel.PPT-- PPT,光靠好的模板是远远不够的,前阵子公司要大家做个人年终总结 PPT,有难到大家 ...

  3. 做嵌入式工程师不得不说的那些开发工具,让你效率翻倍

    做嵌入式工程师不得不说的那些开发工具,让你效率翻倍 作为一个软件开发人员,除了程序能力素养方面外,还应该熟练地使用各种常用的辅助工具,所谓"工欲善其事,必先利其器":通过这些工具能 ...

  4. 你的Windows电脑里有哪些效率翻倍的生产力软件?

    推荐8个可以提高效率的工具,让你的办公效率翻倍. 1.Snipaste Snipaste是一个简单但强大的截图工具,也可以让你将截图贴回到屏幕上.支持精准截图,自动识别并贴合窗口,多种颜色多种标记.矩 ...

  5. 浏览器快捷键_干货 | 掌握这些快捷键,工作效率翻倍

    快捷键其实不是什么新鲜玩意儿,毕竟只要会用电脑的人应该就都用过ctrl+c 和ctrl+v 这套组合吧,当然还有在崩溃了不知道多少次之后才养成的随手ctrl+s 的习惯.其实除了这些,微软在Windo ...

  6. cad计算总长度插件_超实用的CAD插件大合集,视频教程手把手教学,工作效率翻倍...

    超实用的CAD插件大合集,视频教程手把手教学,工作效率翻倍! 今天被单位新来的实习生给上了一课,才知道原来CAD还有这么多好用便捷的插件.我厚着脸皮要来一份试了一下才体验到快速制图的快乐,这些全是平时 ...

  7. MacW小编分享设计师们常用Sketch插件合集,让你效率翻倍!

    常用Sketch插件都有哪些?Sketch插件总是层出不穷,可以让大家在作出炫酷设计稿的同时,更让大家的工作效率翻倍.macw小编为大家总结了一大波Sketch插件合集,喜欢的赶快收藏起来吧!1.Sk ...

  8. Windows必备的8款电脑软件,轻轻松松效率翻倍

    分享8款Windows软件,能让你的效率翻倍! 01*栅栏桌面 这是一个超级实用的桌面图标整理工具,能帮你更好地整理桌面文件.一天的工作结束后,桌面显得杂乱无章,这时需要一个自动整理桌面的软件,显得尤 ...

  9. vscode 插件显示缩进_能让你开发效率翻倍的 VSCode 插件配置(中)

    这篇文章是<能让你开发效率翻倍的 VSCode 插件配置(上)>的续篇,包括 VSCode 外观增强.功能增强.编码效率等方面的 10 个插件,其中有部分插件也是我发布上篇文章之后在评论里 ...

  10. Word中如何一键生成PPT,五个实用小技巧帮你工作效率翻倍

    Word作为我们常用的文档工具,帮我们大大提高了工作效率,但是对于一个新手小白来说,Word中的大部分技巧都难以快速掌握.但是我们可以掌握一些必备的实用技巧,来提高我们的工作效率,比如小编就为大家带来 ...

最新文章

  1. CALayer( 一 )
  2. 数据库中间件支持数据库集群方案
  3. ip_vs实现分析(7)
  4. hdu 3577Fast Arrangement
  5. 以太坊代币事件监控_以太坊:什么是ERC20标准?
  6. Stack Overflow RToax
  7. java datastream
  8. MySQL高级知识(九)——慢查询日志
  9. c语言算星期,计算任何一天是星期几的C语言源代码.
  10. java 正则regex_Java中的正则表达式– Java Regex示例
  11. Flutter面试问题总结
  12. 墨刀和axure你应该用哪个?
  13. 文件23333333
  14. python质因子分解_质因子分解_个人文章 - SegmentFault 思否
  15. Kubernetes容器平台架构之道
  16. 基于C++实现的图像检索系统
  17. 中国人民银行清算总中心CDA业务数据分析师培训正式开课
  18. 数据库不能不了解的知识点(上)
  19. 基于 Ekman 方程求解大气边界层中的水平均匀流和高度相关的涡流粘度附matlab代码
  20. html实现文字移动的特效

热门文章

  1. docker安装kafka消息队列
  2. 【Kaggle Learn】Python 1-4
  3. 2022-2028年中国钢铁智能制造产业竞争现状及发展趋势分析报告
  4. Box2d 基础入门知识
  5. flash,tornada demo
  6. 受用一生的高效 PyCharm 使用技巧(二)pycharm 指定参数运行文件
  7. 使用colab平台进行训练
  8. BERT的通俗理解 预训练模型 微调
  9. TensorRT 7.2.1 开发概要(上)
  10. 2021年大数据Hadoop(十一):HDFS的元数据辅助管理