mybatis动态sql的标签

已知有resultMap:

<resultMap type="com.briup.oneToMany.Course" id="coursesResult">
		<id property="courseId" column="course_id"/>
		<result property="name" column="name"/>
		<result property="description" column="description"/>
		<result property="startDate" column="start_date"/>
		<result property="endDate" column="end_date"/>
</resultMap>

1、<if>

if标签中嵌套了sql语句,如果满足条件就执行,否则不执行标签内的sql语句,例如:根据教师Id(必须存在)查找信息,可选选项是课程名称、开始时间和结束时间。

<select id="searchCourses" parameterType="map" resultMap="coursesResult">
	select *
	from courses
	where tutor_id=#{tutorId}
	<if	test="name != null">
		and name like #{name}
	</if>
	<if	test="startDate != null">
		and start_date <![CDATA[>=]]> #{startDate}
	</if>
	<if	test="endDate != null">
		and end_date <![CDATA[<=]]> #{endDate}
	</if>
</select>

测试代码:

map.put("tutorId", 1);
map.put("name", "%My%");

2、<choose>

choose标签是根据类别来进行查询的,当满足when标签里面的test属性时,才会去执行when标签里面的sql语句,如果都不满足,则会执行otherwise标签里的sql语句。

<select id="searchCourses" parameterType="map" resultMap="coursesResult">
	select *
	from courses
	<choose>
		<when test="searchBy == 'Tutor'">
			where tutor_id = #{tutorId}
		</when>
		<when test="sreachBy == 'courseName'">
			where name like #{courseName}
		</when>
		<otherwise>
			where start_date <![CDATA[>=]]> sysdate
		</otherwise>
	</choose>
</select>

测试代码:

map.put("sreachBy", "Tutor");
map.put("tutorId", 1);
map.put("sreachBy", "courseName");
map.put("courseName", "%My%");

3、<where>

where标签表示所有的查询条件都是可选的,在需要使用至少一种查询条件的情况下,可以直接使用where子句,如果有多个条件,可以添加and或者or。

<select id="searchCourses" parameterType="map" resultMap="coursesResult">
	select *
	from courses
	<where>
		<if test="tutorId != null">
			tutor_id = #{tutorId}
		</if>
		<if test="courseName != null">
			and name like #{courseName}
		</if>
	</where>
</select>

测试代码:

map.put("tutorId", 1);
map.put("courseName", "%Java%");

4、<foreach>

foreach标签是用来迭代遍历一个数组或者集合的

第一种使用or的情况:

<select id="searchCourses" parameterType="map" resultMap="coursesResult">
	select *
	from courses
	<if test="tutorIds != null">
		<where>
			<foreach collection="tutorIds" item="tutorId">
				or tutor_id = #{tutorId}
			</foreach>
		</where>
	</if>			
</select>

第二种使用in的情况:

<select id="searchCourses" parameterType="map" resultMap="coursesResult">
	select *
	from courses
	<if test="tutorIds != null">
		<where>
		tutor_id in
			<foreach collection="tutorIds" item="tutorId" open="(" close=")" separator=",">
				 #{tutorId}
			</foreach>
		</where>
	</if>			
</select>

测试代码:

List<Integer> tutorIds = new ArrayList<Integer>();
tutorIds.add(1);
tutorIds.add(2);
map.put("tutorIds", tutorIds);

5、<trim>

trim和where类似,trim提供了添加 前缀/后缀 或者 移除 前缀/后缀

<select id="searchCourses" parameterType="map" resultMap="coursesResult">
	select *
	from courses
	<trim prefix="where" prefixOverrides="and">
		<if test="tutorId != null">
			and tutor_id = #{tutorId}
		</if>
		<if test="courseName != null">
			and name like #{courseName}
		</if>
	</trim>
			
</select>

测试代码:

map.put("tutorId", 1);
map.put("courseName", "%Java%");

6、<set>

set标签只是针对update更新语句使用的。

<set>
    <if test="name != null">name=#{name}</if>
    <if test="email != null">email=#{email}</if>
    <if test="phone != null">phone=#{phone}</if>
</set>
上一篇:蓝桥杯基础练习题 报时助手(字符串处理)


下一篇:集合之Map接口