Mybatis-Plus基本操作
Mybatis-Plus基本操作

Mybatis-Plus基本操作

常用配置项介绍

application.yml示例:
mybatis-plus:
  configuration:
    #使用日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
   #配置类型别名(mapper.xml中的resultType)所对应的包,
   #省去xml每次都指定完整的类名,类名及类型名
   type-aliases-package: <你的实体类路径(entity/pojo?)>
   #指定Mapper XML文件的扫描路径
   mybatis-plus.mapper-locations=classpath*:mapper/**/*.xml

常用注解

@TableId

映射(value)主键和对ID的生成方式管理,示例:
public class User {
    @TableId(value = "num" , type = IdType.[AUTO/INPUT/ASSIGN_ID/ASSIGN_UUID])
    private Integer id;
    private String username;
    private String password;
}
↑↑↑↑type不指定值时,默认生成的主键ID是基于雪花算法生成的↑↑↑↑
type:指定主键生成策略,优先级大于数据库设置的自增
 .AUTO:自动赋值,默认数据库自增
 .INPUT:手动赋值,若未赋值则数据库会通过自增方式赋值
 .ASSIGN_ID:自动赋值,数字类型或者数字形式的字符串,基于雪花算法
 .ASSIGN_UUID:自动赋值,String类型,自动生成UUID(数字字母组合)进行赋值

@TableName、@TableField

分别是映射数据库表、映射非主键字段,示例:
@TableName(value = "player")
public class User {
    private Integer id;
    @TableField(value = "Account" , exist = false)
    private String username;
    @TableField(select = false)
    private String password;
}
value:指定表/字段名
exist:是否为数据库字段,默认true
select:是否查询此字段,默认true

@Version(乐观锁)

标识乐观锁版本号字段,示例(Economy.java):
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "economy")
public class Economy {
    @TableId("player_id")
    private BigInteger playerId;
    private BigDecimal balance;
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime lastTransactionTime;
    @Version
    private Integer version;
}
添加乐观锁插件,示例(MybatisPlusConfig.java):
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

@TableLogic

标识该字段为逻辑删除字段,示例:
@TableLogic(value="原值",delval="改值") | value = "未删除的值,默认值为0",delval = "删除后的值,默认值为1",即为0时标识未删除,为1时表示已删除,查询时会过滤
当使用了此注解,调用update方法修改该字段的值时,不会将该字段放入修改字段中,而是在条件字段中where条件后

分页插件

在Mybatis-plus 3.5.9+版本后,分页插件被处理拆分,请在pom.xml中添加:
<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-jsqlparser</artifactId>
   <version>确保版本和 MyBatis Plus 主包一致</version> 
</dependency>
添加分页拦截器:
@Configuration
public class MybatisPlusConfig {
 @Bean
 public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new
PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
     }
}
测试用例:
@Test
 public void testPage(){
      LambdaQueryWrapper<Player> queryWrapper = new LambdaQueryWrapper<>();
      queryWrapper.like(Player::getUsername,"R");
      //Page,of(当前页码,每页显示数量)
      IPage<Player> page = playerService.page(Page.of(1,1),queryWrapper);  
      List<Player> records = page.getRecords();
      System.out.println(records);
 }

自动填充

自动填充工具类(MyMetaObjectHandler.java)示例:
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始插入填充...");
        this.strictInsertFill(metaObject,"createdAt", LocalDateTime.class,LocalDateTime.now());
        this.strictInsertFill(metaObject,"updatedAt",LocalDateTime.class,LocalDateTime.now());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新填充...");
        this.strictUpdateFill(metaObject,"updatedAt",LocalDateTime.class,LocalDateTime.now());
        this.strictUpdateFill(metaObject,"lastTransactionTime",LocalDateTime.class,LocalDateTime.now());
    }
}
标记需字段填充的字段示例:
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "player")
public class Player {
    @TableId(value = "id",type = IdType.AUTO)
    private BigInteger id;
    @TableField(value = "uuid")
    private String uuid;
    private String username;
    private String passwordHash;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
}

接入多数据源

在pom.xml中引入依赖:
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
  <version>${version}</version>
</dependency>

多数据源常用注解

@DS(value = "DBName") //指定所操作的数据库,也可用来切换数据源
-------------------------------------------------
@Service
@DS("slave")
public class UserServiceImpl implements UserService {
  @Autowired
  private JdbcTemplate jdbcTemplate;
  @Override
  @DS("slave_1")
  public List selectByCondition() {
    return jdbcTemplate.queryForList("select * from user where age >10");
  }
}
application.yml配置数据源:
spring:
 datasource:
   dynamic:
     #主数据源名,默认为master
     primary: master
     #是否严格匹配数据源,默认false
     #true:未匹配到数据源时抛出异常,false:使用默认数据源(master)
     strict: false
     datasource:
       #主数据源节点
       master:
         url: jdbc:mysql://yourIpAddress:port/dynamic
         username: root
         password: 123456
         driver-class-name: com.mysql.jdbc.Driver
       #从数据源节点
       slave_1:
         url: jdbc:mysql://yourIpAddress:port//dynamic
         username: root
         password: 123456
         driver-class-name: com.mysql.jdbc.Driver

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注