真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

jdbc如何優(yōu)雅的解決字典表數(shù)據(jù)轉(zhuǎn)化

我們?cè)谧鰯?shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候肯定會(huì)用字典表或者說(shuō)枚舉表等固化數(shù)據(jù),那么當(dāng)查詢數(shù)據(jù)的時(shí)候用到了這些字典值的時(shí)候我們會(huì)怎么做呢。以下舉個(gè)栗子吧,不對(duì)應(yīng)該是好幾個(gè)栗子

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比雞澤網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式雞澤網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋雞澤地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

字典表(PUB_RESTRICTION)
SERIAL_NODESC_IDDESC_CHINAKEYWORD
67550001 1 城區(qū) AREA_TYPE
67550002 2 郊區(qū) AREA_TYPE
67550003 3 縣城 AREA_TYPE
67550004 4 鄉(xiāng)鎮(zhèn) AREA_TYPE
用戶表(MANA_USER)
USER_IDUSER_NAMEUSER_SEXAREA_TYPEUSER_STATE
1 張三 67550001 正常
2 李四 67550002 正常
3 王五 未知 67550001 凍結(jié)
4 黃六 67550004 未審核

剛畢業(yè)的Egan接到老大的需求,把用戶數(shù)據(jù)展示在頁(yè)面上,‘AREA_TYPE’字段從字典表里面取出. Egan說(shuō)到:這個(gè)簡(jiǎn)單,兩張表關(guān)聯(lián)查詢一下。

然后Egan就吧啦吧啦的寫起了代碼….

SELECT
  mu.USER_ID,
  mu.USER_NAME,
  mu.USER_SEX,
  pr.DESC_CHINA AREA_TYPE,
  mu.USER_STATE
FROM MANA_USER mu LEFT JOIN PUB_RESTRICTION pr ON mu.AREA_TYPE = pr.SERIAL_NO
WHERE pr.KEYWORD='AREA_TYPE'

就這樣超快速的寫完了,真的好簡(jiǎn)單啊,有什么難的,去老大那邊炫耀一下我的效率:老大寫完了,這樣是不是你要的效果

USER_IDUSER_NAMEUSER_SEXAREA_TYPEUSER_STATE
1 張三 城區(qū) 正常
2 李四 郊區(qū) 正常
3 王五 未知 城區(qū) 凍結(jié)
4 黃六 鄉(xiāng)鎮(zhèn) 未審核

“嗯嗯,小伙子不錯(cuò)不錯(cuò)”。老大回答到。“等等,你看性別還有狀態(tài)直接放字符串不好吧,也改成字典數(shù)據(jù)吧”。

Egan答到:“這樣也不難,我在關(guān)聯(lián)下就好了”,然后Egan又開(kāi)始嗒嗒嗒的開(kāi)始了。

字典表增加性別還有狀態(tài)的字典數(shù)據(jù)

SERIAL_NODESC_IDDESC_CHINAKEYWORD
67550001 1 城區(qū) AREA_TYPE
67550002 2 郊區(qū) AREA_TYPE
67550003 3 縣城 AREA_TYPE
67550004 4 鄉(xiāng)鎮(zhèn) AREA_TYPE
67510001 1 USER_SEX
67510002 2 USER_SEX
67510003 3 未知 USER_SEX
67520001 1 正常 USER_STATE
67520002 2 凍結(jié) USER_STATE
67520003 3 未審核 USER_STATE
用戶表修改數(shù)據(jù)
USER_IDUSER_NAMEUSER_AGEAREA_TYPEUSER_STATE
1 張三 67510001 67550001 67520001
2 李四 67510002 67550002 67520001
3 王五 67510003 67550001 67520002
4 黃六 67510001 67550004 67520003
修改sql
SELECT
  mu.USER_ID,
  mu.USER_NAME,
  pr2.DESC_CHINA USER_SEX,
  pr.DESC_CHINA  AREA_TYPE,
  pr2.DESC_CHINA USER_STATE
