一 前言
mybatis的插件配置还是十分重要,不管是进行sql增强,还是日志,异常处理都是很不错的选择,本文的示例对插入的数据进行参数增强;
二 mybatis插件实现
2.1 建表语句
CREATE TABLE `order` (
`id` int(11) NOT NULL COMMENT '订单编号',
`order_name` varchar(255) DEFAULT NULL COMMENT '订单名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
实体
public class Order {
// 主键
private Long id;
// 订单名称
private String order_name;
// 创建时间
private LocalDateTime create_time;
// 省略set get
}
2.2 mapper
sql 映射文件
/p>
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
insert into `order` (
order_name
,create_time)
values (
#{order_name},
#{create_time}
)
mapper接口
public interface OrderMapper {
int addOrder(Order order);
}
2.3 plugin
实现思路是实现Interceptor接口,然后获取参数,对参数进行增强,在继续执行方法,最后将拦截器注入mybatis配置中
/**
* @Author lsc
*
mybatis 插件
*/
@Intercepts({ @Signature(type = Executor.class, method = "update"
, args = { MappedStatement.class, Object.class}) })
public class AddPlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
String sqlId = mappedStatement.getId();
// 参数-此时为order 对象
Object parameter = invocation.getArgs()[1];
// 参数:com.zszxz.plugin.entity.Order@48503868
System.out.print("参数:"+parameter);
// 拦截参数,对参数进行增强
Order order = (Order) parameter;
order.setCreate_time(LocalDateTime.now());
// 此时插入数据库,会有时间插入
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target,this);
}
public void setProperties(Properties properties) {
}
}
@Signature是签名,为一个数组,可以在同一个拦截器里面拦截不同的方法参数;
method中可以指定query表示查询,update表示增删改;具体的方法看拦截接口提供的方法;
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
除了type除了对Executor 进行拦截还能对下面的接口进行拦截:拦截参数的处理ParameterHandler (getParameterObject, setParameters)
拦截结果集的处理ResultSetHandler (handleResultSets, handleOutputParameters)
预编译处理StatementHandler (prepare, parameterize, batch, update, query)
mappedStatement.getSqlCommandType();可以获得执行语句的类型通常进行判断时很有用
public enum SqlCommandType {
UNKNOWN,
INSERT,
UPDATE,
DELETE,
SELECT,
FLUSH;
private SqlCommandType() {
}
}
2.4 配置
mybatis-config.xml 中添加插件配置,
源码在知识追寻者专栏说明,或者公主号有源码链接;