mybatis插件扩展
mybatis只能在这四个点扩展
1.Executor
2.StatementHandler
3.ParameterHandler
4.ResultSetHandler
示例代理StatementHandler对象的prepare方法
public class PageInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
return null;
}
@Override
public Object plugin(Object target) {
if (target instanceof StatementHandler){
return Proxy.newProxyInstance(
PageInterceptor.class.getClassLoader(),
new Class[]{StatementHandler.class},
new PageHandler((StatementHandler) target));
}
return target;
}
@Override
public void setProperties(Properties properties) {
}
private class PageHandler implements InvocationHandler{
StatementHandler statementHandler;
public PageHandler(StatementHandler statementHandler) {
this.statementHandler = statementHandler;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equalsIgnoreCase("prepare")){
setParametersProxy();
}
return method.invoke(statementHandler,args);
}
private void setParametersProxy() throws NoSuchFieldException, IllegalAccessException {
appendPageSql(((Page)statementHandler.getBoundSql()
.getParameterObject()));
}
private void appendPageSql(Page page) throws NoSuchFieldException, IllegalAccessException {
BoundSql boundSql = statementHandler.getBoundSql();
String format = String.format(" limit %s,%s", page.getNumber(), page.getSize());
setFieldValue("sql",boundSql,boundSql.getSql()+format);
}
private void setFieldValue(String sql, BoundSql boundSql, String s) throws NoSuchFieldException, IllegalAccessException {
Field sqlField = boundSql.getClass().getDeclaredField(sql);
sqlField.setAccessible(true);
sqlField.set(boundSql,s);
}
}
}