FROM MANA_USER mu LEFT JOIN PUB_RESTRICTION pr ON mu.AREA_TYPE = pr.SERIAL_NO
  LEFT JOIN PUB_RESTRICTION pr1 ON mu.USER_SEX = pr1.SERIAL_NO
  LEFT JOIN PUB_RESTRICTION pr2 ON mu.USER_STATE = pr2.SERIAL_NO
WHERE pr.KEYWORD = 'AREA_TYPE' AND pr1.KEYWORD = 'USER_SEX' AND pr2.KEYWORD = 'USER_STATE'

就這樣寫好了,Egan看著自己寫的代碼有點(diǎn)煩的說(shuō)到,這樣子有點(diǎn)難看。咚咚咚的跑去問(wèn)老大:“老大,這樣寫表關(guān)聯(lián)太多了,重復(fù)的關(guān)聯(lián)那張表,好臃腫的樣子,有沒(méi)有什么比較好的方式” “是有點(diǎn),有點(diǎn)臃腫,讓我想想”,一會(huì)兒老大答到:“你用函數(shù)吧,寫一個(gè)函數(shù)通過(guò)字典值去取”.

然后Egan就回去寫寫起了函數(shù)

CREATE FUNCTION "GET_DESC_CHINA"(IN_SERIAL_NO NUMBER, IN_KEYWORD VARCHAR(32))
  RETURN VARCHAR
IS
  OUT_DESC_CHINA VARCHAR(40);
  BEGIN
    IF IN_SERIAL_NO IS NOT NULL
    THEN
      SELECT DESC_CHINA
      INTO OUT_DESC_CHINA
      FROM PUB_RESTRICTION
      WHERE SERIAL_NO = IN_SERIAL_NO AND KEYWORD = IN_KEYWORD;
      RETURN OUT_DESC_CHINA;
    ELSE
      RETURN '';
    END IF;
  END;

修改sql

SELECT
  mu.USER_ID,
  mu.USER_NAME,
  GET_DESC_CHINA(mu.USER_SEX,'USER_SEX') USER_SEX,
  GET_DESC_CHINA(mu.AREA_TYPE,'AREA_TYPE') AREA_TYPE,
  GET_DESC_CHINA(mu.USER_STATE,'USER_STATE') USER_STATE
FROM MANA_USER mu

噎,看起來(lái)舒服多了。


日積月累之后,數(shù)據(jù)量增長(zhǎng)上去,某一天Egan接到一個(gè)奇葩的需求:需要根據(jù)查詢條件導(dǎo)出對(duì)應(yīng)的用戶數(shù)據(jù)。由于導(dǎo)出的數(shù)據(jù)量有點(diǎn)大效率有點(diǎn)慢下來(lái)了.

Egan有點(diǎn)摸不著頭腦了,找到老大說(shuō):“這樣用函數(shù)的形式數(shù)據(jù)量一大起來(lái)發(fā)現(xiàn)比我不轉(zhuǎn)化直接導(dǎo)出id來(lái)說(shuō)慢了好多好多。函數(shù)這樣寫,每一行都會(huì)去字典表查詢一遍,好慢好慢,慢到要哭了(┬_┬)”

老大說(shuō)到字典的數(shù)據(jù)量不大也比較固化,要不你把字典數(shù)據(jù)放到內(nèi)存里面吧。然后在程序里面匹配吧。

Egan咚咚咚的回去,優(yōu)雅的定義了一個(gè)字典對(duì)象

/**
 * 公共資源處理
 * Created by egan on 2018/11/19.
 */
@Component("pr")
public class PubRestrictUtils {

    public static final String USER_SEX = "USER_SEX";
    public static final String AREA_TYPE = "AREA_TYPE";
    public static final String USER_STATE = "USER_STATE";
    /**
     *  字典表: Map<關(guān)鍵詞, Map>
     */
    private Map> propertys = new HashMap>();

