要写一个mybatis的插件,我们大概分为以下三步
1.书写插件类,实现interceptor接口
2.书写插件的方法标签(为四大对象的哪个方法执行拦截操作)
3.在mybatis全局配置中配置我们书写的插件
案例
假设现在我们需要通过ID属性从数据库查询员工信息,我们通过自定义插件,使得每次查询的ID参数都被我们改为查询1号员工,实现偷梁换柱。
插件类
@Intercepts({
@Signature(type = StatementHandler.class,
method = "parameterize",
args = Statement.class)
})
public class MyPlugin implements Interceptor {
/**
* 真正的代理方法。。
* @param invocation
* @return
* @throws Throwable
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("插件真正起作用的方法");
Object target = invocation.getTarget();
MetaObject metaObject = SystemMetaObject.forObject(target);
Object oldValue = metaObject.getValue("parameterHandler.parameterObject");
System.out.println("原本方法执行的参数为:"+oldValue+",通过插件设置为 1 ");
metaObject.setValue("parameterHandler.parameterObject",1);
Object proceed = invocation.proceed();
return proceed;
}
/**
* 对四大对象进行包装
* @param o
* @return
*/
@Override
public Object plugin(Object o) {
System.out.println("即将进行包装的对象:"+o);
Object wrap = Plugin.wrap(o, this);
if (wrap != o){
System.out.println("对象类型匹配,包装成功!!");
}else{
System.out.println("对象类型不匹配,没有进行包装");
}
return wrap;
}
@Override
public void setProperties(Properties properties) {
System.out.println("读取到配置文件的properties");
System.out.println(properties);
}
}
配置文件
<plugins>
<plugin interceptor="com.openlab.plugns.MyPlugin">
<property name="username" value="rot"></property>
<property name="password" value="123123"></property>
</plugin>
</plugins>
测试代码
public static void main(String[] args) throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpById(222222);
System.out.println(emp);
sqlSession.close();
}
测试结果