对于实体中的 created_on 和 updated_on 来说, 它没有必要被开发人员去干预, 因为它已经足够说明使用场景了, 即在插入数据和更新数据时, 记录当前时间, 这对于 mybatis 来说, 通过拦截器是可以实现的, 记得之前说过在 jpa 中实现的方法, 主要通过 jpa 的注解实现的, 因为今天的 mybatis 需要用到 java 的拦截器.
定义两个注解
- @Retention(RetentionPolicy.RUNTIME)
- @Target( {ElementType.FIELD})
- public @interface CreatedOnFuncation {
- String value() default "";
- }
- @Retention(RetentionPolicy.RUNTIME)
- @Target( {ElementType.FIELD})
- public @interface UpdatedOnFuncation {
- String value() default "";
- }
使用这两个注解
- @Getter
- @Builder(toBuilder = true)
- @ToString
- public class UserInfo {
- private Long id;
- private String name;
- private String email;
- @CreatedOnFuncation
- private LocalDateTime createdOn;
- @UpdatedOnFuncation
- private LocalDateTime updatedOn;
- }
定义拦截器, 重写赋值的语句
- package com.lind.basic.mybatis;
- import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
- import java.lang.reflect.Field;
- import java.time.LocalDateTime;
- import java.util.Properties;
- import lombok.Data;
- import lombok.EqualsAndHashCode;
- import lombok.experimental.Accessors;
- import org.apache.ibatis.logging.Log;
- import org.apache.ibatis.logging.LogFactory;
- import org.apache.ibatis.mapping.MappedStatement;
- import org.apache.ibatis.mapping.SqlCommandType;
- import org.apache.ibatis.plugin.Interceptor;
- import org.apache.ibatis.plugin.Intercepts;
- import org.apache.ibatis.plugin.Invocation;
- import org.apache.ibatis.plugin.Plugin;
- import org.apache.ibatis.plugin.Signature;
- /**
- * 时间拦截器.
- */
- @EqualsAndHashCode(callSuper = true)
- @Data
- @Accessors(chain = true)
- @Intercepts( {
- @Signature(
- type = org.apache.ibatis.executor.Executor.class,
- method = "update",
- args = {MappedStatement.class, Object.class})})
- public class CreateUpdateTimeInterceptor extends AbstractSqlParserHandler implements Interceptor {
- private static final Log logger = LogFactory.getLog(com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor.class);
- private Properties properties;
- @Override
- public Object intercept(Invocation invocation) throws Throwable {
- MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
- // 获取 SQL 命令
- SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
- // 获取参数
- Object parameter = invocation.getArgs()[1];
- // 获取私有成员变量
- Field[] declaredFields = parameter.getClass().getDeclaredFields();
- for (Field field : declaredFields) {
- if (field.getAnnotation(CreatedOnFuncation.class) != null) {
- if (SqlCommandType.INSERT.equals(sqlCommandType)) { // insert 语句插入 createTime
- field.setAccessible(true);
- field.set(parameter, LocalDateTime.now());
- }
- }
- if (field.getAnnotation(UpdatedOnFuncation.class) != null) { // insert 或 update 语句插入 updateTime
- if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) {
- field.setAccessible(true);
- field.set(parameter, LocalDateTime.now());
- }
- }
- }
- return invocation.proceed();
- }
- @Override
- public Object plugin(Object target) {
- if (target instanceof org.apache.ibatis.executor.Executor) {
- return Plugin.wrap(target, this);
- }
- return target;
- }
- @Override
- public void setProperties(Properties prop) {
- this.properties = prop;
- }
- }
添加测试用例
- @Test
- public void insert() {
- UserInfo userInfo = UserInfo.builder()
- .name("lind")
- .email("test@sina.com")
- .build();
- userInfoMapper.insert(userInfo);
- System.out.println("userinfo:" + userInfo.toString());
- }
解决是我们所预想的, created_on 和 updated_on 被自动赋上值了.
- userinfo:UserInfo
- (
- id=1085780948955959297,
- name=lind,
- email=test@sina.com,
- createdOn=2019-01-17T14:08:45.665,
- updatedOn=2019-01-17T14:08:45.665
- )
来源: http://www.bubuko.com/infodetail-2923971.html