    @Autowired
    private PubRestrictDao pubRestrictDao;

    @PostConstruct
    public void init(){
        loadRestrict(USER_SEX);
        loadRestrict(AREA_TYPE);
        loadRestrict(USER_STATE);
    }

    public void loadRestrict(String keyWord){
        List> list = pubRestrictDao.getPubRestrictByKeyWord(keyWord);
        if (list.isEmpty()){
            return;
        }
         Map  propertys = new HashMap(list.size());
        for (Map map : list){
            propertys.put((BigDecimal) MapUtils.getObject(map,"SERIAL_NO"), MapUtils.getString(map,"DESC_CHINA") );
        }
        this.propertys.put(keyWord, propertys);
    }

    public String getUserSex(BigDecimal code){
        return get(USER_SEX, code);
    }

    public String getAreaType(BigDecimal code){
        return get(AREA_TYPE, code);
    }

    public String getUserState(BigDecimal code){
        return get(USER_STATE, code);
    }

    public String get(String keyWord, BigDecimal code){
        Map propertys = getProperty( keyWord);
        if (MapUtils.isEmpty(propertys)){
            return code.toString();
        }
        String property = MapUtils.getString(propertys, code, code.toString());
        return property;

    }

    public Map getProperty(String keyWord){
        return propertys.get(keyWord);

    }

    public Map> getPropertys() {
        return propertys;
    }
}

修改sql

SELECT
  mu.USER_ID,
  mu.USER_NAME,
  mu.USER_SEX,
  mu.AREA_TYPE,
  mu.USER_STATE
FROM MANA_USER mu

寫完字典工具類之后,把數(shù)據(jù)庫(kù)查詢出來(lái)的結(jié)果集遍歷一遍,把對(duì)應(yīng)的字段取出來(lái)匹配。大概是以下這樣的

@Autowired
PubRestrictUtils pubRestrict
... 此處省略好多飯

List> dataList = ...
for(Map data : dataList){
    data.put(PubRestrictUtils.USER_SEX, pubRestrict.getUserSex(data.get(PubRestrictUtils.USER_SEX)));
    data.put(PubRestrictUtils.AREA_TYPE, pubRestrict.getAreaType(data.get(PubRestrictUtils.AREA_TYPE)));
    data.put(PubRestrictUtils.USER_STATE, pubRestrict.getUserState(data.get(PubRestrictUtils.USER_STATE)));
}
... 此處省略好多飯

剛把用戶功能改完,Egan發(fā)現(xiàn)還有訂單,賬戶…………,好多好多,忍不住流下酸痛的淚(┬_┬)。

Egan又只好咚咚咚跑去老大那里訴苦了:“老大,這樣我要改哭啊,而且感覺(jué)都是重復(fù)的代碼(┬_┬)”

老大連忙安慰到:“不哭不哭,你看,數(shù)據(jù)庫(kù)操作使用jdbc是吧,那在查詢的時(shí)候返回來(lái)結(jié)果是ResultSet,遍歷ResultSet之后才是你的dataList數(shù)據(jù)是吧,那你直接在統(tǒng)一處理吧,去判斷哪些是需要轉(zhuǎn)換的,這樣子業(yè)務(wù)層你就不用任何改動(dòng)了?!?/p>

“噎,好像很有道理哦,那我怎么知道哪些是需要轉(zhuǎn)換的呢?” Egan傻傻的回到。

老大: “你通過(guò)ResultSetMetaData.getColumnName去跟字典表的KeyWord進(jìn)行匹配就好了,匹配上去了就轉(zhuǎn)換”

Egan:“不是所有ColumnName的名字都跟字典表KeyWord一樣的呢”

老大:“你試試別名上面下手腳,比如:吧啦吧啦……”

講完了,Egan好像聽(tīng)懂了,就噠啦嗒啦的開(kāi)始寫了


