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() {
}