天天看點

mybatis中動态sql的傳參要求

mybatis中,可以實作動态sql,在serviceImpl中,傳入參數的時候,要注意傳入參數的名字和動态sql 中的變量名保持一緻。

比如

xml:

<select id="queryStudyList" resultType="java.util.HashMap" parameterType="java.util.HashMap">
      select t.* from SGT_WIS_STUDY_TRAIN t 
      where 1=1
      <if test="datumId != null" >
       	and t.DATUM_ID = #{datumId,jdbcType=VARCHAR}
      </if>
      <if test="datumName != null and datumName != '' " >
       	and t.DATUM_NAME like '%' || #{datumName,jdbcType=VARCHAR} || '%'
      </if>
      <if test="pictureName != null" >
        and t.PICTURE_NAME = #{pictureName,jdbcType=VARCHAR}
      </if>
</select>
           

代碼中所有标紅的地方就是動态sql 的變量名,要與下面serviceImpl中的傳入的參數名保持一緻。

serviceImpl:

public Map<String, Object> queryStudyById(String datumId) {
    	Map<String, Object> paramMap = new HashMap<String, Object>();
    	paramMap.put("datumId", datumId);
    	return (Map<String, Object>) daoHelper.queryOne("com.camel.basic.web.xml.oracle.StudytraMapper.queryStudyList", paramMap);
}
           

這裡面的datumId與動态sql的要一緻,大小寫也要一緻,這裡隻傳了datumId,那麼xml的動态sql中其他的就是空,不會執行,運作的sql為:

select t.* from SGT_WIS_STUDY_TRAIN t where 1=1 and t.DATUM_ID = #{datumId}
           

還有一種特殊情況,如果傳入的參數隻有一個,并且是基本資料類型,如String,那麼sql中的傳入參數名可以是_parameter,不用與serviceImpl中的參數名保持一緻。如下面代碼:

xml:

<delete id="deleteStudyById" parameterType="java.lang.String" >
    delete from SGT_WIS_STUDY_TRAIN t
    where 1=1
    <if test="_parameter != null">
    t.DATUM_ID = #{_parameter,jdbcType=VARCHAR}
    </if>
</delete>
           

serviceImpl中傳入的參數名不需要是_parameter:

public int deleteStudytra(String DATUM_ID) {	
    return daoHelper.delete("com.camel.basic.web.xml.oracle.StudytraMapper.deleteStudyById", DATUM_ID);
}
           

因為這是mybatis架構做了處理。