/**
 *
 *  通過(guò)別名表達(dá)式處理處理結(jié)果集方案
 *
 * 注意 因別名不能超過(guò)30個(gè)字符,所以在處理的時(shí)候盡量是簡(jiǎn)短
 *
 *  使用的方式 主要分為四種
 * 方式一: bean名稱#方法名$數(shù)據(jù)庫(kù)字段名別名,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用
 * 這里通過(guò)bean名稱去匹配對(duì)應(yīng)的處理對(duì)象
 *  

* select mu.AREA_TYPE \"pr#getAreaType$AREA_TYPE\" FROM MANA_USER mu *

* 方式二: 方法名$數(shù)據(jù)庫(kù)字段名別名,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * PubRestrict pubRestrict * 這里通過(guò) new HeartAliasColumnMapRowMapper(pubRestrict) 的形式進(jìn)行 pubRestrict是對(duì)象實(shí)例,然后規(guī)則內(nèi)的方法名就是屬于本實(shí)例的方法名 *

* select mu.AREA_TYPE \"getAreaType$AREA_TYPE\" FROM MANA_USER mu *

* 方式三:集合key名稱$數(shù)據(jù)庫(kù)字段名別名,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * 這里的集合屬于字典表: Map<集合key名稱, Map<記錄數(shù)據(jù), 需要轉(zhuǎn)換的值>> 這樣類型的一個(gè)集合,主要用于對(duì)結(jié)果整體的處理 * Map> propertys = new HashMap>(); * 這里通過(guò) new HeartAliasColumnMapRowMapper(propertys) 的形式進(jìn)行, propertys是所有結(jié)果列里面存儲(chǔ)的信息 *

* select mu.AREA_TYPE AREA_TYPE$AREA_TYPE FROM MANA_USER mu *

* 方式四:k$數(shù)據(jù)庫(kù)字段名別名,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * 這里的集合屬于字典表: Map<記錄數(shù)據(jù), 需要轉(zhuǎn)換的值> 這樣類型的一個(gè)集合,主要用于對(duì)結(jié)果整體的處理 * Map propertys = new HashMap(); * 這里通過(guò) new HeartAliasColumnMapRowMapper(propertys) 的形式進(jìn)行, propertys是所有結(jié)果列里面存儲(chǔ)的信息 *

* select mu.AREA_TYPE k$AREA_TYPE FROM MANA_USER mu *

* 方式五:(數(shù)據(jù)庫(kù)字段名別名=集合key名稱)$,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * 這里的集合屬于字典表: Map<集合key名稱, Map<記錄數(shù)據(jù), 需要轉(zhuǎn)換的值>> 這樣類型的一個(gè)集合,主要用于對(duì)結(jié)果整體的處理 * Map> propertys = new HashMap>(); * 這里通過(guò) new HeartAliasColumnMapRowMapper(propertys) 的形式進(jìn)行, propertys是所有結(jié)果列里面存儲(chǔ)的信息 *

* select mu.AREA_TYPE AREA_TYPE$ FROM MANA_USER mu *

* * 使用方式 * JdbcTemplate.query(sql, new AliasElColumnMapRowMapper(propertys) *

* 注意: 方案五是方案三的簡(jiǎn)化版;方案二,方案三(方案五),方案四是互斥的,在場(chǎng)景中只能使用一種,方案一的話是通用型的 *

* * Created by egan on 2018/11/19. *
* email: egzosn@gmail.com */ public class AliasElColumnMapRowMapper extends ColumnMapRowMapper { private static final Logger LOGGER = LoggerFactory.getLogger(AliasElColumnMapRowMapper.class); private static final Map METHOD_MAP = new HashMap(); WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); /** * 轉(zhuǎn)換bean實(shí)例,用于方案一,二的處理 */ private Object bean; /** * 方案四:k$數(shù)據(jù)庫(kù)字段名別名 */ private Map property; /** * 方案三,方案五:集合key名稱$數(shù)據(jù)庫(kù)字段名別名 */ private Map> propertys; public AliasElColumnMapRowMapper() { } /** * 初始化,bean或者M(jìn)AP入?yún)? * 方式二: 方法名$數(shù)據(jù)庫(kù)字段名別名,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * PubRestrict pubRestrict * 這里通過(guò) new HeartAliasColumnMapRowMapper(pubRestrict) 的形式進(jìn)行 pubRestrict是對(duì)象實(shí)例,然后規(guī)則內(nèi)的方法名就是屬于本實(shí)例的方法名 *

* select mu.AREA_TYPE \"getAreaType$AREA_TYPE\" FROM MANA_USER mu *

* 方式三:集合key名稱$數(shù)據(jù)庫(kù)字段名別名,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * 這里的集合屬于字典表: Map<集合key名稱, Map<記錄數(shù)據(jù), 需要轉(zhuǎn)換的值>> 這樣類型的一個(gè)集合,主要用于對(duì)結(jié)果整體的處理 * Map> propertys = new HashMap>(); * 這里通過(guò) new HeartAliasColumnMapRowMapper(propertys) 的形式進(jìn)行, propertys是所有結(jié)果列里面存儲(chǔ)的信息 *

* select mu.AREA_TYPE AREA_TYPE$AREA_TYPE FROM MANA_USER mu *

* 方式四:k$數(shù)據(jù)庫(kù)字段名別名,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * 這里的集合屬于字典表: Map<記錄數(shù)據(jù), 需要轉(zhuǎn)換的值> 這樣類型的一個(gè)集合,主要用于對(duì)結(jié)果整體的處理 * Map propertys = new HashMap(); * 這里通過(guò) new HeartAliasColumnMapRowMapper(propertys) 的形式進(jìn)行, propertys是所有結(jié)果列里面存儲(chǔ)的信息 *

* select mu.AREA_TYPE k$AREA_TYPE FROM MANA_USER mu *

* 方式五:(數(shù)據(jù)庫(kù)字段名別名=集合key名稱)$,這里數(shù)據(jù)庫(kù)字段名別名用于最后展示使用 * 這里的集合屬于字典表: Map<集合key名稱, Map<記錄數(shù)據(jù), 需要轉(zhuǎn)換的值>> 這樣類型的一個(gè)集合,主要用于對(duì)結(jié)果整體的處理 * Map> propertys = new HashMap>(); * 這里通過(guò) new HeartAliasColumnMapRowMapper(propertys) 的形式進(jìn)行, propertys是所有結(jié)果列里面存儲(chǔ)的信息 *

* select mu.AREA_TYPE AREA_TYPE$ FROM MANA_USER mu *

* * 使用方式 * JdbcTemplate.query(sql, new AliasElColumnMapRowMapper(propertys) *

*/ public AliasElColumnMapRowMapper(Object handlerObj) { if (null == handlerObj){ return; } if (!(handlerObj instanceof Map)){ this.bean = handlerObj; return; } Map property = (Map)handlerObj; if ( property.isEmpty()) { return; } if ( property.entrySet().iterator().next().getValue() instanceof Map){ this.propertys = ( Map>) handlerObj; return; } this.property = property; } @Override public Map mapRow(ResultSet rs, int rowNum) throws SQLException { ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); Map mapOfColValues = createColumnMap(columnCount); for (int i = 1; i <= columnCount; i++) { String key = getColumnKey(JdbcUtils.lookupColumnName(rsmd, i)); Object[] elInfo = getElInfo(key); Object obj = getColumnValue(rs, i); if (null == elInfo || null == obj){ mapOfColValues.put(key, obj); continue; } Object value = ((ElHandler)elInfo[1]).handler(obj, elInfo); if (obj == value){ mapOfColValues.put(key, obj); }else { mapOfColValues.put((String) elInfo[0], value); } } return mapOfColValues; } /** * 根據(jù)字段別名獲取表達(dá)式 * @param key 字段別名 * @return 返回格式 {別名,處理方案, (處理方法|集合key名稱)?, 處理對(duì)象} */ private Object[] getElInfo(String key){ int end = key.lastIndexOf("$"); if (end < 1){ return null; } if (end + 1 == key.length()){ String alias = key.substring(0, end); return new Object[]{alias, ElHandler.MAP_K, alias, propertys}; } String alias = key.substring(end + 1); String el = key.substring(0, end); if (ElHandler.K.name().equals(el.toUpperCase())){ if (null == property){ return null; } return new Object[]{alias, ElHandler.K, property}; } end = el.indexOf("#"); if (end > 1){ return new Object[]{alias, ElHandler.BEAN, el.substring(end + 1), wac.getBean(el.substring(0, end))}; } if (null != bean){ return new Object[]{alias, ElHandler.BEAN, el, bean}; } if (null != propertys){ return new Object[]{alias, ElHandler.MAP_K, el, propertys}; } return null; } enum ElHandler{ /** * 方式一,方式二使用 */ BEAN { /** * value處理器 * * @param value 數(shù)據(jù)庫(kù)查詢結(jié)果 * @param el 表達(dá)式集 * @return 處理后的結(jié)果 */ @Override public Object handler(Object value, Object[] el) { Object handlerObj = el[3]; Class handlerClass = handlerObj.getClass(); String methodName = (String) el[2]; String key = handlerClass.getName() + "#" + methodName; Method method = METHOD_MAP.get(key); if (null == method){ method = BeanUtils.findMethod(handlerClass, methodName, value.getClass()); if (null == method){ return value; } METHOD_MAP.put(key, method); } try { return method.invoke(handlerObj, value); } catch (IllegalAccessException e) { AliasElColumnMapRowMapper.LOGGER.error("handlerObj 方法調(diào)用異常", e); } catch (InvocationTargetException e) { AliasElColumnMapRowMapper.LOGGER.error("handlerObj 方法調(diào)用異常", e); } return value; } }, /** * 方式三,方式五 */ MAP_K { /** * value處理器 * * @param value 數(shù)據(jù)庫(kù)查詢結(jié)果 * @param el 表達(dá)式集 * @return 處理后的結(jié)果 */ @Override public Object handler(Object value, Object[] el) { if (null == el[3]){ return value; } Map> handlerObj = (Map>)el[3]; if ( handlerObj.isEmpty()){ return value; } Map property = handlerObj.get(el[2]); if (null == property || property.isEmpty()){ return value; } Object o = property.get(value); if (o != null){ return o; } return value; } }, /** * 方式四 */ K { /** * value處理器 * * @param value 數(shù)據(jù)庫(kù)查詢結(jié)果 * @param el 表達(dá)式集 * @return 處理后的結(jié)果 */ @Override public Object handler(Object value, Object[] el) { if (null == el[2]){ return value; } Map handlerObj = ( Map)el[2]; if (handlerObj.isEmpty() ){ return value; } Object o = handlerObj.get(value); if (o != null){ return o; } return value; } }; /** * value處理器 * @param value 數(shù)據(jù)庫(kù)查詢結(jié)果 * @param el 表達(dá)式集 {別名,處理方案, (處理方法|集合key名稱)?, 處理對(duì)象} * @return 處理后的結(jié)果 */ public abstract Object handler(Object value, Object[] el); }

