Mybatis-plus

Mybatis-plus pojo注解

  1. @TableName("") //指定表名
  2. @TableId("") //指定主键名 value = "指定主键"; type = "主键生成策略"
  3. //type : 例 : 雪花算法
  4. //如果使用 ATUO , 确保数据库中主键设置自增
  5. @TableField("") //指定列名
  6. @TableLogic //指定为逻辑删除列表
  7. @EnumValue //放在enum类中 指定数据
  8. @Version //乐观锁, 指定为该数据为乐观锁列
  9. @DS("") //指定数据源 , 多数据源使用, 在impl上使用, 也可以写在方法上

Mybatis-plus application

  1. mybatis-plus:
  2. configuration:
  3. #设置myabtis日志类型
  4. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  5. #设置mybatis-plus的全局配置
  6. global-config:
  7. db-config:
  8. #设置实体类所对应的表的统一前缀
  9. table-prefix: t_
  10. #设置统一的主键生成策略
  11. id-type: assign_id

Mybatis-plus 构造器

Wapper 构造器

  • Wrapper : 条件构造抽象类, 最顶端父类
    • AbstractWrapper : 用于查询条件封装, 生成 sql 的 where 条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda语法
        • LambdaQueryWrapper : 用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper

构造器是链式编程 Query是非常贴合SQL语法的

  1. //示例
  2. @Test
  3. public void test01(){
  4. //查询用户名包含a, 年龄在20到30之间, 邮箱信息不为null的用户信息
  5. //SELECT uid AS id,user_name AS name,age,email,is_delete FROM t_user WHERE is_delete=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
  6. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  7. queryWrapper
  8. .like("user_name", "a")
  9. .between("age", 20, 30)
  10. .isNotNull("email");
  11. List<User> users = userMapper.selectList(queryWrapper);
  12. users.forEach(System.out::println);
  13. }

插件

MyBatis-Plus自带分页插件, 只要简单的配置即可实现分页功能

分页

MyBatisPlus分页配置
  1. @Configuration
  2. @MapperScan("com.xiao.mybatisplus.mapper")
  3. public class MyBatisPlusConfig {
  4. @Bean
  5. public MybatisPlusInterceptor mybatisPlusInterceptor(){
  6. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  7. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  8. return interceptor;
  9. }
  10. }
  1. /**
  2. * 通过年龄查询用户信息并分页
  3. * @param page mybatisPlus 所提供的分页对象, 必须位于第一个参数
  4. * @param age
  5. * @return
  6. */
  7. Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
  1. //插件方法
  2. Page<User> userPage = new Page<>(page,size);
  3. Page<User> users = userMapper.selectPageVo(userPage, 20);
  4. System.out.println("内容:"+users.getRecords());
  5. System.out.println("总页数"+users.getPages());
  6. System.out.println("总条数"+users.getTotal());
  7. System.out.println("是否有下一页"+users.hasNext());
  8. System.out.println("是否有上一页"+users.hasPrevious());

乐观锁和悲观锁

概念: 在每次修改表时, version列会加1 , 修改一次加一次

详情: https://baomidou.com/pages/0d93c0/#_1-配置插件

SpringBoot配置
  1. @Bean
  2. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  3. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  4. interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  5. return interceptor;
  6. }

在实体类的字段上加上@Version注解乐观锁
  1. @Version
  2. private Integer version;

通用枚举

  1. mybatis-plus:
  2. #扫描通用枚举
  3. type-enums-package: com/xiao/mybatisplus/enums
  1. @Getter
  2. public enum SexEnum {
  3. MALE(1,"男"),
  4. FEMALE(2,"女");
  5. @EnumValue //将注解所标识的属性的值储存到数据库中
  6. private Integer sex;
  7. private String sexName;
  8. SexEnum(Integer sex, String sexName) {
  9. this.sex = sex;
  10. this.sexName = sexName;
  11. }
  12. }

代码生成器

注: 不好用

详细: https://baomidou.com/pages/779a6e/#使用

  1. 引入依赖
  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-generator</artifactId>
  4. <version>3.5.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.freemarker</groupId>
  8. <artifactId>freemarker</artifactId>
  9. <version>2.3.31</version>
  10. </dependency>
  1. 快速生成 直接Run
  1. public static void main(String[] args) {
  2. FastAutoGenerator.create("url", "username", "password")
  3. .globalConfig(builder -> {
  4. builder.author("baomidou") // 设置作者
  5. .enableSwagger() // 开启 swagger 模式
  6. .fileOverride() // 覆盖已生成文件
  7. .outputDir("D://"); // 指定输出目录
  8. })
  9. .packageConfig(builder -> {
  10. builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
  11. .moduleName("system") // 设置父包模块名
  12. .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")); // 设置mapperXml生成路径
  13. })
  14. .strategyConfig(builder -> {
  15. builder.addInclude("t_simple") // 设置需要生成的表名
  16. .addTablePrefix("t_", "c_"); // 设置过滤表前缀
  17. })
  18. .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
  19. .execute();
  20. }

多数据源

适用场景: 纯粹多库, 读写分离, 一主多从, 混合模式等

场景说明: 我们创建两个库,分别为:mybatis_plus(以前的库不动)与mybatis_plus_1(新建),将 mybatis_plus库的product表移动到mybatis_plus_1库,这样每个库一张表,通过一个测试用例 分别获取用户数据与商品数据,如果获取到说明多库模拟成功

引入依赖

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  4. <version>3.5.0</version>
  5. </dependency>

配置多数据源

  1. spring:
  2. # 配置数据源信息
  3. datasource:
  4. dynamic:
  5. # 设置默认的数据源或者数据源组,默认值即为master
  6. primary: master
  7. # 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
  8. strict: false
  9. datasource:
  10. master:
  11. url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
  12. driver-class-name: com.mysql.cj.jdbc.Driver
  13. username: root
  14. password: 123456
  15. slave_1:
  16. url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
  17. driver-class-name: com.mysql.cj.jdbc.Driver
  18. username: root
  19. password: 123456

指定数据源

  1. @DS("master") //指定所操作的数据源
  2. @Service
  3. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements
  4. UserService {
  5. }

MybatisX插件

代码生成: idea 连接 数据源, 右键数据库, 快速生成crud

代码提示: 在mapper接口 输入方法名, 快速impl生成xml语法 (yyds)