recherche

Maison  >  Questions et réponses  >  le corps du texte

java - 关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化

阿神阿神2807 Il y a quelques jours850

répondre à tous(2)je répondrai

  • 高洛峰

    高洛峰2017-04-18 10:37:21

    Utilisation de l'intercepteur d'ensemble de résultats MyBatis pour répondre à une telle exigence :

    En raison des changements fréquents dans les exigences du projet, la base de données MySQL du projet stocke les chaînes JSON. Par exemple, les informations de base de l'utilisateur peuvent changer avec les mises à niveau de version

    .

    Fiche technique

    CREATE TABLE `account` (
      `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
      `infos` text NOT NULL COMMENT '用户JSON基本信息',
      `createTime` int(10) unsigned NOT NULL COMMENT '创建时间',
      `updateTime` int(10) unsigned NOT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    Données :

    id infos createTime updateTime
    1 {"nickName":"Jan","region_area":"","region_city":"深圳市","region_country":"中国","region_province":"广东省","sex":"男","signature":"只要不放弃就还有机会!"} 1467793564 1470795733

    Intercepteur JSONPlugin

    Utilisez l'intercepteur MyBatis pour intercepter la méthode ResultSetHandler de l'interface handleResultSets :

    package me.xuebai.modules.mybatis;
    
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    
    import org.apache.commons.lang3.StringUtils;
    import org.apache.ibatis.executor.resultset.ResultSetHandler;
    import org.apache.ibatis.plugin.Interceptor;
    import org.apache.ibatis.plugin.Intercepts;
    import org.apache.ibatis.plugin.Invocation;
    import org.apache.ibatis.plugin.Plugin;
    import org.apache.ibatis.plugin.Signature;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.TypeReference;
    import me.xuebai.modules.entity.Account;
    
    @Intercepts({@Signature(
              type= ResultSetHandler.class,
              method = "handleResultSets",
              args = {Statement.class})})
    public class JSONPlugin implements Interceptor {
    
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            Object[] args = invocation.getArgs();
            // 获取到当前的Statement
            Statement stmt =  (Statement) args[0];
            // 通过Statement获得当前结果集
            ResultSet resultSet = stmt.getResultSet();
            List<Object> resultList = new ArrayList<Object>();  
            if(resultSet != null && resultSet.next()) {
                Account account = new Account();
                // infos字段
                String infos = resultSet.getString("infos");
                // 判断是否为空
                if(StringUtils.isNotBlank(infos)) {
                    // fastjson泛型反序列化
                    Map<String, Object> infMap = JSON.parseObject(infos, new TypeReference<Map>(){});
                    account.setInfos(infMap);
                    resultList.add(account);
                }
                // handleResultSets返回结果一定是一个List
                // size为1时,Mybatis会取第一个元素作为接口的返回值。  
                return resultList;
            }
            return invocation.proceed();
        }
    
        @Override
        public Object plugin(Object target) {
             return Plugin.wrap(target, this); 
        }
    
        @Override
        public void setProperties(Properties properties) {
        }
    
    }

    mybatis-config.xml

    Enregistrez le plug-in dans le fichier de configuration mybatis :

    <plugins>
            <plugin interceptor="me.xuebai.modules.mybatis.JSONPlugin"></plugin>
    </plugins>

    Test de sortie

    Account account = accountDao.get(1L);
    // {sex=男, region_city=深圳市, region_area=, nickName=Jan, region_country=中国, signature=只要不放弃就还有机会!, region_province=广东省}
    System.out.println(account.getInfos());

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 10:37:21

    Utiliser Mybatis pour répondre aux exigences suivantes

    Interrogez la table d'informations de base de l'utilisateur. Le résultat de la requête renvoie un ensemble de résultats de List<Map<String,Object>>, et l'un des champs est crypté

    Fiche technique

    CREATE TABLE usr_basic_inf(
        USR_ID               VARCHAR(20)       NOT NULL      COMMENT '用户ID,01+18位互斥随机数'    ,
        USR_REAL_NME         VARCHAR(50)       NOT NULL      COMMENT '用户真实姓名'              ,
        CERT_TYPE            VARCHAR(4)                      COMMENT '证件种类'                ,
        CERT_NO              VARCHAR(100)                    COMMENT '证件号码'                ,
        RES_FLD              VARCHAR(300)                    COMMENT '预留字段 '               ,
        PRIMARY KEY(USR_ID)
    ) COMMENT='用户基础信息表';

    Données

    USR_ID USR_REAL_NME CERT_TYPE CERT_NO RES_FLD
    01000000000000000001 张三 0101 101222010199913291 (NULL)

    Utilisez Mybatis pour intercepter la méthode Executor.class de 'qurey' et traiter l'ensemble de résultats renvoyé

    package com.ceabox.interceptor;
    
    import java.util.ArrayList;
    import java.util.Map;
    import java.util.Properties;
    
    import org.apache.ibatis.executor.Executor;
    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.Plugin;
    import org.apache.ibatis.plugin.Signature;
    import org.apache.ibatis.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;
    
    @Intercepts({ @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
            RowBounds.class, ResultHandler.class }) })
    public class InterceptorForQry implements Interceptor {
    
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public Object intercept(Invocation invocation) throws Throwable {
            Object result = invocation.proceed(); //执行请求方法,并将所得结果保存到result中
            if (result instanceof ArrayList) {
                ArrayList resultList = (ArrayList) result;
                for (int i = 0; i < resultList.size(); i++) {
                    if (resultList.get(i) instanceof Map) {
                        Map resultMap = (Map) resultList.get(i);
                        resultMap.put("CERT_NO", "这个是加密结果"); //取出相应的字段进行加密
                    }
                }
            }
            return result;
        }
    
        public Object plugin(Object target) {
            System.out.println("this is the proceed ===>>" + target);
            return Plugin.wrap(target, this);
        }
    
        public void setProperties(Properties arg0) {
            System.out.println("this is the properties ===>>" + arg0);
        }
    }

    mybatis-config.xml

    Enregistrez le plug-in dans le fichier de configuration mybatis :

    <plugins>
        <plugin interceptor="com.ceabox.interceptor.InterceptorForQry"></plugin>
    </plugins>

    Test de sortie

    { USR_ID=01000000000000000001, RES_FLD=null, CERT_NO=这个是加密结果, CERT_TYPE=0101, USR_REAL_NME=张三 }

    répondre
    0
  • Annulerrépondre