修改sql

SELECT
  mu.USER_ID,
  mu.USER_NAME,
  mu.USER_SEX$,
  mu.AREA_TYPE$,
  mu.USER_STATE$
FROM MANA_USER mu

Dao部分調(diào)用代碼, JdbcTemplate 調(diào)用的時(shí)候加入第二個(gè)參數(shù);

@Autowired
PubRestrictUtils pubRestrict
@Autowired
JdbcTemplate jdbcTemplate;
...此處省略好多好多
String sql = "SELECT  mu.USER_ID,  mu.USER_NAME,  mu.USER_SEX USER_SEX$,  mu.AREA_TYPE AREA_TYPE$,  mu.USER_STATE USER_STATE$ FROM MANA_USER mu";
List> dataList =jdbcTemplate.query(sql, new AliasElColumnMapRowMapper(pubRestrict.getPropertys()));

...此處省略好多好多

就這樣寫好了。老大還夸獎(jiǎng)了下Egan,Egan都樂(lè)了好幾天。


好了,進(jìn)入正題,講解下AliasElColumnMapRowMapper的使用吧,雖然在這個(gè)類的說(shuō)明里面也講了很細(xì)了。

使用的時(shí)候再重申一遍

注意:
  1. 方案五是方案三的簡(jiǎn)化版;方案二,方案三(方案五),方案四是互斥的,在場(chǎng)景中只能使用一種,方案一的話是通用型的
  2. 因別名不能超過(guò)30個(gè)字符,所以在處理的時(shí)候盡量是簡(jiǎn)短

