Mybatis_plus-基础

一、简介

1.概述

  • 文档地址:https://baomidou.com/

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

  • 愿景:

    在这里插入图片描述

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.架构

在这里插入图片描述

二、快速入门

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)
    );
    
  • 添加用户信息

    DELETE FROM user;
    
    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');
    
    

2.初始化工程

  • 创建空项目

  • 创建springboot 模块

    在这里插入图片描述

3.添加依赖

  • 添加 springboot依赖

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

    <dependencies>
            <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>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.5.2</version>
            </dependency>
        </dependencies>
    

4.配置

4.1添加springboot启动类

  • 启动类

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

4.2application.yml

  • 数据库信息

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mybatis-plus
        password: 123456
        username: root
        driver-class-name: com.mysql.cj.jdbc.Driver
    

4.3启动类添加@MapperScan

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

    @SpringBootApplication
    @MapperScan("cn.sycoder.mapper")
    public class MybatisPlusApplication {
        public static void main(String[] args) {
            SpringApplication.run(MybatisPlusApplication.class,args);
        }
    }
    

5.编码实现

5.1创建实体类

  • 实体类user

    @Data
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    

5.2编写mapper

  • mapper文件

    public interface UserMapper extends BaseMapper<User> {
    }
    

6.测试

  • 新建测试类

    @SpringBootTest
    public class MybatisPlusTest {
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void testSelect() {
            System.out.println(("----- selectAll method test ------"));
            List<User> userList = userMapper.selectList(null);
            userList.forEach(System.out::println);
        }
    }
    
  • 结果

    在这里插入图片描述

三、Mapper CRUD接口

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

    在这里插入图片描述

1.添加

1.1方法

  • insert 方法

    int insert(T entity);
    

1.2测试

  • 测试

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

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

      在这里插入图片描述

1.3使用MybatisPlus 支持id策略

  • IdType

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

1.4@TableId

  • @TableId修改User 类实体

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

1.5@TableField

  • @TableField 修改字段名称

    @Data
    public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String name;
        @TableField(select = false)
        private Integer age;
        @TableField(value = "uemail")
        private String email;
    }
    

    在这里插入图片描述

  • 注意:提供无参构造器

2.删除

2.1根据主键删除

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

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

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

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

2.2根据列删除通过Map方式

  • deleteByMap:根据列删除

  • 方法

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

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

  • 结果

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

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

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

  • 方法

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

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

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

2.3批量删除

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

  • 方法

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

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

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

3.修改

3.1根据id更新

  • updateById:根据id更新

  • 方法

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

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

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

3.2根据条件更新

  • 方法

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

    @Test
    public void testUpdate(){
        User user = new User();
        user.setAge(100);//设置需要更新的字段
    
        //设置需要更新的条件
        UpdateWrapper<User> wrapper = new UpdateWrapper<>();
        wrapper.eq("name","zs");
    
         int count = userMapper.update(user,wrapper);
        System.out.println("受影响结果数--->"+count);
    }
    
    @Test
    public void testUpdate2() {
        //设置需要更新的条件
        UpdateWrapper<User> wrapper = new UpdateWrapper<>();
        wrapper.eq("name", "zs");
        wrapper.set("age",5);
    
        int count = userMapper.update(null, wrapper);
        System.out.println("受影响结果数--->" + count);
    }
    
  • 结果

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

4.查询

4.1selectById

  • selectById:通过主键id 查询

  • 方法

    T selectById(Serializable id);
    
  • 测试

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

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

4.2selectBatchIds

  • selectBatchIds:通过批量的id 查询

  • 方法

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

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

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

4.3selectOne

  • selectOne:查询单条信息

  • 方法

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

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

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

4.4selectCount

  • selectCount:表示总记录数

  • 方法

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

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

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

4.5selectList

  • selectList:查询全部记录

  • 方法

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

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

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

4.6selectPage

  • selectPage:查询出分页结果

  • 方法

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

    @Configuration
    @MapperScan("cn.sycoder.mapper")
    public class MybatisPlusConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
            return interceptor;
        }
    
    }
    
  • 测试

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

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

四、Service CRUD接口

说明:

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

泛型 T 为任意实体对象

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

对象 Wrapper 为 条件构造器

1.提供Service 接口

  • service 接口

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

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

2.api使用

