MybatisPlus学习笔记

发布时间 2023-03-22 21:13:23作者: better_tomorrow

MybatisPlus

初始化

  • 创建boot项目的时候导入mysql的依赖,创建好以后在里边导入MybatisPlus的坐标(这个坐标包含和mybatis的相关坐标和spring整合mybatis的相关坐标,所以自己不需要再导入这些坐标了)

CRUD操作

  • image-20220821094924682

使用lombok简化实体类的书写

  •     <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    
  • 在实体类上边加上可以不用写相关方法的重写方法

    • @Data // TODO Data的注解相当于@Setter @Getter @ToString @EqualsAndHashCode这四个注解合起来
      @NoArgsConstructor
      @AllArgsConstructor
      

打印MybatisPlus的日志信息(里边有sql语句)

  • # TODO 在这里添加mybatisplus的配置属性,可以在控制台打印mybatis的日志(里边包括sql)
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    

聚集函数的使用

适配问题

数据库字段名和实体类属性名不匹配的问题

  • image-20220821204041204

实体类中的数据比数据表里边的数据多

  • image-20220821204241630

设置某个字段不参与查询

  • image-20220821204427002

表名和实体类名不匹配

  • 使用@TableName("表名")

  • 因为在LambdaQueryWrapper里边的User MP就会认为这张表的名字就是user(应该是忽略大小写),但是如果表名和字段名不匹配, MP就不知道要查那张表了,所以需要在实体上边标明是查那张表

  • image-20220821204544458

id生成策略

  • image-20220821233208872
  • 雪花算法
    • 里边的时间戳和系统时间的算法是不一样的(可能不是同一个起点开始计算的)
    • 机器码可以理解位计算机的mac地址
    • image-20220821234936467

逻辑删除

  • 逻辑删除就是为了避免直接删除数据造成的数据丢失,所以通过设置一个状态字段,装态字段为1表示这个数据已经删除了,为0表示这个数据还没被删除
  • 在通过mybatisplus查询的时候逻辑删除的数据已经认为是被删除了,查询是无法查出来的,如果想要得到所有的数据需要自己手动写sql
  • 数据库中有的字段实体类中没有是不会报错的,但是实体类中有的字段数据库中没有是会报错的,所以如果数据库中加了逻辑删除的字段,在一个项目中没有添加逻辑删除的功能,实体类还是原来的实体类,那么这个项目对这个数据表的增删改查是不受影响的
  • image-20220822001352899

乐观锁

  • 这个乐观锁在控制同时访问的请求数在2000个请求以下(左右)

  • 就是在数据表中增加一个version字段,然后在实体类中对这个字段增加一个@Version注解,在配置类中增加OptimisticLockerInnerInterceptor的拦截器

  • 然后在update的时候 设置version的值,这样MP在执行update操作的时候会判断给的version的值是否正确(如果不正确不会修改这个值),然后更新的时候会将这条数据的version+1

  • 这样如果有两个人都想修改version的值,那么他们进来的时候获取的version会是相等的,这样只有一个人能修改,另一个是不能修改的,是需要重新进入才可以

  • image-20220823212010717

代码生成器

  • package com.li;
    
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.GlobalConfig;
    import com.baomidou.mybatisplus.generator.config.PackageConfig;
    import com.baomidou.mybatisplus.generator.config.StrategyConfig;
    
    import javax.sql.DataSource;
    
    /**
     * @projectName: MybatisPlus
     * @package: com.li
     * @className: Generator
     * @author: YiFan
     * @description: TODO
     * @date: 2022/8/23 21:45
     */
    public class Generator {
        public static void main(String[] args) {
            AutoGenerator autoGenerator = new AutoGenerator();
    //        todo 配置数据源
            DataSourceConfig dataSource = new DataSourceConfig();
            dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
            dataSource.setUsername("root");
            dataSource.setPassword("123456");
            autoGenerator.setDataSource(dataSource);
    //        todo 设置全局配置
            GlobalConfig globalConfig = new GlobalConfig();
    //        设置代码生成位置
            globalConfig.setOutputDir(System.getProperty("user.dir")+"\\MybatisPlusGenerator\\src\\main\\java");
    //        设置生成后是否打开代码所在目录
            globalConfig.setOpen(false);
    //        设置作者
            globalConfig.setAuthor("YiFan");
    //        设置是否覆盖原始生成的文件
            globalConfig.setFileOverride(true);
    //        设置数据层接口名,%s为占位符,指代模块名称
            globalConfig.setMapperName("%sDao");
    //        设置Id生成策略
            globalConfig.setIdType(IdType.ASSIGN_ID);
            autoGenerator.setGlobalConfig(globalConfig);
    
    //        todo 设置包名相关配置
            PackageConfig packageInfo = new PackageConfig();
    //        设置生成文件是在那个包下的
            packageInfo.setParent("com.li");
    //        设置实体类所在包的名称,默认会设置成entity
            packageInfo.setEntity("domain");
    //        设置数据层包的名称,默认是mapper
            packageInfo.setMapper("dao");
            autoGenerator.setPackageInfo(packageInfo);
    
    //        todo 策略配置
            StrategyConfig strategyConfig = new StrategyConfig();
    //        设置生成的表名,是可变参数,可以设置多个表(如果不设置默认生成所有的表)
            strategyConfig.setInclude("tbl_user");
    //        设置表名的通用前缀,这样在通过表名设置对应的名称的时候会吧这个前缀去掉
            strategyConfig.setTablePrefix("tbl_");
    //        设置是否启用Rest风格
            strategyConfig.setRestControllerStyle(true);
    //        设置乐观锁字段名
            strategyConfig.setVersionFieldName("version");
    //        设置逻辑删除字段名
            strategyConfig.setLogicDeleteFieldName("deleted");
    //        设置是否启用lombok
            strategyConfig.setEntityLombokModel(true);
            autoGenerator.setStrategy(strategyConfig);
    
            autoGenerator.execute();
        }
    }
    
    
  • 这样生成的service方法继承了baseService,将dao测基础方法都弄过来了,但是一般不会用,因为在service层一般不会单独调用dao层的方法作为一个类,会混合使用