MyBatis-Plus基础详细讲解

拼搏现实的明天。 2023-10-15 22:48 53阅读 0赞

一、简介

1.概述

  • 文档地址:https://baomidou.com/
  • 概述:MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
  • 愿景:

    image-20221130174305787

2.特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

3.架构

image-20221130174653925

二、快速入门

1.创建数据库以及表

  • 创建 mybatis-plus 数据库
  • 创建user表

    1. DROP TABLE IF EXISTS user;
    2. CREATE TABLE user
    3. (
    4. id BIGINT(20) NOT NULL COMMENT '主键ID',
    5. name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    6. age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    7. email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    8. PRIMARY KEY (id)
    9. );
  • 添加用户信息

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

2.初始化工程

  • 创建空项目
  • 创建springboot 模块

    image-20221130193128615

3.添加依赖

  • 添加 springboot依赖

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.7.5</version>
    5. </parent>
  • 引入 spring-boot-starterspring-boot-starter-testmybatis-plus-boot-startermysql 依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.springframework.boot</groupId>
    8. <artifactId>spring-boot-starter-test</artifactId>
    9. <scope>test</scope>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.projectlombok</groupId>
    13. <artifactId>lombok</artifactId>
    14. </dependency>
    15. <dependency>
    16. <groupId>mysql</groupId>
    17. <artifactId>mysql-connector-java</artifactId>
    18. </dependency>
    19. <dependency>
    20. <groupId>com.baomidou</groupId>
    21. <artifactId>mybatis-plus-boot-starter</artifactId>
    22. <version>3.5.2</version>
    23. </dependency>
    24. </dependencies>

4.配置

4.1添加springboot启动类

  • 启动类

    1. @SpringBootApplication
    2. public class MybatisPlusApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(MybatisPlusApplication.class,args);
    5. }
    6. }

4.2application.yml

  • 数据库信息

    1. spring:
    2. datasource:
    3. url: jdbc:mysql://localhost:3306/mybatis-plus
    4. password: 123456
    5. username: root
    6. driver-class-name: com.mysql.cj.jdbc.Driver

4.3启动类添加@MapperScan

  • 作用:用于扫描 Mapper 文件夹

    1. @SpringBootApplication
    2. @MapperScan("cn.sycoder.mapper")
    3. public class MybatisPlusApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(MybatisPlusApplication.class,args);
    6. }
    7. }

5.编码实现

5.1创建实体类

  • 实体类user

    1. @Data
    2. public class User {
    3. private Long id;
    4. private String name;
    5. private Integer age;
    6. private String email;
    7. }

5.2编写mapper

  • mapper文件

    1. public interface UserMapper extends BaseMapper<User> {
    2. }

6.测试

  • 新建测试类

    1. @SpringBootTest
    2. public class MybatisPlusTest {
    3. @Autowired
    4. private UserMapper userMapper;
    5. @Test
    6. public void testSelect() {
    7. System.out.println(("----- selectAll method test ------"));
    8. List<User> userList = userMapper.selectList(null);
    9. userList.forEach(System.out::println);
    10. }
    11. }
  • 结果

    image-20221130195259249

三、Mapper CRUD接口

  • 根据userMapper 可以知道,我们使用的方法是BaseMapper 中定义好的,才提高了开发效率。

    image-20221201135928903

1.添加

1.1方法

  • insert 方法

    1. int insert(T entity);

1.2测试

  • 测试

    1. @Test
    2. public void testInsert(){
    3. User entity = User.builder().name("sy").age(18).email("sycoder@it.cn").build();
    4. int count = userMapper.insert(entity);//受影响结果集
    5. Long id = entity.getId();
    6. System.out.println("受影响结果数--->"+count);
    7. System.out.println("id--->"+id);
    8. }
  • 问题

    • 自增主键值太大了,不符合我们mysql自增的逻辑

      image-20221201140706728

1.3使用MybatisPlus 支持id策略

  • IdType

    1. public enum IdType {
    2. AUTO(0),//数据库自增id
    3. NONE(1),//没有主键
    4. INPUT(2),//用户输入id
    5. ASSIGN_ID(3),//
    6. ASSIGN_UUID(4);//时间戳,或者叫随机字符串
    7. private final int key;
    8. private IdType(int key) {
    9. this.key = key;
    10. }
    11. public int getKey() {
    12. return this.key;
    13. }
    14. }

