MybatisPlus
初始化
- 创建boot项目的时候导入mysql的依赖,创建好以后在里边导入MybatisPlus的坐标(这个坐标包含和mybatis的相关坐标和spring整合mybatis的相关坐标,所以自己不需要再导入这些坐标了)
CRUD操作
使用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
聚集函数的使用
适配问题
数据库字段名和实体类属性名不匹配的问题
实体类中的数据比数据表里边的数据多
设置某个字段不参与查询
表名和实体类名不匹配
-
使用@TableName("表名")
-
因为在LambdaQueryWrapper
里边的User MP就会认为这张表的名字就是user(应该是忽略大小写),但是如果表名和字段名不匹配, MP就不知道要查那张表了,所以需要在实体上边标明是查那张表
id生成策略
- 雪花算法
- 里边的时间戳和系统时间的算法是不一样的(可能不是同一个起点开始计算的)
- 机器码可以理解位计算机的mac地址
逻辑删除
- 逻辑删除就是为了避免直接删除数据造成的数据丢失,所以通过设置一个状态字段,装态字段为1表示这个数据已经删除了,为0表示这个数据还没被删除
- 在通过mybatisplus查询的时候逻辑删除的数据已经认为是被删除了,查询是无法查出来的,如果想要得到所有的数据需要自己手动写sql
- 数据库中有的字段实体类中没有是不会报错的,但是实体类中有的字段数据库中没有是会报错的,所以如果数据库中加了逻辑删除的字段,在一个项目中没有添加逻辑删除的功能,实体类还是原来的实体类,那么这个项目对这个数据表的增删改查是不受影响的
乐观锁
-
这个乐观锁在控制同时访问的请求数在2000个请求以下(左右)
-
就是在数据表中增加一个version字段,然后在实体类中对这个字段增加一个@Version注解,在配置类中增加OptimisticLockerInnerInterceptor的拦截器
-
然后在update的时候 设置version的值,这样MP在执行update操作的时候会判断给的version的值是否正确(如果不正确不会修改这个值),然后更新的时候会将这条数据的version+1
-
这样如果有两个人都想修改version的值,那么他们进来的时候获取的version会是相等的,这样只有一个人能修改,另一个是不能修改的,是需要重新进入才可以
代码生成器
-
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层的方法作为一个类,会混合使用