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框架做了处理。