mybatis的插件配置还是十分重要,不管是进行sql增强,还是日志,异常处理都是很不错的选择,本文的示例对插入的数据进行参数增强;
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
}
sql 映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zszxz.plugin.mapper.OrderMapper">
<insert id="addOrder">
insert into `order` (
order_name
,create_time)
values (
#{order_name},
#{create_time}
)
</insert>
</mapper>
mapper接口
public interface OrderMapper {
int addOrder(Order order);
}
实现思路是实现Interceptor
接口,然后获取参数,对参数进行增强,在继续执行方法,最后将拦截器注入mybatis配置中
/**
* @Author lsc
* <p> mybatis 插件</p>
*/
@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() {
}
}
mybatis-config.xml 中添加插件配置,
<plugins>
<plugin interceptor="com.zszxz.plugin.config.AddPlugin">
<property name="somepropertis" value="propertes_value"/>
</plugin>
</plugins>