5.1 if元素、where元素

  • if元素用于对某一字段进行判断,
    比如
    根据判断传过来的参数是否为空,从而决定是否执行包含在其中的SQL片段。
  • where元素则用于对包含在其中的SQL语句进行检索,
    需要时会剔除多余的连接词
    (比如 and 或者 or ),
    并且在需要时可以添加where关键词

示例:
<mark>查询emp表中所有员工的信息,</mark>
另:

  • 如果啥没传,查所有
  • 如果传递了minSal(最低薪资)和maxSal(最高薪资),
    查询薪资大于minSal和小于maxSal的员工信息;
  • 如果只传递了minSal
    查询薪资大于minSal的所有员工信息;
  • 如果只传递了maxSal
    查询薪资小于maxSal的所有员工信息;
mapper文件配置:
<!-- 练习12.1: 根据薪资查询员工信息 * 练习12: 根据薪资查询员工信息 * 如果参数有 minSal、maxSal, 则 * ... where salary > minSal and salary < maxSal * 如果参数中只有minSal, 则 * ... where salary > minSal * 如果参数中只有maxSal, 则 * ... where salary < maxSal * 如果没有参数, 则不执行where子句, 默认查询所有员工 -->
<select id="findAllBySal" resultType="com.tedu.pojo.Emp">
	select * from emp
	where	1=1
		<if test="minSal != null">
			and salary>#{minSal}
		</if>
		<if test="maxSal != null">
			and salary <![CDATA[ < ]]> #{maxSal} 
		</if>
</select>
<!-- 练习12.2: 根据薪资查询员工信息 -->
<select id="findAllBySal2" resultType="com.tedu.pojo.Emp">
	select * from emp
	<where>
		<if test="minSal != null">
			and salary>#{minSal}
		</if>
		<if test="maxSal != null">
			and salary <![CDATA[ < ]]> #{maxSal} 
		</if>
	</where> 
</select>
java代码示例:查询薪资大于3000和小于5000的员工
/*----------- 动态SQL ----------- * if标签: 判断若为true, 则执行if中的sql片段 * where标签: 生成where关键字, 对其中多余的连接词 * 进行处理 * set标签: 生产set关键字, 对其中多余的连接符进行处理 * set 列1=值1, 列2=值2 * foreach标签: 进行循环遍历, 比如实现批量删除 */

/** * 练习12: 根据薪资查询员工信息 * 如果参数有 minSal、maxSal, 则 * ... where salary > minSal and salary < maxSal * 如果参数中只有minSal, 则 * ... where salary > minSal * 如果参数中只有maxSal, 则 * ... where salary < maxSal * 如果没有参数, 则不执行where子句, 默认查询所有员工 */
@Test
public void testFindAllBySal() {
	//封装参数到map集合中
	Map map = new HashMap();
	map.put("minSal", 3000);
	map.put("maxSal", 5000.0);
	List<Emp> list = session.selectList(
				"EmpMapper.findAllBySal2", map);
	for (Emp emp : list) {
		System.out.println( emp );
	}
}

5.2 set元素

set 元素用于对包含在其中的SQL语句进行检索,
在需要时可以剔除其中多余的连接符(比如逗号),并且在需要时可以添加set关键词。
示例:修改emp表中指定id的员工信息,如果传递了name、job、salary列的值,则修改,否则不修改

mapper文件配置:
<!-- 练习13: 根据参数传输与否,修改表中的列 -->
<update id="update3">
	update emp
	<set>
		<if test="name != null">
			name=#{name}, 
		</if>
		<if test="job != null">
			job=#{job}, 
		</if>
		<if test="salary != null">
			salary=#{salary} 
		</if>
	</set>
	where id=#{id}
</update>
java代码示例:
/** 练习13: 根据参数传输与否,修改表中的列 * 如果传输了 name, job, salary * 则修改对应的列, 否则就不修改! */
@Test
public void testUpdate3() {
	Emp emp = new Emp();
	emp.setId( 8 );
	emp.setName("马云");
	emp.setJob("教师");
	emp.setSalary(2200d);
	int rows = session.update(
				"EmpMapper.update3", emp);
	//提交事务
	session.commit();
	System.out.println("影响的行数: "+rows);
}

可以尝试不传递name或job或salary中的某些值,运行程序,查询修改后的结果!!

5.3 foreach元素

mapper文件配置:
<!-- 练习14: 根据员工的id批量删除员工信息 delete from emp where id in (1,3,5,7) -->
<update id="deleteByIds">
	delete from emp where id in
	<foreach collection="array" open="(" item="id" separator="," close=")">
		#{id}
	</foreach>
</update>
Java代码示例: 
/** 练习14: 根据员工的id批量删除员工信息 */
@Test
public void testDeleteByIds() {
	Integer[] ids = { 1, 3, 5, 7 };
	int rows = session.update(
				"EmpMapper.deleteByIds", ids);
	session.commit();
	System.out.println("影响的行数: "+rows);
}

/** 练习15(自己完成): 根据员工的id批量查询员工信息 * Integer[] ids = [2,4,6,8]; */
@Test
public void testFindByIds() {
	
}