mybatis插件配置(6)

x33g5p2x  于2021-08-23 转载在 Java  
字(2.5k)|赞(0)|评价(0)|浏览(169)

一 前言

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 映射文件

<?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);
}

2.3 plugin

实现思路是实现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() {
    }
}

2.4 配置

mybatis-config.xml 中添加插件配置,

	<plugins>
        <plugin interceptor="com.zszxz.plugin.config.AddPlugin">
            <property name="somepropertis" value="propertes_value"/>
        </plugin>
    </plugins>

相关文章

微信公众号

最新文章

更多