以下還是根據(jù)以上Egan所遇的問(wèn)題去舉例每種方案吧。

  1. 方案一 這里別名你不一定要跟字段表的關(guān)鍵詞KeyWord一樣,只需要你調(diào)用的方法正確即可,比如 mu.USER_SEX pr#getUserSex$SEX,別名部分pr#getUserSex$SEX的"pr"部分是bean在spring容器中的名字這里可以倒回去看字典對(duì)象類上面的標(biāo)識(shí)@Component("pr"),然后"getUserSex" 是對(duì)應(yīng)pr對(duì)象的對(duì)應(yīng)方法

@Autowired
PubRestrictUtils pubRestrict
@Autowired
JdbcTemplate jdbcTemplate;

String sql = "SELECT  mu.USER_ID,  mu.USER_NAME,  mu.USER_SEX \"pr#getUserSex$SEX\",  mu.AREA_TYPE \"pr#getAreaType$AREA_TYPE\",  mu.USER_STATE \"pr#getUserState$USER_STATE\" FROM MANA_USER mu";
List> dataList =jdbcTemplate.query(sql, new AliasElColumnMapRowMapper());

查詢結(jié)果List<Map<String, Object>>對(duì)應(yīng)的值:[{USER_ID=1,USER_NAME=張三,SEX=男,AREA_TYPE=城區(qū),USER_STATE=正常},...]

  1. 方案二 這里別名你不一定要跟字段表的關(guān)鍵詞KeyWord一樣,只需要你調(diào)用的方法正確即可,比如 mu.USER_SEX getUserSex$SEX,別名部分getUserSex$SEX的"getUserSex"是對(duì)應(yīng)傳進(jìn)去pubRestrict的方法
