之前说过试了用动态sql发现方便多了,可以把以往多个方法集中在一个方法中完成。对比jdbc也可以摆脱拼接sql带来的麻烦。
其实对动态sql的使用本质上就是使用标签,以下介绍常用的标签:
if:这个是最常用到的,主要用于在一些条件查询中,有的查询有数据则执行相应的语句,有的没数据传过来则不则行。我第一次使用是在项目的筛选条件中,因为所有条件都不是必选的,有的用户没选择就不会没数据,我跟前端规定没数据就传null给后台。这种情况下以前是需要写好几种情况的接口整合在一起,现在用了动态sql则一个接口能完美解决。
以下为mapper.xml文件中的代码
<select id="findEnterpriseByBussiness"
resultType="com.indechy.nyj.bean.BusinessSwitch">
SELECT
t_user_enterprises.competent_authority competentAuthority,
t_user_enterprises.username username,
t_user_enterprises.is_eading_companies
leadingLevel,
batch.bacth bacth,
history.time_of_submission
timeofsubmission,
history.record_type recordType
FROM
history,t_user_enterprises,batch
<where>
AND
history.eid=t_user_enterprises.id
AND
history.batch_id=batch.id
<if test="age != null">
AND history.time_of_submission like
CONCAT(CONCAT('%',#{age} ,'%'))
</if>
<if test="recordType != null">
AND history.record_type = #{recordType}
</if>
<if test="bacth != null">
AND batch.bacth = #{bacth}
</if>
<if test="competentAuthority != null">
AND t_user_enterprises.competent_authority =
#{competentAuthority}
</if>
<if test="leadingLevel != null">
AND t_user_enterprises.is_eading_companies = #{leadingLevel}
</if>
<if test="username != null">
AND
t_user_enterprises.username like
CONCAT(CONCAT('%',#{username} ,'%'))
</if>
<if test="startTimeOfSubmission != null">
AND history.time_of_submission >=
#{startTimeOfSubmission}
</if>
<if test="endTimeOfSubmission != null">
AND history.time_of_submission <=
#{endTimeOfSubmission}
</if>
<if test="recordType != null">
GROUP BY
t_user_enterprises.username
</if>
ORDER BY
history.time_of_submission
DESC
limit #{pageNum},#{num}
</where>
</select>
里面的t<if test=“ ”>引号中的变量是传入到xml文件中的数据,如果是null则不执行,只有当变量值不等于null时才会执行该条相应语句。
上面代码中除了if标签外还出现了where标签,这个标签是为了防止当后面的所有if标签中内容都为null时出现语法错误,当后面的if标签中内容都不执行时,会自动忽略where标签,一般情况下与if标签同时使用。