MyBatis可编写哪几类插件---如何编写插件呢?
下文笔者讲述Mybatis插件的简介说明,如下所示
自定义一个插件
Mybatis插件简介
Mybatis插件是用于增强Mybatis功能 增强本质是使用底层动态代理的方式,使Mybatis的功能变强 Mybatis用于插件扩展的四大组件: Executor、StatementHandler、ParameterHandler、ResultSetHandler 执行器 Executor(update、query、commit、rollback 等方法) SQL语法构建器 StatementHandler(prepare、parameterize、batch、update、query 等方法) 参数处理器 ParameterHandler(getParameterObject、setParameters 方法) 结果集处理器 ResultSetHandler(handleResultSets、handleOutputParameters 等方法) Mybatis插件的实现思路: 1.实现Mybatis的Interceptor接口并重写intercept()方法 2.给插件编写注解 3.指定要拦截哪一个接口的哪些方法即可 4.在配置文件中配置你编写的插件例:
自定义一个插件
@Intercepts(@Signature( type = StatementHandler.class, // 这是指拦截哪个接口 method = "prepare", // 这个接口内的哪个方法名,不要拼错了 args = {Connection.class,Integer.class} // 这是拦截的方法的入参,按顺序写到这,不要多也不要少,如果方法重载,可是要通过方法名和入参来确定唯一的 )) public class MyPlugin implements Interceptor { private final Logger logger = LoggerFactory.getLogger(this.getClass()); // 这里是每次执行操作的时候,都会进行这个拦截器的方法内 @Override public Object intercept(Invocation invocation) throws Throwable { // 增强逻辑 System.out.println("增强了参数功能。。"); // 执行原方法 return invocation.proceed(); } /** * 主要是为了把这个拦截器生成一个代理放到拦截器链中。 * @Description 包装目标对象,为目标对象创建代理对象。 * @Param target 为要拦截的对象 * @Return 代理对象 */ @Override public Object plugin(Object target) { System.out.println("将要包装的目标对象:"+target); return Plugin.wrap(target,this); } /** 获取配置文件的属性 **/ // 插件初始化的时候调用,也只调用一次,插件配置的属性从这里设置进来 @Override public void setProperties(Properties properties) { System.out.println("插件配置的初始化参数:"+properties); } } 2.相关配置 sqlMapConfig.xml <plugins> <plugin interceptor="com.java265.plugin.MySqlPagingPlugin"> <!--配置参数--> <property name="name" value="test-Java265"/> </plugin> </plugins> 3.mapper 接口 public interface UserMapper { list<User> selectUser(); } 4。mapper.xml 配置 <mapper namespace="com.lagou.mapper.UserMapper"> <select id="selectUser" resultType="com.lagou.pojo.User"> select id,username from user </select> </mapper> 5.测试类代码 public class PluginTest { @Test public void test() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> pagesTest = userMapper.selectUser(); for (User user : pagesTest) { System.out.println(user); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。