@Autowired
PubRestrictUtils pubRestrict
@Autowired
JdbcTemplate jdbcTemplate;

String sql = "SELECT  mu.USER_ID,  mu.USER_NAME,  mu.USER_SEX \"getUserSex$SEX\",  mu.AREA_TYPE \"getAreaType$AREA_TYPE\",  mu.USER_STATE \"getUserState$USER_STATE\" FROM MANA_USER mu";
List> dataList =jdbcTemplate.query(sql, new AliasElColumnMapRowMapper(pubRestrict));

查詢結(jié)果Lis<Map<String, Object>>對(duì)應(yīng)的值:[{USER_ID=1,USER_NAME=張三,SEX=男,AREA_TYPE=城區(qū),USER_STATE=正常},...]

  1. 方案三 這里別名你不一定要跟字段表的關(guān)鍵詞KeyWord一樣,只需要你調(diào)用的方法正確即可,比如 mu.USER_SEX USER_SEX$SEX,別名部分USER_SEX$SEX的"USER_SEX"是外層MAP的key然后SEX是前端展示的名字
@Autowired
PubRestrictUtils pubRestrict
@Autowired
JdbcTemplate jdbcTemplate;

String sql = "SELECT  mu.USER_ID,  mu.USER_NAME,  mu.USER_SEX USER_SEX$SEX,  mu.AREA_TYPE AREA_TYPE$AREA_TYPE,  mu.USER_STATE USER_STATE$USER_STATE FROM MANA_USER mu";
List> dataList =jdbcTemplate.query(sql, new AliasElColumnMapRowMapper(pubRestrict.getPropertys()));

