今天,日月教大家如何使用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 类对属性值进行修改并重新赋值。