ORM框架

1.mybatis
可以通过拦截的方式处理问题,可以拦截请求sql使用jsqlparser解析sql获取参数字段
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>3.1</version>
</dependency>
拦截请求:
@Intercepts({
@Signature(type = StatementHandler.class, method = "parameterize", args = Statement.class)
})

@Override
public Object intercept(Invocation invocation) throws Throwable {
    Object target = realTarget(invocation.getTarget());
    MetaObject metaObject = SystemMetaObject.forObject(target);
    String sql = (String) metaObject.getValue("delegate.boundSql.sql");
    List<ParameterMapping> parameterMappings = (List<ParameterMapping>) metaObject.getValue("delegate.boundSql.parameterMappings");
    Object parameterObject = metaObject.getValue("delegate.boundSql.parameterObject");
    final Object returnObj = invocation.proceed();
    return returnObj;
}

private static <T> T realTarget(Object target) {
    if (Proxy.isProxyClass(target.getClass())) {
        MetaObject metaObject = SystemMetaObject.forObject(target);
        return realTarget(metaObject.getValue("h.target"));
    } else {
        return (T) target;
    }
}

拦截还可以对返回结果字段进行处理:
@Intercepts({
@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class})
})

 @Override
public Object intercept(Invocation invocation) throws Throwable {
    Object target = realTarget(invocation.getTarget());
    MetaObject metaObject = SystemMetaObject.forObject(target);
    MappedStatement ms = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
    String sql = (String) metaObject.getValue("delegate.boundSql.sql");
    Configuration configuration = ms.getConfiguration();
    Collection<ResultMap> resultMaps = configuration.getResultMaps();
    for (ResultMap r : resultMaps) {
        List<ResultMapping> resultMappings = r.getResultMappings();
        for (ResultMapping resultMapping : resultMappings) {
            resultMapping.getColumn();
            resultMapping.getProperty();
        }
        break;
    }
    final Object returnObj = invocation.proceed();
    return returnObj;
}
private static <T> T realTarget(Object target) {
    if (Proxy.isProxyClass(target.getClass())) {
        MetaObject metaObject = SystemMetaObject.forObject(target);
        return realTarget(metaObject.getValue("h.target"));
    } else {
        return (T) target;
    }
}

拦截器初始化可以利用config类 @Bean注解,手动进行new

另外可以使用handler来拦截返回数据或者请求数据进行处理:
@MappedJdbcTypes(value = {CLOB,CLOB,VARCHAR,LONGVARCHAR,NVARCHAR,NCHAR,NCLOB},includeNullJdbcType = true)
@MappedTypes(String.class)
public class MyStringTypeHandler extends BaseTypeHandler<String> {}

其中includeNullJdbcType一定要有,否则不生效。
还需要配置handler路径mybatis.type-handlers-package: .****.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容