温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

mybatis中parsing包的用法

发布时间:2021-06-29 13:51:30 来源:亿速云 阅读:169 作者:chen 栏目:大数据

这篇文章主要介绍“mybatis中parsing包的用法”,在日常操作中,相信很多人在mybatis中parsing包的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mybatis中parsing包的用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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) {
            //将字符串转为字符数组
            char[] src = text.toCharArray();
            int offset = 0;
            //判断openToken在text中的位置,注意indexOf函数的返回值-1表示不存在,0表示在在开头的位置
            int start = text.indexOf(openToken, offset);
            // #{favouriteSection,jdbcType=VARCHAR}
            // 这里是循环解析参数,参考GenericTokenParserTest,比如可以解析${first_name} ${initial} ${last_name} reporting.这样的字符串,里面有3个 ${}
            // 验证start是否大于-1(亦即给定参数text中存在openToken子串),如果大于-1(开启循环),验证在给定text的start位置的前一位字符是否为"\"(反斜扛),如果是反斜杠,说明获取到的参数被屏蔽了,我们需要去除这个反斜杠,并重新定位offset。当然如果不是反斜扛,说明参数正常
            while (start > -1) {
                // 判断一下 ${ 前面是否是反斜杠,这个逻辑在老版的mybatis中(如3.1.0)是没有的
                if (start > 0 && src[start - 1] == '\\') {
                    // the variable is escaped. remove the backslash.
                    // 新版已经没有调用substring了,改为调用如下的offset方式,提高了效率
                    //如果text中在openToken前存在转义符就将转义符去掉。如果openToken前存在转义符,start的值必然大于0,最小也为1
                    //因为此时openToken是不需要进行处理的,所以也不需要处理endToken。接着查找下一个openToken
                    builder.append(src, offset, start - offset - 1).append(openToken);
                    offset = start + openToken.length(); //重设offset
                } else {
                    // 获取第一个匹配子串的末位位置end,如果end为-1,表示不存在closeToken,则获取末位end之前的所有串,并重新定位offset为src数组长度,如果end值不是-1,说明text字符串中存在结束标记closeToken
                    int end = text.indexOf(closeToken, start);
                    //如果不存在openToken,则直接将offset位置后的字符添加到builder中
                    if (end == -1) {
                        builder.append(src, offset, src.length - offset);
                        offset = src.length; //重设offset
                    } else {
                        // 获取开始标记之前的子串,并重新定位偏移量offset(start+开始标记的长度=具体参数开始位置),获取这个参数串为content,然后调用TokenHandler的handleToken()方法对获取到的参数串进行处理(比如替换参数之类),然后将处理后的串添加到之前的子串之上,再次重新定位偏移量offset为结束标记的下一位(end+closeToken的长度=end+1)
                        builder.append(src, offset, start - offset);
                        offset = start + openToken.length(); //重设offset
                        String content = new String(src, offset, end - offset);
                        // 得到一对大括号里的字符串后,调用handler.handleToken,比如替换变量这种功能
                        builder.append(handler.handleToken(content));
                        offset = end + closeToken.length(); //重设offset
                    }
                }
                // 获取text中下一步openToken的开始位置,重置start,执行循环体第三步到第六步,处理每一个参数,直到最后一个参数,循环结束
                start = text.indexOf(openToken, offset);
            }
            // 验证偏移量offset与src数组的长度,如果offset小,说明原串还有部分未添加到新串之上,将末尾剩余部分添加到新串,然后将新串返回,如果offset不小于src的数组长度,则直接返回新串
            if (offset < src.length) {
                builder.append(src, offset, src.length - offset);
            }
        }
        return builder.toString();
    }

到此,关于“mybatis中parsing包的用法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI