常用配置项介绍
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