Mybatis_plus-基础

news2024/10/6 6:05:23

一、简介

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 = '老李头'")
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前后端分离项目Docker部署指南(上)

目录 前言 一.搭建局域网 1.搭建net-ry局域网&#xff0c;用于部署若依项目 2.注意点 二.安装redis 创建目录 将容器进行挂载 ​编辑 测试是否安装成功 ​编辑 三. 安装MySQL 创建文件夹 上传配置文件并且修改 .启动MySQL容器服务 充许远程连接 四.部署后端 使用…

RISCV 中断控制器 PLIC APLIC (非MSI部分)

以下包含了 PLIC & APLIC 着重解释 APLIC 部分 参考 github 中 riscv-aia 规范1.0 &#xff0c;第四章 APLIC 注&#xff1a;关于MSI的部分简略&#xff08;等后续搞清楚&#xff09; 本人处于学习阶段&#xff0c;不清晰的地方&#xff0c;请见谅 一、关于 PLIC 配置 1、…

【Python】-----基础知识

注释 定义&#xff1a;让计算机跳过这个代码执行用三个单引号/双引号都表示注释信息&#xff0c;在Python中单引号与双引号没有区别&#xff0c;但必须是成对出现 输出与输入 程序是有开始&#xff0c;有结束的&#xff0c;程序运行规则&#xff1a;从上而下&#xff0c;由内…

(1)预处理

我们需要的文件结构如上 main.cpp add.h add.cpp add.h 这里使用riscv的工具链编译为.i文件&#xff0c;需要使用-E&#xff0c;就是只进行预处理&#xff0c;我们可以得到两个.i文件即main.i和add.i main.i 这里看到main.i里头文件全部替换&#xff0c;然后多了三万多行 所以…

力扣经典题目解析--合并两个有序链表

原题地址: . - 力扣&#xff08;LeetCode&#xff09; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 迭代 链表节点结构…

Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常

一、JDK8新特性 1.Lambda表达式 Lambda表达式是JDK 8开始新增的一种语法形式;作用:用于简化名内部类的代码写法。 注意:Lambda表达式并不是说能简化全部匿名内部类的写法&#xff0c;只能简化函数式接口的匿名内部类。 有且仅有一个抽象方法的接口。注意:将来我们见到的大部…

【音视频开发好书推荐】《RTC程序设计:实时音视频权威指南》

1、WebRTC概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个由Google发起的实时音视频通讯C开源库&#xff0c;其提供了音视频采集、编码、网络传输&#xff0c;解码显示等一整套音视频解决方案&#xff0c;我们可以通过该开源库快速地构建出一个音视频通…

【前端寻宝之路】总结学习使用CSS的引入方式

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-BNJBIEvpN0GHNeJ1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

C语言第三十五弹---文件操作(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、为什么使用文件&#xff1f; 2、什么是文件&#xff1f; 2.1、程序文件 2.2、数据文件 2.3、文件名 3、二进制文件和文本文件 4、文件的打开和…

集成算法(随机森林,AdaBoost,Xgboost,Stacking模型)

目录 一、前言 二、Bagging模型 三、Boosting模型 四、Stacking模型 五、总结 一、前言 集成算法&#xff08;Enseamable learning&#xff09; 集成算法一般考虑树模型&#xff0c;KNN就不太适合 目的&#xff1a;让机器学习效果更好&#xff0c;单个不好&#xff0c;一起…

性能优化篇(七) UI优化注意事项以及使用Sprite Atlas打包精灵图集

UI优化注意事项 1.尽量避免使用IMGUI(OnGUI)来做游戏时的UI&#xff0c;因为IMGUI的开销比较大。 2.如果一个UGUI的控件不需要进行射线检测&#xff0c;则可以取消勾选Raycast Target 3.尽量避免使用完全透明的图片和UI控件。因为即使完全透明&#xff0c;我们看不见它&#xf…

BUUCTF------[HCTF 2018]WarmUp

开局一个表情&#xff0c;源代码发现source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"];if (! isset($page) |…

关于图形学中生成三角形库Triangle.Net的下载及简单使用

背景 Triangle.NET 是生成 2D&#xff08;约束&#xff09;Delaunay 三角剖分和点集或平面直线图的高质量网格。此库是基于 Jonathan Richard Shewchuk 的 Triangle 项目&#xff0c;主要用于图形学像Opengl(或Unity3D)中生成三角形使用。 下载 Triangle.Net是基于C#语言的库…

倾斜三维模型OSGB路径漫游——DasViewer

背景 有时候我们需要查看倾斜三维模型效果的效果&#xff0c;虽然也有很多软件可以用&#xff0c;比如CC、超图等等&#xff0c;但是这些软件都比较大&#xff0c;安装也比较麻烦&#xff0c;DasViewer这个软件就比较轻量&#xff0c;安装也简单&#xff0c;功能强大&#xff…

网络信息安全:nginx漏洞收集(升级至最新版本)

网络&信息安全&#xff1a;nginx漏洞收集&#xff08;升级至最新版本&#xff09; 一、风险详情1.1 nginx 越界写入漏洞(CVE-2022-41742)1.2 nginx 缓冲区错误漏洞(CVE-2022-41741)1.3 nginx 拒绝服务漏洞&#xff08;CNVD-2018-22806&#xff09; 二、nginx升级步骤 &…

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录&#xff0c;同时在Google clolab上面是实现&#xff0c;文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战&#xff0c;主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

jpg图片怎么转成png?一个超实用的jpg转格式方法

Jpg是常见的图片格式之一&#xff0c;有时候需要将常见的jpg格式转换成png格式的图片来应对不同的需求。因为png格式的图片画质更清晰还支持透明度等&#xff0c;能够更好的保存图片质量。接下来&#xff0c;就给大家介绍一下jpg转换png格式的小窍门。只需要使用jpg格式转换器&…

Matlab高光谱遥感、数据处理与混合像元分解

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

HMI方案技术分享|启明智显M4核心板适配RGB/LVDS接口屏幕教程

前言&#xff1a; 深圳市启明智显科技有限公司专注于HMI&#xff08;人机交互&#xff09;和AIoT&#xff08;人工智能物联网&#xff09;产品和解决方案的研发、设计和生产。公司产品覆覆盖了多种操作系统&#xff0c;包括Linux、RTOS和OneOs等。无论您的项目使用哪种系统&am…

policy-space response oracles (PSRO)含义

Algorithm 1 维护了一个所有玩家策略的策略池。然后循环地选定玩家&#xff0c;然后从他的策略集中选择出一个策略&#xff0c;固定其它所有玩家此时的策略&#xff0c;然后不断地训练这个策略使得该策略成为一个在别的玩家策略不变的情况下、近似的best respond。然后将其加入…