2.1保存

  • save 方法

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

    @Autowired
    IUserService service;
    
    @Test
    public void testServiceSave(){
        User user = new User();
        user.setName("service 创建");
        user.setAge(18);
        user.setEmail("xxx");
        boolean save = service.save(user);
        System.out.println("保存结果:"+save);
    }
    
  • 结果

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

2.2保存或者更新

  • 方法

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

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

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

2.3删除

  • 删除方法

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

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

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

2.4更新

  • 更新方法

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

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

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

2.5查询

  • 查询方法

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

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

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

2.6查询多结果集

  • 查询多条数据

    // 查询所有
    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 testServiceList(){
        List<User> list = service.list();
        System.out.println(list);
    }
    
  • 结果

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

2.7分页查询

  • 分页方法

    // 无条件分页查询
    IPage<T> page(IPage<T> page);
    // 条件分页查询
    IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
    // 无条件分页查询
    IPage<Map<String, Object>> pageMaps(IPage<T> page);
    // 条件分页查询
    IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
    
    

2.8查询数量

  • 查询数量方法

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

五、条件构造器

1.allEq

  • AbstractWrapper

    在这里插入图片描述

  • 常用方法

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

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

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

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

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

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), …)
  • 测试

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

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

3.模糊查询

  • 模糊查询

    方法说明
    likeLIKE ‘%值%’
    notLikeNOT LIKE ‘%值%’
    likeLeftLIKE ‘%值’
    likeRightLIKE ‘值%’
  • 测试

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

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

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

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

4.排序操作

  • 排序分组操作

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

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

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

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

    ==>  Preparing: SELECT id,name,uemail AS email FROM user ORDER BY id DESC
    ==> Parameters: 
    <==      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连接)

  • 测试方法

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

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

    @Test
    public void testAnd(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        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<User> users = userMapper.selectList(wrapper);
        System.out.println(users);
    
    }
    
  • 结果

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

6.select

  • select 方法

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

  • 方法测试

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

    ==>  Preparing: SELECT id FROM user
    ==> Parameters: 
    <==      Total: 5
    

7.UpdateWrapper

  • 更新 wrapper

    说明:

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

  • set

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/427410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解密Lawnchair:打造个性化极致的Android桌面体验

解密Lawnchair&#xff1a;打造个性化极致的Android桌面体验 1. 简介 Lawnchair是一款知名的Android桌面定制工具&#xff0c;旨在为用户提供个性化极致的桌面体验。作为一个开源项目&#xff0c;Lawnchair融合了简洁、灵活和强大的特点&#xff0c;让用户能够自由定制其Andro…

Java基于springboot的课程作业管理系统

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

1.线程池的实现机制

为什么使用线程池&#xff1f; 在处理并发问题时&#xff0c;倘若我们一个一个创建线程池再进行线程池的销毁&#xff0c;不但浪费资源还增加了上下文切换的开销。线程池主要是以空间来换取时间。 如图所示给任务队列分配在线程池里线程。 线程池用到的模式是半同步、半异步模…

机器学习 | 四大常用机器学习Python库介绍