1.4@TableId

  • @TableId修改User 类实体

    1. @Data
    2. @Builder
    3. public class User {
    4. @TableId(type = IdType.AUTO)
    5. private Long id;
    6. private String name;
    7. private Integer age;
    8. private String email;
    9. }

1.5@TableField

  • @TableField 修改字段名称

    1. @Data
    2. public class User {
    3. @TableId(type = IdType.AUTO)
    4. private Long id;
    5. private String name;
    6. @TableField(select = false)
    7. private Integer age;
    8. @TableField(value = "uemail")
    9. private String email;
    10. }

image-20221201143539024

  • 注意:提供无参构造器

2.删除

2.1根据主键删除

  • deleteById方法:根据主键id删除

    1. int deleteById(Serializable id);
    2. int deleteById(T entity);//传一个对象进来
  • 测试

    1. @Test
    2. public void testDeleteById(){
    3. int count = userMapper.deleteById(2L);
    4. System.out.println("受影响结果数--->"+count);
    5. }
  • 结果

    1. ==> Preparing: DELETE FROM user WHERE id=?
    2. ==> Parameters: 3(Long)
    3. <== Updates: 1

2.2根据列删除通过Map方式

  • deleteByMap:根据列删除
  • 方法

    1. int deleteByMap(@Param("cm") Map<String, Object> columnMap);
  • 测试

    1. @Test
    2. public void testDeleteByMap(){
    3. Map<String,Object> map = new HashMap<>();
    4. map.put("name","sy");
    5. int count = userMapper.deleteByMap(map);
    6. System.out.println("受影响结果数--->"+count);
    7. }
  • 注意:如果map 中没有列信息,是删除整表
  • 结果

    1. ==> Preparing: DELETE FROM user WHERE name = ?
    2. ==> Parameters: sy(String)
    3. <== Updates: 1

2.2根据列删除通过包装方式

  • delete:根据 entity 对象的条件进行删除
  • 方法

    1. int delete(@Param("ew") Wrapper<T> queryWrapper);
  • 测试

    1. @Test
    2. public void testDelete(){
    3. User user = new User();
    4. user.setName("sy");
    5. Wrapper wrapper = new QueryWrapper(user);
    6. int count = userMapper.delete(wrapper);
    7. System.out.println("受影响结果数--->"+count);
    8. }
  • 结果

    1. ==> Preparing: DELETE FROM user WHERE name=?
    2. ==> Parameters: sy(String)
    3. <== Updates: 1

2.3批量删除

  • deleteBatchIds:通过ids 集合实现批量删除
  • 方法

    1. int deleteBatchIds(@Param("coll") Collection<?> idList);
  • 测试

    1. @Test
    2. public void testDeleteBatchIds(){
    3. List list = new ArrayList<>();
    4. list.add(1L);
    5. list.add(3L);
    6. int count = userMapper.deleteBatchIds(list);
    7. System.out.println("受影响结果数--->"+count);
    8. }
  • 结果

    1. ==> Preparing: DELETE FROM user WHERE id IN ( ? , ? )
    2. ==> Parameters: 1(Long), 3(Long)
    3. <== Updates: 2

3.修改

3.1根据id更新

  • updateById:根据id更新
  • 方法

    1. int updateById(@Param("et") T entity);
  • 测试

    1. @Test
    2. public void testUpdateById(){
    3. User user = new User();
    4. user.setId(3L);
    5. user.setName("zs");
    6. user.setEmail("sy@qq.com");
    7. int count = userMapper.updateById(user);
    8. System.out.println("受影响结果数--->"+count);
    9. }
  • 结果

    1. ==> Preparing: UPDATE user SET name=?, uemail=? WHERE id=?
    2. ==> Parameters: zs(String), sy@qq.com(String), 3(Long)
    3. <== Updates: 1

3.2根据条件更新

  • 方法

    1. int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
  • 测试

    1. @Test
    2. public void testUpdate(){
    3. User user = new User();
    4. user.setAge(100);//设置需要更新的字段
    5. //设置需要更新的条件
    6. UpdateWrapper<User> wrapper = new UpdateWrapper<>();
    7. wrapper.eq("name","zs");
    8. int count = userMapper.update(user,wrapper);
    9. System.out.println("受影响结果数--->"+count);
    10. }
    11. @Test
    12. public void testUpdate2() {
    13. //设置需要更新的条件
    14. UpdateWrapper<User> wrapper = new UpdateWrapper<>();
    15. wrapper.eq("name", "zs");
    16. wrapper.set("age",5);
    17. int count = userMapper.update(null, wrapper);
    18. System.out.println("受影响结果数--->" + count);
    19. }
  • 结果

    1. ==> Preparing: UPDATE user SET age=? WHERE (name = ?)
    2. ==> Parameters: 100(Integer), zs(String)
    3. <== Updates: 1

