mybatis3.4.1源代码 - ognl

14 篇文章 0 订阅

${...} 是居于ognl表达式替换的

package cn.java.demo.ibatis.internal.ognl;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.ognl.OgnlContext;
import org.apache.ibatis.ognl.OgnlException;
import org.apache.ibatis.ognl.OgnlRuntime;
import org.apache.ibatis.ognl.PropertyAccessor;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.scripting.xmltags.OgnlCache;
import org.apache.ibatis.session.Configuration;
import org.testng.Assert;

import java.util.HashMap;
import java.util.Map;

/**
 */
@Slf4j
public class Ongl1Demo {
    public static void main(String[] args)  {
        Map parameterObject = new HashMap();
        parameterObject.put("userId", 1);
        parameterObject.put("userName", "userName_1");

        DynamicContext dynamicContext = new DynamicContext(null, parameterObject);

        /**
         *  @see org.apache.ibatis.scripting.xmltags.TextSqlNode.BindingTokenParser
         */
        String tokenName = "userName";
        Object value = OgnlCache.getValue(tokenName, dynamicContext.getBindings()); // 使用ognl表达式获取值
        log.info("value = {}", value);
        Assert.assertEquals(value, "userName_1");

    }

    /**
     * @see org.apache.ibatis.scripting.xmltags.DynamicContext
     */
    static class DynamicContext {
        public static final String PARAMETER_OBJECT_KEY = "_parameter";
        public static final String DATABASE_ID_KEY = "_databaseId";

        static {
            OgnlRuntime.setPropertyAccessor(ContextMap.class, new ContextAccessor());
        }

        private final ContextMap bindings;
        private final StringBuilder sqlBuilder = new StringBuilder();
        private int uniqueNumber = 0;

        public DynamicContext(Configuration configuration, Object parameterObject) {
            if (parameterObject != null && !(parameterObject instanceof Map)) {
                MetaObject metaObject = configuration.newMetaObject(parameterObject);
                bindings = new ContextMap(metaObject);
            } else {
                bindings = new ContextMap(null);
            }
            bindings.put(PARAMETER_OBJECT_KEY, parameterObject); // "_parameter"
            // bindings.put(DATABASE_ID_KEY, configuration.getDatabaseId());

        }

        public Map<String, Object> getBindings() {
            return bindings;
        }

        public void bind(String name, Object value) {
            bindings.put(name, value);
        }

        public void appendSql(String sql) {
            sqlBuilder.append(sql);
            sqlBuilder.append(" ");
        }

        public String getSql() {
            return sqlBuilder.toString().trim();
        }

        public int getUniqueNumber() {
            return uniqueNumber++;
        }

        static class ContextMap extends HashMap<String, Object> {
            private static final long serialVersionUID = 2977601501966151582L;

            private MetaObject parameterMetaObject;

            public ContextMap(MetaObject parameterMetaObject) {
                this.parameterMetaObject = parameterMetaObject;
            }

            @Override
            public Object get(Object key) {
                String strKey = (String) key;
                if (super.containsKey(strKey)) {
                    return super.get(strKey);
                }

                if (parameterMetaObject != null) {
                    // issue #61 do not modify the context when reading
                    return parameterMetaObject.getValue(strKey);
                }

                return null;
            }
        }

        static class ContextAccessor implements PropertyAccessor {

            @Override
            public Object getProperty(Map context, Object target, Object name)
                    throws OgnlException {
                Map map = (Map) target;

                Object result = map.get(name); // 直接获取
                if (map.containsKey(name) || result != null) {
                    return result;
                }

                Object parameterObject = map.get(PARAMETER_OBJECT_KEY); // 获取《调用参数获取》
                if (parameterObject instanceof Map) {
                    return ((Map) parameterObject).get(name);
                }

                return null;
            }

            @Override
            public void setProperty(Map context, Object target, Object name, Object value)
                    throws OgnlException {
                Map<Object, Object> map = (Map<Object, Object>) target;
                map.put(name, value);
            }

            @Override
            public String getSourceAccessor(OgnlContext arg0, Object arg1, Object arg2) {
                return null;
            }

            @Override
            public String getSourceSetter(OgnlContext arg0, Object arg1, Object arg2) {
                return null;
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值