1.插件执行原理
一、demo
1.测试类
@Test public void test1() { String resource = "mybatis-config.xml"; InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.clearCache(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User selectUserById = mapper.selectUser(12); System.out.println(selectUserById); sqlSession.commit(); // 释放资源 sqlSession.close(); } catch (Exception e) { e.printStackTrace(); } }
2.plugin
对封装参数进行拦截
package plugin; import java.util.Properties; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; @Intercepts({ @Signature(type=StatementHandler.class ,method="parameterize",args=java.sql.Statement.class) }) public class ParamPlugin implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // TODO Auto-generated method stub System.out.println("interceptor开始:"); Object target = invocation.getTarget(); System.out.println("当前拦截目标对象:"+target); //拿到:StatementHandler==>parameterHandler==>parameterObject //拿到target的元数据 MetaObject metaObject = SystemMetaObject.forObject(target); System.out.println(metaObject); Object value = metaObject.getValue("parameterHandler.parameterObject"); System.out.println("sql语句的参数是:"+value); //修改sql语句的参数 metaObject.setValue("parameterHandler.parameterObject", 14); //执行目标方法并返回 return invocation.proceed(); } @Override public Object plugin(Object target) { // TODO Auto-generated method stub return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // TODO Auto-generated method stub } }
3.
<plugins> <plugin interceptor="plugin.ParamPlugin"></plugin> </plugins>
二、mybatis分页基于plugin实现原理
1.