4.查询

4.1selectById

  • selectById:通过主键id 查询
  • 方法

    1. T selectById(Serializable id);
  • 测试

    1. @Test
    2. public void testSelectById(){
    3. User user = userMapper.selectById(1L);
    4. System.out.println(user);
    5. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE id=?
    2. ==> Parameters: 1(Long)
    3. <== Total: 1

4.2selectBatchIds

  • selectBatchIds:通过批量的id 查询
  • 方法

    1. List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
  • 测试

    1. @Test
    2. public void testSelectBatchIds(){
    3. List<Long> ids = new ArrayList<>();
    4. ids.add(1L);
    5. ids.add(3L);
    6. List<User> users = userMapper.selectBatchIds(ids);
    7. System.out.println(users);
    8. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE id IN ( ? , ? )
    2. ==> Parameters: 1(Long), 3(Long)
    3. <== Total: 2

4.3selectOne

  • selectOne:查询单条信息
  • 方法

    1. default T selectOne(@Param("ew") Wrapper<T> queryWrapper) {
    2. List<T> ts = this.selectList(queryWrapper);
    3. if (CollectionUtils.isNotEmpty(ts)) {
    4. if (ts.size() != 1) {
    5. throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records", new Object[0]);
    6. } else {
    7. return ts.get(0);
    8. }
    9. } else {
    10. return null;
    11. }
    12. }
  • 测试

    1. @Test
    2. public void testSelectOne(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","sy");
    5. User user = userMapper.selectOne(wrapper);
    6. System.out.println(user);
    7. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ?)
    2. ==> Parameters: sy(String)
    3. <== Total: 1

4.4selectCount

  • selectCount:表示总记录数
  • 方法

    1. Long selectCount(@Param("ew") Wrapper<T> queryWrapper);
  • 测试

    1. @Test
    2. public void testSelectCount(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","sy");
    5. Long count = userMapper.selectCount(wrapper);
    6. System.out.println(count);
    7. }
  • 结果

    1. ==> Preparing: SELECT COUNT( * ) FROM user WHERE (name = ?)
    2. ==> Parameters: sy(String)
    3. <== Total: 1

4.5selectList

  • selectList:查询全部记录
  • 方法

    1. List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
  • 测试

    1. @Test
    2. public void testSelectList(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","sy");
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ?)
    2. ==> Parameters: sy(String)
    3. <== Total: 1

4.6selectPage

  • selectPage:查询出分页结果
  • 方法

    1. <P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);
  • 配置分页插件

    1. @Configuration
    2. @MapperScan("cn.sycoder.mapper")
    3. public class MybatisPlusConfig {
    4. @Bean
    5. public MybatisPlusInterceptor mybatisPlusInterceptor() {
    6. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    7. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    8. return interceptor;
    9. }
    10. }
  • 测试

    1. @Test
    2. public void testSelectPage(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","sy");
    5. Page<User> page = new Page<>(1,1);
    6. IPage<User> userPage = userMapper.selectPage(page, wrapper);
    7. System.out.println("总条数为:"+userPage.getTotal());
    8. System.out.println("总页数为:"+userPage.getPages());
    9. List<User> records = userPage.getRecords();
    10. System.out.println(records);
    11. }
  • 结果

    1. ==> Preparing: SELECT COUNT(*) AS total FROM user WHERE (name = ?)
    2. ==> Parameters: sy(String)
    3. <== Total: 1
    4. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ?) LIMIT ?
    5. ==> Parameters: sy(String), 1(Long)
    6. <== Total: 1

四、Service CRUD接口

说明:

通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,

泛型 T 为任意实体对象

建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类

对象 Wrapper 为 条件构造器

1.提供Service 接口

  • service 接口

    1. public interface IUserService extends IService<User> {
    2. }
  • service 实现类

    1. @Service
    2. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    3. }

2.api使用

