【MyBatis】拦截查询结果同时动态替换

这篇具有很好参考价值的文章主要介绍了【MyBatis】拦截查询结果同时动态替换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

项目中需要用到响应时替换某些字段的某些值。文章来源地址https://www.toymoban.com/news/detail-755949.html

代码

package xxx.xxx.xx;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 属性值替换
 *
 * @author behappyto.cn
 */
@Slf4j
@Intercepts({@Signature(type = Executor.class, method = "query"
        , args = {MappedStatement.class, Object.class, RowBounds.class,
        ResultHandler.class}),
        @Signature(type = Executor.class, method = "query"
                , args = {MappedStatement.class, Object.class, RowBounds.class,
                ResultHandler.class, CacheKey.class, BoundSql.class})})
public class PropertyInterceptor implements Interceptor {

    /**
     * 当前的值可以放到配置文件、配置中心或者其他方式动态获取
     */
    private final static HashMap<String, String> TABLE_COLUMN = new HashMap<>();

    static {
        TABLE_COLUMN.put("实体类名", "属性名");
    }

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object obj = invocation.proceed();
        try {
            if (ObjectUtils.allNull(obj)) {
                return obj;
            }
            if (!(obj instanceof List)) {
                return obj;
            }
            List<Object> objectList = (List<Object>) obj;
            String newValue = "替换的值"
            if (StringUtils.isBlank(newValue)) {
                return objectList;
            }
            List<Object> respList = new ArrayList<>();
            for (Object object : objectList) {
                respList.add(this.getObject(newValue, object));
            }
            return respList;
        } catch (Exception exception) {
            log.error("ex", exception);
            return obj;
        }
    }

    /**
     * 转换对象
     *
     * @param domain 需要替换的域名
     * @param object 数据库的对象
     * @return 返回 转换后的对象信息
     * @throws IllegalAccessException 异常
     */
    private Object getObject(String domain, Object object) throws IllegalAccessException {
        Class<?> aClass = object.getClass();
        String tableEntry = aClass.getSimpleName();
        String columnField = TABLE_COLUMN.get(tableEntry);
        if (StringUtils.isNotBlank(columnField)) {
            Field[] fields = ReflectUtil.getFields(aClass);
            Optional<Field> optional = Arrays.stream(fields).filter(item ->
                    item.getName().equals(columnField)).findFirst();
            if (!optional.isPresent()) {
                return object;
            }
            Field field = optional.get();
            Object obj = field.get(tableEntry);
            if (obj instanceof String) {
                field.set(field.getName(), MessageFormat.format((String) obj, domain));
            }
        }
        return object;
    }
}

到了这里,关于【MyBatis】拦截查询结果同时动态替换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis中表关系查询结果集映射

    resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。Re

    2024年02月16日
    浏览(66)
  • mybatis模糊查询以及结果封装详解

    创建maven项目:项目结构如图所示 准备数据库表: 准备pom.xml所需的依赖: 编写核心配置文件加载所需要的资源 编写config.xml文件 创建工厂连接数据处理工具SqlSessionUtil.java SqlSessionUtil.java 创建学生实体类对象Student.java 1、添加模糊查询的接口方法:getStudentSname; 2、配置接口方

    2023年04月22日
    浏览(49)
  • Mybatis分页查询同时返回总数和数据

    我们在使用Mybatis分页查询数据列表时,在用户的一个请求中常常需要同时返回当前页的列表数据以及满足条件的数据总条数用于分页。 1)执行两次SQL,一次查列表,一次查总数       这种方法最简单,也最容易实现。 2)分页插件PageHelper       另一种常用的方式就是使用

    2024年02月14日
    浏览(34)
  • MyBatis的动态拦截sql并修改

    因工作需求,需要根据用户的数据权限,来查询并展示相应的数据,那么就需要动态拦截sql,在根据用户权限做相应的处理,因此需要一个通用拦截器,并以注解实现。 该文只做查询拦截,如有其他需求,可根据工作做相应更改 。 步骤一 该注解是方法级,因此需要注解在d

    2024年02月09日
    浏览(32)
  • mybatis查询多个结果返回map--@MapKey使用方法

    目录         介绍  源码分析: 在使用mybatis的时候遇到一种情况,查询结果集返回多个,想用map接收,以前是用List对象接收,然后java代码中转换成map。其实mybatis是支持返回map的。下面就介绍使用方法。 测试代码: 下面@MapKey中的id是BusinessPricePO中的一个属性id,否则会报错

    2024年02月12日
    浏览(36)
  • MyBatis多表查询+动态sql

    在全局配置文件中中设置MyBatis执行日志 假设有一个用户表和文章表,实体类中一个关联关系。 用户实体类 文章实体类 如果想查询的结果包含UserInfo的信息就需要使用,⼀对⼀映射要使⽤ association 标签,因为一篇文章只能对应一个作者。 Controller控制器代码 Service服务层代码

    2023年04月19日
    浏览(34)
  • mybatis xml多表查询,子查询,连接查询,动态sql

    student_type 表 student 表 Student 类 一个学生只有一个年级 Type 类 一个年级有多个学生,所以用 list 下列代码中: 1 resultMap 里面property对应实体类属性,column对应数据库字段名 2 主键用 id 标签 其他用result 3 关联查询(子查询和连接查询) 连接查询查一次 4 一个年级多个学生,所以

    2024年01月21日
    浏览(58)
  • MyBatis(多表查询,动态SQL的使用)

    目录 多表查询  查询文章详情 查询一个用户底下的所有文章 动态SQL的使用 if 标签 trim 标签  where 标签 set 标签 foreach 标签 现在有俩张表,一张是 文章表 ,一张是 用户表 .如下: 我们现在想查询得到一张表,表里面的内容和文章表大多一致,只是要 在文章表的基础上添加用户表中

    2024年02月10日
    浏览(45)
  • 【已解决】Mybatis 实现 Group By 动态分组查询

    🎉工作中遇到这样一个需求场景:实现一个统计查询,要求可以根据用户在前端界面筛选的字段进行动态地分组统计。也就是说, 后端在实现分组查询的时候,Group By 的字段是不确定的 ,可能是一个字段、多个字段或者不进行分组查询,这都是由用户在前端决定的。 💡这

    2024年02月11日
    浏览(37)
  • Mybatis-plus动态条件查询QueryWrapper的使用

    queryWrapper是mybatis plus中实现查询的对象封装操作类,可以封装sql对象,包括where条件,order by排序,select哪些字段等等,他的层级关系如下图: 2.1-案例一:根据name模糊查看未删除的用户列表信息 过滤条件: queryWrapper实现: 2.2-案例二:查看姓李的并且邮箱不为空的用户列表

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包