查詢結(jié)果Lis<Map<String, Object>>對(duì)應(yīng)的值:[{USER_ID=1,USER_NAME=張三,SEX=男,AREA_TYPE=城區(qū),USER_STATE=正常},...]

  1. 方案五,這里就不講方案五了,Egan同學(xué)的例子就是方案五了。

  2. 方案四。這里需要對(duì)字典對(duì)象做一些改動(dòng)

字典對(duì)象,這里把屬性對(duì)象做成了單層的MAP

/**
 * 公共資源處理
 * Created by egan on 2018/11/19.
 */
@Component("pr")
public class PubRestrictUtils {

    /**
     *  字典表: Map
     */
    private Map propertys = null;

    @Autowired
    private PubRestrictDao pubRestrictDao;

    @PostConstruct
    public void loadRestrict(){
        List> list = pubRestrictDao.getPubRestrictAll();
        if (list.isEmpty()){
            return;
        }
        this.propertys = new HashMap(list.size());
        for (Map map : list){
            this.propertys.put((BigDecimal) MapUtils.getObject(map,"SERIAL_NO"), MapUtils.getString(map,"DESC_CHINA") );
        }
    }

    public Map getPropertys() {
        return propertys;
    }
}

對(duì)象使用, 別名展示同理 mu.USER_SEX k$SEX ,別名“k$SEX”中的“k”是固定值,“SEX”是需要展示的值

@Autowired
PubRestrictUtils pubRestrict
@Autowired
JdbcTemplate jdbcTemplate;

String sql = "SELECT  mu.USER_ID,  mu.USER_NAME,  mu.USER_SEX k$SEX,  mu.AREA_TYPE k$AREA_TYPE,  mu.USER_STATE k$USER_STATE FROM MANA_USER mu";
List> dataList =jdbcTemplate.query(sql, new AliasElColumnMapRowMapper(pubRestrict.getPropertys()));

查詢結(jié)果List<Map<String, Object>>對(duì)應(yīng)的值:[{USER_ID=1,USER_NAME=張三,SEX=男,AREA_TYPE=城區(qū),USER_STATE=正常},...]

.

最后,安利一個(gè)全能支付Java開(kāi)發(fā)工具包.優(yōu)雅的輕量級(jí)支付模塊集成支付對(duì)接支付整合(微信支付,支付寶,銀聯(lián),友店,富友,跨境支付paypal,payoneer(P卡派安盈)易極付)app,掃碼,即時(shí)到帳刷卡付條碼付刷臉付轉(zhuǎn)賬服務(wù)商模式、支持多種支付類型多支付賬戶,支付與業(yè)務(wù)完全剝離,簡(jiǎn)單幾行代碼即可實(shí)現(xiàn)支付,簡(jiǎn)單快速完成支付模塊的開(kāi)發(fā),可輕松嵌入到任何系統(tǒng)里 目前僅是一個(gè)開(kāi)發(fā)工具包(即SDK),只提供簡(jiǎn)單Web實(shí)現(xiàn),建議使用maven或gradle引用本項(xiàng)目即可使用本SDK提供的各種支付相關(guān)的功能
https://www.oschina.net/p/pay-java-parent


當(dāng)前名稱:jdbc如何優(yōu)雅的解決字典表數(shù)據(jù)轉(zhuǎn)化
瀏覽地址:http://weahome.cn/article/jhpgci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部