使用Mybatis自定义插件(统一去除时间字段后面的.0)

10 篇文章 0 订阅
1 篇文章 0 订阅

今天,日月教大家如何使用mybatis自定义插件实现统一去除从数据库查询出的时间字段后面遗留的.0。
话不多说,直接上代码。

定义插件

import com.chenqi.util.CheckUtils;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * @Author chenqi
 * @Description mybatis 自定义插件(统一去除时间后面的.0)
 * @Date 17:48 2019/5/25
 **/
@Intercepts({@Signature(
        type= ResultSetHandler.class,
        method = "handleResultSets",
        args = {Statement.class})})
public class DateTimeInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object result = invocation.proceed();
        if (result instanceof ArrayList<?>) {
            List<?> list = (ArrayList<?>)result;
            for(Object obj: list){
                if(obj == null || obj instanceof Integer
                        || obj instanceof String
                        || obj instanceof Long
                        || obj instanceof Double
                        || obj instanceof Date
                        || obj instanceof BigDecimal){
                    continue;
                }

                for (Field field : obj.getClass().getDeclaredFields()) {
                    if(field.getName().indexOf("Time") != -1
                            && "class java.lang.String".equals(field.getType().toString())){
                        Object value = getFieldValueByName(field.getName(),obj);
                        String time = CheckUtils.objCheckNull(value) ? "" : value.toString();
                        if(!CheckUtils.strCheckNull(time)){
                            field.setAccessible(true);
                            field.set(obj, time.split("\\.")[0]);
                        }
                    }
                }
            }
        }
        return result;
    }

    /**
     * 根据属性名获取属性值
     * */
    private Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[] {});
            Object value = method.invoke(o, new Object[] {});
            return value;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }

}

使用示例

只需要将该类使用@Bean注解注入到spring容器即可

/**
 * 时间字段处理插件
 *
 * */
@Bean
public DateTimeInterceptor dateTimeInterceptor() {
    return new DateTimeInterceptor();
}

实现思路

1、首先通过实现mybatis的Interceptor接口,获取到所有查询sql的返回结果。
2、通过instanceof加循环筛选得到需要处理的时间属性。(注意时间属性需包含Time字符串)
3、通过java反射机制获得属性名称、属性类型、属性值,并使用Field 类对属性值进行修改并重新赋值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值