在類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