mybatis-plus自动插入时间不写MetaObjectHandler类会怎么样
时间: 2024-08-14 10:09:57 浏览: 93
MyBatis-Plus是一个基于MyBatis的ORM框架增强工具,它提供了一些便捷的功能,如自动填充一些常用的字段,包括创建时间和更新时间等。如果不通过自定义`MetaObjectHandler`类来处理,当新增数据时,默认情况下,MyBatis-Plus会在插入操作时自动为这些字段设置当前的时间。
如果你不显式地配置MetaObjectHandler,MyBatis-Plus会使用内置的一些逻辑,比如`CommonMapper`和`CommonService`下的`insertWithBVO`方法,这些方法内部已经包含了对创建时间和最后修改时间的自动设置。
然而,如果你的应用有特定需求,比如希望在某些场景下控制这些时间的值,例如统一从服务器获取时间戳或者存储固定值,那么就需要自定义`MetaObjectHandler`来覆盖默认的行为。
相关问题
MyBatis-plus 自动填充MetaObjectHandler不生效问题
MyBatis-plus是一个优秀的持久层框架,它在MyBatis的基础上进行了扩展和增强。MetaObjectHandler是MyBatis-plus提供的一个接口,用于自动填充实体类中的字段值。但有时候我们可能会遇到MetaObjectHandler不生效的问题。
出现MetaObjectHandler不生效的问题可能有以下几个原因:
1. 没有正确配置MetaObjectHandler:在使用MyBatis-plus时,需要在配置文件中配置MetaObjectHandler的实现类,并将其注入到SqlSessionFactory中。确保配置正确,使得MyBatis-plus能够正确地识别和使用MetaObjectHandler。
2. 实体类没有使用@TableField注解:在需要自动填充的字段上,需要使用@TableField注解进行标记。确保实体类中需要自动填充的字段都使用了@TableField注,并设置了相应的属性值。
3. 字段名与列名不一致:如果实体类中的字段名与数据库表中的列名不一致,需要使用@TableField注解value属性指定数据库列名。确保字段名与数据库列名一致,以便MyBatis-plus能够正确地进行自动填充。
4. 数据库表没有设置默认值或触发器:如果需要自动填充的字段在数据库表中没有设置默认值或触发器,那么在插入或更新数据时,MetaObjectHandler也无法生效。确保数据库表中需要自动填充的字段设置了默认值或触发器。
如果以上几点都没有问题,但仍然遇到MetaObjectHandler不生效的问题,可以尝试检查MyBatis-plus的版本是否与其他依赖库存在冲突,或者查看日志文件以获取更多的错误信息。
mybatis-plus 自定义插入sql为什么没有自动填充id
Mybatis-Plus 自定义插入 SQL 时,如果需要自动填充 ID,需要注意以下几点:
1. 实体类中的 ID 字段必须使用 `@TableId` 注解标注,例如:
```java
@TableId(type = IdType.AUTO)
private Long id;
```
2. 在自定义 SQL 中,必须使用 Mybatis-Plus 提供的 `com.baomidou.mybatisplus.core.mapper.BaseMapper.insert()` 方法来执行插入操作,例如:
```xml
<insert id="customInsert" parameterType="com.example.demo.entity.User">
insert into user (name, age) values (#{name}, #{age})
</insert>
```
```java
public interface UserMapper extends BaseMapper<User> {
@Insert("${sql}")
int customInsert(@Param("sql") String sql);
}
```
```java
User user = new User();
user.setName("张三");
user.setAge(20);
String sql = "insert into user (name, age) values ('" + user.getName() + "', " + user.getAge() + ")";
userMapper.customInsert(sql); // 自定义插入 SQL
```
3. 如果还是无法自动填充 ID,可以检查一下 Mybatis-Plus 的全局配置,确保开启了自动填充功能,例如:
```java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
globalConfig.setSqlInjector(new MyLogicSqlInjector());
globalConfig.setDbConfig(new GlobalConfig.DbConfig().setDbType(DbType.MYSQL));
return globalConfig;
}
}
```
其中,`MyMetaObjectHandler` 是自定义的元对象处理器,用于填充自动填充字段的值,例如:
```java
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 自动填充 ID
if (metaObject.hasGetter("id") && metaObject.getValue("id") == null) {
this.strictInsertFill(metaObject, "id", Long.class, IdWorker.getId());
}
// 自动填充创建时间和更新时间
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
// 自动填充更新时间
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
```
阅读全文