Mybatis-Plus 尚硅谷

mybatis-plus-sgg-40-57

LambdaXxxWrapper #

  • LambdaQueryWrapper主要是为了防止字段名写错

       @Test
        public void test11(){
    
            String username="abc";
            Integer ageBegin=null;
            Integer ageEnd=30;
            LambdaQueryWrapper<User> queryWrapper=new LambdaQueryWrapper<>();
            queryWrapper.like(StringUtils.isNotBlank(username),User::getUserName,username)
                    .ge(ageBegin!=null,User::getAge,ageBegin);
            userMapper.selectList(queryWrapper);
        }
    

    sql日志打印

    ==>  Preparing: SELECT uid AS id,name AS userName,age,email,is_deleted_ly FROM t_user WHERE is_deleted_ly=0 AND (name LIKE ?)
    ==> Parameters: %abc%(String)
    <==      Total: 0
    
  • LambdaUpdateWrapper

        @Test
        public void test12() {
    
            //(age>23且用户名包含a)  或 (邮箱为null)
            LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.like(User::getUserName, "a")
                    .and(userUpdateWrapper ->
                            userUpdateWrapper.gt(User::getAge, 23).or().isNotNull(User::getEmail));
            updateWrapper.set(User::getUserName, "小黑").set(User::getEmail, "abc@ly.com");
            userMapper.update(null, updateWrapper);
        }
    

    sql日志打印

    ...

mybatis-plus-sgg-19-39

通用Service应用 #

  • 这里会出现 publicKey is now allowed ,在数据库连接语句后面加上这句话即可 allowPublicKeyRetrieval=true

    spring:
      #配置数据源
      datasource:
        #配置数据源类型
        type: com.zaxxer.hikari.HikariDataSource
        #配置数据源各个信息
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&&useSSL=false&&allowPublicKeyRetrieval=true
        username: root
        password: 123456
    
  • 查询

        @Test
        public void testList(){
            //List<User> list = userService.list();
            long count = userService.count();
            System.out.println("总条数:"+count);
        }
    

    SQL执行语句

    ==>  Preparing: SELECT COUNT( * ) FROM user
    ==> Parameters: 
    <==    Columns: COUNT( * )
    <==        Row: 5
    <==      Total: 1
    
  • 批量添加

        @Test
        public void batchInsert(){
            List<User> users=new ArrayList<>();
            for(int i=0;i<10;i++){
                User user=new User();
                user.setName("name"+i);
                user.setEmail("email"+i);
                users.add(user);
            }
    
            boolean b = userService.saveBatch(users);
            System.out.println("result:"+b);
        }
    

    sql日志输出

    ...

mybatis-plus-sgg-12-18

BaseMapper #

  • 注:使用 mvn dependency:resolve -Dclassifier=sources 来获得mapper源码

  • 一些接口介绍

        /**
         * 插入一条记录
         *
         * @param entity 实体对象
         */
        int insert(T entity);
    
        /**
         * 根据 ID 删除
         *
         * @param id 主键ID
         */
        int deleteById(Serializable id);
    
        /**
         * 根据实体(ID)删除
         *
         * @param entity 实体对象
         * @since 3.4.4
         */
        int deleteById(T entity);
    
        /**
         * 根据 columnMap 条件,删除记录
         *
         * @param columnMap 表字段 map 对象
         */
        int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    
        /**
         * 根据 entity 条件,删除记录
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
         */
        int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 删除(根据ID或实体 批量删除)
         *
         * @param idList 主键ID列表或实体列表(不能为 null 以及 empty)
         */
        int deleteBatchIds(@Param(Constants.COLLECTION) Collection<?> idList);
    
        /**
         * 根据 ID 修改
         *
         * @param entity 实体对象
         */
        int updateById(@Param(Constants.ENTITY) T entity);
    
        /**
         * 根据 whereEntity 条件,更新记录
         *
         * @param entity        实体对象 (set 条件值,可以为 null)
         * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
         */
        int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
    
        /**
         * 根据 ID 查询
         *
         * @param id 主键ID
         */
        T selectById(Serializable id);
    
        /**
         * 查询(根据ID 批量查询)
         *
         * @param idList 主键ID列表(不能为 null 以及 empty)
         */
        List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
    
        /**
         * 查询(根据 columnMap 条件)
         *
         * @param columnMap 表字段 map 对象
         */
        List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    
        /**
         * 根据 entity 条件,查询一条记录
         * <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常</p>
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        default T selectOne(@Param(Constants.WRAPPER) 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");
                }
                return ts.get(0);
            }
            return null;
        }
    
        /**
         * 根据 Wrapper 条件,判断是否存在记录
         *
         * @param queryWrapper 实体对象封装操作类
         * @return
         */
        default boolean exists(Wrapper<T> queryWrapper) {
            Long count = this.selectCount(queryWrapper);
            return null != count && count > 0;
        }
    
        /**
         * 根据 Wrapper 条件,查询总记录数
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 entity 条件,查询全部记录
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录
         * <p>注意: 只返回第一个字段的值</p>
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 entity 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件
         * @param queryWrapper 实体对象封装操作类
         */
        <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
  • BaseMapper测试

    ...

mybatis-plus-sgg-01-11

简介 #

  • MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生
  • 这里以MySQL数据库为案例,以Idea作为IDE,使用Maven作为构建工具,使用SpringBoot完成各种功能
  • 课程主要内容 ly-20241212142149716
  • 特性 润物无声、效率至上、丰富功能
  • 支持的数据库 ly-20241212142149893
  • 框架结构 ly-20241212142149948
    • 左边:扫描实体,从实体抽取属性猜测数据库字段
    • 通过默认提供的方法使用sql语句,然后注入mybatis容器

开发环境 #

ly-20241212142150006

测试数据库和表 #

  • 这里创建数据库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');
    

Spring Boot工程 #

添加依赖,并install Lombok 插件


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/>
    </parent>
    <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>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
    </dependencies>

基础配置 #

  • 创建spring boot启动类

    ...