溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mybatis中parsing包的用法

發(fā)布時(shí)間:2021-06-29 13:51:30 來源:億速云 閱讀:181 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“mybatis中parsing包的用法”,在日常操作中,相信很多人在mybatis中parsing包的用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mybatis中parsing包的用法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

private final String openToken;

    private final String closeToken;

    private final TokenHandler handler;

    public GenericTokenParser(String openToken, String closeToken, TokenHandler tokenHandler) {
        this.openToken = openToken;
        this.closeToken = closeToken;
        this.handler = tokenHandler;
    }

    public String parse(String text) {
        StringBuilder builder = new StringBuilder();
        //如果傳入的字符串有值
        if (text != null && text.length() > 0) {
            //將字符串轉(zhuǎn)為字符數(shù)組
            char[] src = text.toCharArray();
            int offset = 0;
            //判斷openToken在text中的位置,注意indexOf函數(shù)的返回值-1表示不存在,0表示在在開頭的位置
            int start = text.indexOf(openToken, offset);
            // #{favouriteSection,jdbcType=VARCHAR}
            // 這里是循環(huán)解析參數(shù),參考GenericTokenParserTest,比如可以解析${first_name} ${initial} ${last_name} reporting.這樣的字符串,里面有3個(gè) ${}
            // 驗(yàn)證start是否大于-1(亦即給定參數(shù)text中存在openToken子串),如果大于-1(開啟循環(huán)),驗(yàn)證在給定text的start位置的前一位字符是否為"\"(反斜扛),如果是反斜杠,說明獲取到的參數(shù)被屏蔽了,我們需要去除這個(gè)反斜杠,并重新定位offset。當(dāng)然如果不是反斜扛,說明參數(shù)正常
            while (start > -1) {
                // 判斷一下 ${ 前面是否是反斜杠,這個(gè)邏輯在老版的mybatis中(如3.1.0)是沒有的
                if (start > 0 && src[start - 1] == '\\') {
                    // the variable is escaped. remove the backslash.
                    // 新版已經(jīng)沒有調(diào)用substring了,改為調(diào)用如下的offset方式,提高了效率
                    //如果text中在openToken前存在轉(zhuǎn)義符就將轉(zhuǎn)義符去掉。如果openToken前存在轉(zhuǎn)義符,start的值必然大于0,最小也為1
                    //因?yàn)榇藭r(shí)openToken是不需要進(jìn)行處理的,所以也不需要處理endToken。接著查找下一個(gè)openToken
                    builder.append(src, offset, start - offset - 1).append(openToken);
                    offset = start + openToken.length(); //重設(shè)offset
                } else {
                    // 獲取第一個(gè)匹配子串的末位位置end,如果end為-1,表示不存在closeToken,則獲取末位end之前的所有串,并重新定位offset為src數(shù)組長度,如果end值不是-1,說明text字符串中存在結(jié)束標(biāo)記closeToken
                    int end = text.indexOf(closeToken, start);
                    //如果不存在openToken,則直接將offset位置后的字符添加到builder中
                    if (end == -1) {
                        builder.append(src, offset, src.length - offset);
                        offset = src.length; //重設(shè)offset
                    } else {
                        // 獲取開始標(biāo)記之前的子串,并重新定位偏移量offset(start+開始標(biāo)記的長度=具體參數(shù)開始位置),獲取這個(gè)參數(shù)串為content,然后調(diào)用TokenHandler的handleToken()方法對獲取到的參數(shù)串進(jìn)行處理(比如替換參數(shù)之類),然后將處理后的串添加到之前的子串之上,再次重新定位偏移量offset為結(jié)束標(biāo)記的下一位(end+closeToken的長度=end+1)
                        builder.append(src, offset, start - offset);
                        offset = start + openToken.length(); //重設(shè)offset
                        String content = new String(src, offset, end - offset);
                        // 得到一對大括號里的字符串后,調(diào)用handler.handleToken,比如替換變量這種功能
                        builder.append(handler.handleToken(content));
                        offset = end + closeToken.length(); //重設(shè)offset
                    }
                }
                // 獲取text中下一步openToken的開始位置,重置start,執(zhí)行循環(huán)體第三步到第六步,處理每一個(gè)參數(shù),直到最后一個(gè)參數(shù),循環(huán)結(jié)束
                start = text.indexOf(openToken, offset);
            }
            // 驗(yàn)證偏移量offset與src數(shù)組的長度,如果offset小,說明原串還有部分未添加到新串之上,將末尾剩余部分添加到新串,然后將新串返回,如果offset不小于src的數(shù)組長度,則直接返回新串
            if (offset < src.length) {
                builder.append(src, offset, src.length - offset);
            }
        }
        return builder.toString();
    }

到此,關(guān)于“mybatis中parsing包的用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI