1、拦截器
package plugin;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.session.ResultHandler;
import java.sql.Statement;
import java.util.Properties;
/**
* 配置拦截的类方法
*/
@Intercepts(
@Signature(type = StatementHandler.class,method = "query",args = {Statement.class, ResultHandler.class})
)
/**
* 实现 Interceptor 接口
*/
public class MyPlugin implements Interceptor {
/**
* 拦截
* @param invocation
* @return
* @throws Throwable
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("MyPlugin:intercept********************************************");
Object target = invocation.getTarget();
MetaObject metaObject = SystemMetaObject.forObject(target);
//获取传入参数
System.out.println("value:"+metaObject.getValue("parameterHandler.parameterObject"));
//修改传入参数
metaObject.setValue("parameterHandler.parameterObject","d");
System.out.println("value:"+metaObject.getValue("parameterHandler.parameterObject"));
//通过反射执行拦截的方法
Object proceed = invocation.proceed();
return proceed;
}
@Override
public Object plugin(Object target) {
System.out.println("MyPlugin:plugin********************************************"+target);
Object wrap = Plugin.wrap(target,this);
return wrap;
}
@Override
public void setProperties(Properties properties) {
System.out.println("MyPlugin:setProperties********************************************"+properties);
System.out.println(properties.getProperty("property1")+":"+properties.get("property1"));
System.out.println(properties.getProperty("property2")+":"+properties.get("property2"));
}
}
2、配置拦截器
<plugins>
<plugin interceptor="plugin.MyPlugin">
<property name="property1" value="myplugin1"/>
<property name="property2" value="myplugin2"/>
</plugin>
</plugins>
3、Mapper,xml
<select id="queryOne" resultMap="sexc" parameterType="User">
<bind name="qphone" value="'%'+phone+'%'"/>
select id,sex,phone,cn from userinfo where phone like #{qphone}
</select>
4、Mapper接口
package mapperdao;
import entity.User;
import java.util.List;
public interface PersonMapper {
List<User> queryOne(String phone);
}
5、测试
public static void queryOne(SqlSession sqlSession, PersonMapper mapper) {
try {
List<User> users = mapper.queryOne("c");
for (User user1 : users) {
System.out.println(user1.getCn());
}
} catch (Exception e) {
e.printStackTrace();
}
}
6、输出
MyPlugin:setProperties********************************************{property2=myplugin2, property1=myplugin1}
myplugin1:myplugin1
myplugin2:myplugin2
MyPlugin:plugin********************************************org.apache.ibatis.executor.CachingExecutor@683dbc2c
MyPlugin:plugin********************************************org.apache.ibatis.scripting.defaults.DefaultParameterHandler@51f116b8
MyPlugin:plugin********************************************org.apache.ibatis.executor.resultset.DefaultResultSetHandler@4d910fd6
MyPlugin:plugin********************************************org.apache.ibatis.executor.statement.RoutingStatementHandler@7690781
MyPlugin:intercept********************************************
value:c
value:d
1、先执行public void setProperties(Properties properties)
2、再执行public Object plugin(Object target)
3、最后执行public Object intercept(Invocation invocation)