String roadName) {
Page roadPage = new Page<>(current, size);
LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda();
queryWrapper.like(StringUtils.isNotBlank(roadName), Road::getRoadName, roadName);
Page pageList = roadService.page(roadPage, queryWrapper);
return Response.ok(pageList);
}
=============================================================================
- 首先,实现元对象处理器接口:
com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) { // Mapper调用insert操作时,进行如下操作
log.info(“start insert fill …”); // 给entity的属性设置值
this.strictInsertFill(metaObject, “createTime”, () -> LocalDateTime.now(), LocalDateTime.class);
this.strictInsertFill(metaObject, “operator”, String.class, “张三”);
}
@Override
public void updateFill(MetaObject metaObject) {// Mapper调用update操作时,进行如下操作
log.info(“start update fill …”); // 给entity的属性设置值
this.strictUpdateFill(metaObject, “updateTime”, () -> LocalDateTime.now(), LocalDateTime.class);
this.strictUpdateFill(metaObject, “operator”, String.class, “张三”);
}
}
MetaObjectHandler
提供的默认方法的策略均为:
- 如果属性有值则不覆盖。
- 如果填充值为
null
则不填充。
- 其次,给相应实体类设置注解
注解:指定该属性在对应情况下必有值,如果无值则入库会是
null
字段必须声明
TableField
注解,属性fill
选择对应策略,该声明告知Mybatis-Plus
需要预留注入SQL
字段
原理:判断注入的 insert 和 update 的 sql 脚本是否在对应情况下忽略掉字段的 if 标签生成
…
@Data
@EqualsAndHashCode(callSuper = false)
public class Stake implements Serializable {
private Long roadId;
private String stakeName;
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String operator;
}
整体原理
-
当发生
insert
或者update
的sql脚本时候 -
看下当前发生相关sql 的实体中相应字段的注解
-
注解
FieldFill.INSERT
,即动态添加<if test="...">......</if>
insert相关字段 -
注解
FieldFill.UPDATE
,即动态添加<if test="...">......</if>
update相关字段 -
注解
FieldFill.UPDATE
,即动态添加<if test="...">......</if>
insert和update相关字段
================================================================
类型处理器,用于 JavaType 与 JdbcType 之间的转换,用于 PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一个值,本文讲解 mybaits-plus
内置常用类型处理器如何通过TableField
注解快速注入到 mybatis
容器中。
如果报xml中五自定义handler的错误,把xml删除,或者在xml中也配置上
@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
private Long id;
/**
-
注意!! 必须开启映射注解
-
@TableName(autoResultMap = true)
-
以下两种类型处理器,二选一 也可以同时存在
-
注意!!选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包
*/
@TableField(typeHandler = JacksonTypeHandler.class)
// @TableField(typeHandler = FastjsonTypeHandler.class)
private OtherInfo otherInfo;
}
该注解对应了 XML 中写法为
可以看我的另一篇很详细 从零搭建开发脚手架 mybatis自定义字段类型 以Mysql空间数据存储为例
@Data
@EqualsAndHashCode(callSuper = false)
@TableName( autoResultMap = true)
public class ServiceArea implements Serializable {
@TableId(value = “id”, type = IdType.AUTO)
private Integer id;
/**
- 经纬度 格式:X,Y
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private double[] location;
@TableField(typeHandler = GeoPointTypeHandler.class)
private GeoPoint coordinate;
}
=======================