今天这篇我们介绍下Python中常用的机器学习库(机器学习、深度学习啥的&#xff0c;小编还是建议使用Python进行建模编写哈)&#xff0c;也算是本公号机器学习的第一篇推文&#xff0c;主要内容如下&#xff1a; 机器学习常用四大Python库 关于机器学习的我想说的话 所有完整代…

mysql高可用架构设计

一、主从架构 1.主从复制 1.主从复制原理 Mysql的主从复制中主要有三个线程&#xff1a; master&#xff08;binlog dump thread&#xff09;、slave&#xff08;I/O thread 、SQL thread&#xff09; &#xff0c;Master一条线程和Slave中的两条线程。 整体上来说&#xff…

如何合理布局子图--确定MATLAB的subplot子图位置参数

确定MATLAB的subplot子图位置参数 目录 确定MATLAB的subplot子图位置参数摘要1. 问题描述2. 计算过程2.1 确定子图的大小和间距2.2 计算合适的figure大小2.3 计算每个子图的position数据 3. MATLAB代码实现3.1 MATLAB代码3.2 绘图结果 4. 总结 摘要 在MATLAB中&#xff0c;使用…

2024-简单点-picamera2除了文档还有哪里可以学习实例?

picamera2学习例子 去github的picamera2库&#xff0c;找app和examples目录&#xff0c;然后学习

重建大师实时建模支持华为的npu吗?

可以支持适配。重建大师推出信创版&#xff0c;可全面支撑国产信创环境。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格模型&#xff0c;可一…

NumpyPython 笔记1 3.4

array.ndim 几维 array.shape 几行&#xff0c;几列 array.size 存在多少个元素 np.array 转化为矩阵 dtype 确定类型&#xff0c;并且确定精度64&#xff1f;32&#xff1f;16&#xff1f;数字越小&#xff0c;越不精确 二维 np.zeros 生成零矩阵&#xff0c;并且规…

uniapp实战:父子组件传参之子组件数量动态变化

需求说明 现有的设置单元列表,每个带有虚线加号的可以看做是一组设置单元,点击加号可以添加一组设置单元.点击设置单元右上角可以删除对应的设置单元. 实现思路说明 利用数组元素添加或是删除的方式实现页面数量动态变化.由于每个设置单元内容都相同所以单独封装了一个子组件.…

开发知识点-Ruby

Ruby https://m.runoob.com/ruby/ruby-installation-windows.htmlhttps://rubyinstaller.org/downloads/

新书速览|Photoshop+CorelDRAW商业广告设计入门到精通:视频教学版

8章实例剖析商业案例&#xff0c;帮你提升设计效率。商业实战案例&#xff0c;真正掌握设计技能&#xff01; 本书内容 《PhotoshopCorelDRAW商业广告设计入门到精通&#xff1a;视频教学版》以创作精美、类型多样的案例&#xff0c;全面地讲解Photoshop与CorelDRAW软件相结合…

ssh无法直接登入Linux超级用户root(23/3/3更新)

说明&#xff1a;不允许ssh用超级用户的身份登入是为了安全性&#xff0c;如果只是学习使用对安全性没啥要求可以按以下操作解除限制 以普通用户登录到服务器后&#xff0c;执行以下命令以编辑 SSH 服务器配置文件 /etc/ssh/sshd_config sudo nano /etc/ssh/sshd_config 此时会…

【日常聊聊】程序员如何选择职业赛道

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;自我评估与兴趣探索 方向二&#xff1a;市场需求与趋势分析 方向三&#xff1a;成功案例与经验教训 结语…

记录踩过的坑-macOS下使用VS Code

目录 切换主题 安装插件 搭建Python开发环境 装Python插件 配置解释器 打开项目 打开终端 INFO: pip is looking at multiple versions xxxx&#xff0c;过了很久后报错 ​​​​​​​ 切换主题 安装插件 方法1 方法2 搭建Python开发环境 装Python插件 配置解释器 假…

【漏洞复现】某厂商明御WEB应用防火墙任意用户登录漏洞

Nx01 产品简介 安恒明御WEB应用防火墙&#xff08;简称WAF&#xff09;是杭州安恒信息技术股份有限公司自主研发的一款专业应用安全防护产品&#xff0c;专注于为网站、APP等Web业务系统提供安全防护。 Nx02 漏洞描述 安恒明御WEB应用防火墙report.php文件存在硬编码设置的Con…

Linux系统Docker部署RStudio Server

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…

redis08 主从复制

思维草图 认识 主机更新后根据配置和策略&#xff0c;自动将数据同步到备机的master/slave机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。 为什么要使用主从复制 读写分离&#xff0c;性能扩展&#xff0c;降低主服务器的压力容灾&#xff0c;快速恢复&#xf…

[VSCode插件] 轻量级静态博客 - MDBlog

MDBlog VSCode插件&#xff0c;基于Markdown的轻量级静态博客系统&#xff0c;同时支持导出为可以部署的静态博客。 仓库 MDBlog 1. Features 博客基础功能&#xff1a;分类管理、文章管理、自动生成索引快捷指令&#xff1a;快捷输入表格、mermaid、wavedrom、代码块发布&a…

企企通龙年首秀——2024华南采购峰会,赋能企业供应链高质量发展之路

开年第一个工作日&#xff0c;广东省高质量发展大会在深圳召开&#xff0c;处在高质量发展阶段的广东&#xff0c;正加快产业和科技融合发展&#xff0c;坚持以科技创新引领现代化产业体系建设&#xff0c;勇立潮头&#xff0c;抢占先机。 一年之计在于春。迎着高质量发展大会的…