mybatis的參數

在類DynamicSqlSource
方法
public BoundSql getBoundSql(Object parameterObject) {
    DynamicContext context = new DynamicContext(configuration, parameterObject);
    rootSqlNode.apply(context);
    SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);
    Class<?> parameterType = parameterObject == null ? Object.class : parameterObject.getClass();
    SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), parameterType);
    BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
    for (Map.Entry<String, Object> entry : context.getBindings().entrySet()) {
      boundSql.setAdditionalParameter(entry.getKey(), entry.getValue());
    }
    return boundSql;
  }
第一行DynamicContext context = new DynamicContext(configuration, parameterObject);
這句話是根據配置,sql語句,以及參數,來生成context。生成的context會會加入到ognl的contxt,所以在咱們的sql訪問#{_parameter},只要你插入參數,就必定能夠找到咱們傳入的這個參數,而不用管它是什麼類型

進入後能夠看到
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);
  }
1.bindings.put(PARAMETER_OBJECT_KEY, parameterObject);
這裏的PARAMETER_OBJECT_KEY = _parameter;
所以在咱們的sql中,相似於
<if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
是沒有問題的。

隨後它會將這個傳入的參數對象,根據它的類型,活得它能夠獲得的表達式。
if (object instanceof ObjectWrapper) {
      this.objectWrapper = (ObjectWrapper) object;
    } else if (objectWrapperFactory.hasWrapperFor(object)) {
      this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
    } else if (object instanceof Map) {
      this.objectWrapper = new MapWrapper(this, (Map) object);
    } else {
      this.objectWrapper = new BeanWrapper(this, object);
    }

傳入的是bean,BeanWrapper這個處理器會獲取這個傳入的參數的全部的get方法,並獲取get方法後面的Xxx,如getName,就是name

多個參數
咱們可能會碰到多個參數做爲參數的狀況。

public MessagegetMessages(String id, String messageType);

但ibatis只接受一個參數。
這個時候能夠使用javabean做爲參數傳遞,或者使用Map做爲參數傳遞。如
<select id="getMessages" parameterType="java.util.Map"
resultType="com.liyixing.ibatis.model.Message" >
SELECT *
FROM message WHERE ID = #{id} AND MESSAGE_TYPE = #{messageType}
</select>

Map<String, Object> params = new HashMap<String, Object>();

params.put("id", 1);
params.put("messageType", 1);
List<Message> messages = messageDao.getMessages(params);

由於ibatis使用OGNL做爲表達式的。它把參數做爲root,由於ognl的root只有一個。因此ibatis只能支持一個參數。java

相關文章
相關標籤/搜索