2.1保存

  • save 方法

    1. // 插入一条记录(选择字段,策略插入)
    2. boolean save(T entity);
    3. // 插入(批量)
    4. boolean saveBatch(Collection<T> entityList);
    5. // 插入(批量)
    6. boolean saveBatch(Collection<T> entityList, int batchSize);
  • 测试

    1. @Autowired
    2. IUserService service;
    3. @Test
    4. public void testServiceSave(){
    5. User user = new User();
    6. user.setName("service 创建");
    7. user.setAge(18);
    8. user.setEmail("xxx");
    9. boolean save = service.save(user);
    10. System.out.println("保存结果:"+save);
    11. }
  • 结果

    1. ==> Preparing: INSERT INTO user ( name, age, uemail ) VALUES ( ?, ?, ? )
    2. ==> Parameters: service 创建(String), 18(Integer), xxx(String)
    3. <== Updates: 1

2.2保存或者更新

  • 方法

    1. // TableId 注解存在更新记录,否插入一条记录
    2. boolean saveOrUpdate(T entity);
    3. // 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
    4. boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
    5. // 批量修改插入
    6. boolean saveOrUpdateBatch(Collection<T> entityList);
    7. // 批量修改插入
    8. boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
  • 测试

    1. @Test
    2. public void testServiceSaveOrUpdate(){
    3. User user = new User();
    4. user.setId(6L);
    5. user.setName("ser1231233vice 创建");
    6. user.setAge(18);
    7. user.setEmail("xxx");
    8. boolean save = service.saveOrUpdate(user);
    9. System.out.println("保存更新结果:"+save);
    10. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE id=?
    2. ==> Parameters: 6(Long)
    3. <== Total: 1
    4. ==> Preparing: UPDATE user SET name=?, age=?, uemail=? WHERE id=?
    5. ==> Parameters: ser1231233vice 创建(String), 18(Integer), xxx(String), 6(Long)
    6. <== Updates: 1

2.3删除

  • 删除方法

    1. // 根据 entity 条件,删除记录
    2. boolean remove(Wrapper<T> queryWrapper);
    3. // 根据 ID 删除
    4. boolean removeById(Serializable id);
    5. // 根据 columnMap 条件,删除记录
    6. boolean removeByMap(Map<String, Object> columnMap);
    7. // 删除(根据ID 批量删除)
    8. boolean removeByIds(Collection<? extends Serializable> idList);
  • 测试

    1. @Test
    2. public void testServiceDelete(){
    3. boolean ret = service.removeById(6L);
    4. System.out.println("删除的结果:"+ret);
    5. }
  • 结果

    1. ==> Preparing: DELETE FROM user WHERE id=?
    2. ==> Parameters: 6(Long)
    3. <== Updates: 1

2.4更新

  • 更新方法

    1. // 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
    2. boolean update(Wrapper<T> updateWrapper);
    3. // 根据 whereWrapper 条件,更新记录
    4. boolean update(T updateEntity, Wrapper<T> whereWrapper);
    5. // 根据 ID 选择修改
    6. boolean updateById(T entity);
    7. // 根据ID 批量更新
    8. boolean updateBatchById(Collection<T> entityList);
    9. // 根据ID 批量更新
    10. boolean updateBatchById(Collection<T> entityList, int batchSize);
  • 测试

    1. @Test
    2. public void testServiceUpdate(){
    3. User user = new User();
    4. user.setId(6L);
    5. user.setName("ser1231233vice 创建");
    6. user.setAge(18);
    7. user.setEmail("xxx");
    8. boolean ret = service.updateById(user);
    9. System.out.println("更新结果:"+ret);
    10. }
  • 结果

    1. ==> Preparing: UPDATE user SET name=?, age=?, uemail=? WHERE id=?
    2. ==> Parameters: ser1231233vice 创建(String), 18(Integer), xxx(String), 6(Long)
    3. <== Updates: 0

2.5查询

  • 查询方法

    1. // 根据 ID 查询
    2. T getById(Serializable id);
    3. // 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
    4. T getOne(Wrapper<T> queryWrapper);
    5. // 根据 Wrapper,查询一条记录
    6. T getOne(Wrapper<T> queryWrapper, boolean throwEx);
    7. // 根据 Wrapper,查询一条记录
    8. Map<String, Object> getMap(Wrapper<T> queryWrapper);
    9. // 根据 Wrapper,查询一条记录
    10. <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
  • 测试

    1. @Test
    2. public void testServiceGet(){
    3. User user = service.getById(7L);
    4. System.out.println(user);
    5. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE id=?
    2. ==> Parameters: 7(Long)
    3. <== Total: 1

2.6查询多结果集

  • 查询多条数据

    1. // 查询所有
    2. List<T> list();
    3. // 查询列表
    4. List<T> list(Wrapper<T> queryWrapper);
    5. // 查询(根据ID 批量查询)
    6. Collection<T> listByIds(Collection<? extends Serializable> idList);
    7. // 查询(根据 columnMap 条件)
    8. Collection<T> listByMap(Map<String, Object> columnMap);
    9. // 查询所有列表
    10. List<Map<String, Object>> listMaps();
    11. // 查询列表
    12. List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
    13. // 查询全部记录
    14. List<Object> listObjs();
    15. // 查询全部记录
    16. <V> List<V> listObjs(Function<? super Object, V> mapper);
    17. // 根据 Wrapper 条件,查询全部记录
    18. List<Object> listObjs(Wrapper<T> queryWrapper);
    19. // 根据 Wrapper 条件,查询全部记录
    20. <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
  • 测试

    1. @Test
    2. public void testServiceList(){
    3. List<User> list = service.list();
    4. System.out.println(list);
    5. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user
    2. ==> Parameters:
    3. <== Total: 5

2.7分页查询

  • 分页方法

    1. // 无条件分页查询
    2. IPage<T> page(IPage<T> page);
    3. // 条件分页查询
    4. IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
    5. // 无条件分页查询
    6. IPage<Map<String, Object>> pageMaps(IPage<T> page);
    7. // 条件分页查询
    8. IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

2.8查询数量

  • 查询数量方法

    1. // 查询总记录数
    2. int count();
    3. // 根据 Wrapper 条件,查询总记录数
    4. int count(Wrapper<T> queryWrapper);

五、条件构造器

1.allEq

  • AbstractWrapper

    image-20221202193654533

  • 常用方法

    1. allEq(Map<R, V> params)
    2. allEq(Map<R, V> params, boolean null2IsNull)
    3. allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
  • 测试

    1. @Test
    2. public void testAllEq(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. Map<String,Object> parms = new HashMap();
    5. parms.put("name","sy");
    6. parms.put("age",18);
    7. wrapper.allEq(parms);
    8. List<User> users = userMapper.selectList(wrapper);
    9. System.out.println(users);
    10. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ? AND age = ?)
    2. ==> Parameters: sy(String), 18(Integer)
    3. <== Total: 1
  • 带过滤的常用方法

    1. allEq(BiPredicate<R, V> filter, Map<R, V> params)
    2. allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
    3. allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
  • 测试

    1. @Test
    2. public void testAllEq(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. Map<String,Object> parms = new HashMap();
    5. parms.put("name","sy");
    6. parms.put("age",18);
    7. parms.put("uemail",null);
    8. //SELECT id,name,uemail AS email FROM user WHERE (name = ?)
    9. wrapper.allEq((k,v)->("name".equals(k)),parms);
    10. List<User> users = userMapper.selectList(wrapper);
    11. System.out.println(users);
    12. }

2.比较操作

  • 比较符





























































    比较符 说明 符号
    eq 等于 =
    ne 不等于 != <>
    gt 大于 >
    ge 大于等于 >=
    lt 小于 <
    le 小于等于 <=
    between 包含 BETWEEN 值1 AND 值2
    notBetween 不包含 NOT BETWEEN 值1 AND 值2
    in 包含 字段 IN (value.get(0), value.get(1), …)
    notIn 不包含 字段 NOT IN (value.get(0), value.get(1), …)
  • 测试

    1. @Test
    2. public void testBasicSwap(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","sy").ge("age",18)
    5. .in("uemail","xxx");
    6. List<User> users = userMapper.selectList(wrapper);
    7. System.out.println(users);
    8. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ? AND age >= ? AND uemail IN (?))
    2. ==> Parameters: sy(String), 18(Integer), xxx(String)
    3. <== Total: 1

3.模糊查询

  • 模糊查询


























    方法 说明
    like LIKE ‘%值%’
    notLike NOT LIKE ‘%值%’
    likeLeft LIKE ‘%值’
    likeRight LIKE ‘值%’
  • 测试

    1. @Test
    2. public void testLike(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.like("name","s");
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name LIKE ?)
    2. ==> Parameters: %s%(String)
    3. <== Total: 5
  • likeLeft

    1. @Test
    2. public void testLike(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.likeLeft("name","y");//%y
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name LIKE ?)
    2. ==> Parameters: %y(String)
    3. <== Total: 4

4.排序操作

  • 排序分组操作


























    方法 说明
    groupBy 分组:GROUP BY 字段, …
    orderByAsc 排序:ORDER BY 字段, … ASC
    orderByDesc 排序:ORDER BY 字段, … DESC
    orderBy 排序:ORDER BY 字段, …
  • 测试分组

    1. @Test
    2. public void testGroupBy(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.groupBy("name");
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user GROUP BY name
    2. ==> Parameters:
    3. <== Total: 2
  • 测试排序

    1. @Test
    2. public void testOrder(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.orderBy(true,false,"id");
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user ORDER BY id DESC
    2. ==> Parameters:
    3. <== Total: 5

5.逻辑查询

  • 逻辑查询


















    方法 说明
    or 例: eq(“id”,1).or().eq(“name”,”老王”)—>id = 1 or name = ‘老王’
    and 例: and(i -> i.eq(“name”, “李白”).ne(“status”, “活着”))—>and (name = ‘李白’ and status <> ‘活着’)
  • or 方法

    注意事项:

    主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)

  • 测试方法

    1. @Test
    2. public void testOr(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","sy").or().eq("age",18);
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ? OR age = ?)
    2. ==> Parameters: sy(String), 18(Integer)
    3. <== Total: 4
  • and 方法测试

    1. @Test
    2. public void testAnd(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","sy").and(i -> i.ne("age", 18)
    5. .or().ne("age",1));
    6. //select * from user where name = sy and (age != 18 or age != 1)
    7. List<User> users = userMapper.selectList(wrapper);
    8. System.out.println(users);
    9. }
  • 结果

    1. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ? AND (age <> ? OR age <> ?))
    2. ==> Parameters: sy(String), 18(Integer), 1(Integer)
    3. <== Total: 4

6.select

  • select 方法

    例子 select(“id”, “name”, “age”):具体需要查询的列

  • 方法测试

    1. @Test
    2. public void testSelect(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.select("id");
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id FROM user
    2. ==> Parameters:
    3. <== Total: 5

7.UpdateWrapper

  • 更新 wrapper

    说明:

    继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
    LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!

  • set

    1. SQL SET 字段
    2. 例: set("name", "老李头")
    3. 例: set("name", "")--->数据库字段值变为空字符串
    4. 例: set("name", null)--->数据库字段值变为null
  • setSql

    1. 设置 SET 部分 SQL
    2. 例: setSql("name = '老李头'")

rapper<>();
wrapper.eq(“name”,“sy”).and(i -> i.ne(“age”, 18)
.or().ne(“age”,1));
//select * from user where name = sy and (age != 18 or age != 1)
List users = userMapper.selectList(wrapper);
System.out.println(users);

}

  1. - 结果
  2. ```java
  3. ==> Preparing: SELECT id,name,uemail AS email FROM user WHERE (name = ? AND (age <> ? OR age <> ?))
  4. ==> Parameters: sy(String), 18(Integer), 1(Integer)
  5. <== Total: 4

6.select

  • select 方法

    例子 select(“id”, “name”, “age”):具体需要查询的列

  • 方法测试

    1. @Test
    2. public void testSelect(){
    3. QueryWrapper<User> wrapper = new QueryWrapper<>();
    4. wrapper.select("id");
    5. List<User> users = userMapper.selectList(wrapper);
    6. System.out.println(users);
    7. }
  • 结果

    1. ==> Preparing: SELECT id FROM user
    2. ==> Parameters:
    3. <== Total: 5

7.UpdateWrapper

  • 更新 wrapper

    说明:

    继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
    LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!

  • set

    1. SQL SET 字段
    2. 例: set("name", "老李头")
    3. 例: set("name", "")--->数据库字段值变为空字符串
    4. 例: set("name", null)--->数据库字段值变为null
  • setSql

    1. 设置 SET 部分 SQL
    2. 例: setSql("name = '老李头'")

发表评论

表情:
评论列表 (有 0 条评论,53人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Git详细讲解

    之前在网上找过很多Git的讲解文章,这篇是我看过的最详细、易懂的一篇,喜欢的可以收藏。 [Git详细教程][Git] [Git]: https://juejin.im/