使用MyBatis动态SQL的if元素,按部门做条件查询EMP员工信息表。
if元素使用语法如下:
<select …>
SQL语句1
<if test=“条件表达式”>
SQL语句2
</if>
</select>
实现此案例需要按照如下步骤进行。
步骤一:创建项目
复制项目SpringUnit01,创建项目SpringUnit02。
步骤二:增加根据部门查询员工的方法
创建封装查询条件的类Condition,代码如下:
package com.tarena.entity; import java.util.List; public class Condition { private Integer deptno; private Double salary; private List<Integer> empnos; public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public List<Integer> getEmpnos() { return empnos; } public void setEmpnos(List<Integer> empnos) { this.empnos = empnos; } }
在EmpDao接口中增加方法findByDept,代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); #cold_bold List<Emp> findByDept(Condition cond); }
步骤三:实现根据部门查询员工
在EmpMapper.xml中增加根据部门查询员工的SQL,代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 其他配置略 --> #cold_bold <!-- if --> #cold_bold <!-- 查询部门下的所有员工 --> #cold_bold <select id="findByDept" #cold_bold parameterType="com.tarena.entity.Condition" #cold_bold resultType="com.tarena.entity.Emp"> #cold_bold select * from t_emp #cold_bold <if test="deptno != null"> #cold_bold where deptno=#{deptno} #cold_bold </if> #cold_bold </select> </mapper>
步骤四:测试根据部门查询员工的方法
在TestEmpDao中,增加测试方法testFindByDept,代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { //其他方法略 #cold_bold /** #cold_bold * 根据部门查询员工 #cold_bold */ #cold_bold @Test #cold_bold public void testFindByDept() { #cold_bold ApplicationContext ctx = #cold_bold new ClassPathXmlApplicationContext("applicationContext.xml"); #cold_bold EmpDao dao = ctx.getBean(EmpDao.class); #cold_bold Condition cond = new Condition(); #cold_bold cond.setDeptno(10); #cold_bold List<Emp> list = dao.findByDept(cond); #cold_bold for(Emp e : list) { #cold_bold System.out.println( #cold_bold e.getEmpno() + " " + #cold_bold e.getEname() + " " + #cold_bold e.getJob() #cold_bold ); #cold_bold } #cold_bold } }
Condition完整代码如下:
package com.tarena.entity; import java.util.List; public class Condition { private Integer deptno; private Double salary; private List<Integer> empnos; public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public List<Integer> getEmpnos() { return empnos; } public void setEmpnos(List<Integer> empnos) { this.empnos = empnos; } }
EmpDao完整代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); }
EmpMapper.xml完整代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 查询全部的员工 --> <select id="findAll" resultType="com.tarena.entity.Emp"> select * from t_emp </select> <!-- if --> <!-- 查询部门下的所有员工 --> <select id="findByDept" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <if test="deptno != null"> where deptno=#{deptno} </if> </select> </mapper>
TestEmpDao完整代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { /** * 测试查询全部员工 */ @Test public void testFindAll() { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); List<Emp> list = dao.findAll(); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 根据部门查询员工 */ @Test public void testFindByDept() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(10); List<Emp> list = dao.findByDept(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } }
使用MyBatis动态SQL的choose元素,按工资做条件查询EMP员工信息表。
choose元素使用语法如下:
<select …>
SQL语句1
<choose>
<when test=”条件表达式”>
SQL语句2
</when>
<otherwise>
SQL语句3
</otherwise>
</choose>
</select>
实现此案例需要按照如下步骤进行。
步骤一:增加根据工资查询员工的方法
在EmpDao中增加方法findBySalary,代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); #cold_bold List<Emp> findBySalary(Condition cond); }
步骤二:实现根据工资查询员工
在EmpMapper.xml中增加根据工资查询员工的SQL,代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 其他配置略 --> #cold_bold <!-- choose --> #cold_bold <!-- 查询大于当前收入的员工 --> #cold_bold <select id="findBySalary" #cold_bold parameterType="com.tarena.entity.Condition" #cold_bold resultType="com.tarena.entity.Emp"> #cold_bold select * from t_emp #cold_bold <choose> #cold_bold <when test="salary > 3000"> #cold_bold where sal>#{salary} #cold_bold </when> #cold_bold <otherwise> #cold_bold where sal>=3000 #cold_bold </otherwise> #cold_bold </choose> #cold_bold </select> </mapper>
步骤三:测试根据工资查询员工的方法
在TestEmpDao中增加方法testFindBySalary,代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { //其他方法略 #cold_bold /** #cold_bold * 查询大于当前收入的员工 #cold_bold */ #cold_bold @Test #cold_bold public void testFindBySalary() { #cold_bold ApplicationContext ctx = #cold_bold new ClassPathXmlApplicationContext("applicationContext.xml"); #cold_bold EmpDao dao = ctx.getBean(EmpDao.class); #cold_bold Condition cond = new Condition(); #cold_bold cond.setSalary(4000.0); #cold_bold List<Emp> list = dao.findBySalary(cond); #cold_bold for(Emp e : list) { #cold_bold System.out.println( #cold_bold e.getEmpno() + " " + #cold_bold e.getEname() + " " + #cold_bold e.getJob() #cold_bold ); #cold_bold } #cold_bold } }
EmpDao完整代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); }
EmpMapper.xml完整代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 查询全部的员工 --> <select id="findAll" resultType="com.tarena.entity.Emp"> select * from t_emp </select> <!-- if --> <!-- 查询部门下的所有员工 --> <select id="findByDept" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <if test="deptno != null"> where deptno=#{deptno} </if> </select> <!-- choose --> <!-- 查询大于当前收入的员工 --> <select id="findBySalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <choose> <when test="salary > 3000"> where sal>#{salary} </when> <otherwise> where sal>=3000 </otherwise> </choose> </select> </mapper>
TestEmpDao完整代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { /** * 测试查询全部员工 */ @Test public void testFindAll() { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); List<Emp> list = dao.findAll(); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 根据部门查询员工 */ @Test public void testFindByDept() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(10); List<Emp> list = dao.findByDept(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询大于当前收入的员工 */ @Test public void testFindBySalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setSalary(4000.0); List<Emp> list = dao.findBySalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } }
使用MyBatis动态SQL的where元素,查询当前部门下大于指定工资的员工。
where元素的使用语法如下:
<select …>
select 字段 from 表
<where>
动态追加条件
</where>
</select>
实现此案例需要按照如下步骤进行。
步骤一:增加根据部门和工资查询员工的方法
在EmpDao中增加方法findByDeptAndSalary,代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); #cold_bold List<Emp> findByDeptAndSalary(Condition cond); }
步骤二:实现根据部门和工资查询员工的方法
在EmpMapper.xml中增加根据部门和工资查询员工的SQL,代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 其他配置略 --> #cold_bold <!-- where --> #cold_bold <!-- 查询当前部门下,大于当前收入的员工 --> #cold_bold <select id="findByDeptAndSalary" #cold_bold parameterType="com.tarena.entity.Condition" #cold_bold resultType="com.tarena.entity.Emp"> #cold_bold select * from t_emp #cold_bold <where> #cold_bold <if test="deptno != null"> #cold_bold and deptno=#{deptno} #cold_bold </if> #cold_bold <if test="salary != null"> #cold_bold and sal>#{salary} #cold_bold </if> #cold_bold </where> #cold_bold </select> </mapper>
步骤三:测试根据部门和工资查询员工的方法
在TestEmpDao中,增加测试方法testFindByDeptAndSalary,代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; //其他方法略 #cold_bold /** #cold_bold * 查询当前部门下,大于当前收入的员工 #cold_bold */ #cold_bold @Test #cold_bold public void testFindByDeptAndSalary() { #cold_bold ApplicationContext ctx = #cold_bold new ClassPathXmlApplicationContext("applicationContext.xml"); #cold_bold EmpDao dao = ctx.getBean(EmpDao.class); #cold_bold Condition cond = new Condition(); #cold_bold cond.setDeptno(20); #cold_bold cond.setSalary(2000.0); #cold_bold List<Emp> list = dao.findByDeptAndSalary(cond); #cold_bold for(Emp e : list) { #cold_bold System.out.println( #cold_bold e.getEmpno() + " " + #cold_bold e.getEname() + " " + #cold_bold e.getJob() #cold_bold ); #cold_bold } #cold_bold } }
EmpDao完整代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); List<Emp> findByDeptAndSalary(Condition cond); }
EmpMapper.xml完整代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 查询全部的员工 --> <select id="findAll" resultType="com.tarena.entity.Emp"> select * from t_emp </select> <!-- if --> <!-- 查询部门下的所有员工 --> <select id="findByDept" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <if test="deptno != null"> where deptno=#{deptno} </if> </select> <!-- choose --> <!-- 查询大于当前收入的员工 --> <select id="findBySalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <choose> <when test="salary > 3000"> where sal>#{salary} </when> <otherwise> where sal>=3000 </otherwise> </choose> </select> <!-- where --> <!-- 查询当前部门下,大于当前收入的员工 --> <select id="findByDeptAndSalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <where> <if test="deptno != null"> and deptno=#{deptno} </if> <if test="salary != null"> and sal>#{salary} </if> </where> </select> </mapper>
TestEmpDao完整代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { /** * 测试查询全部员工 */ @Test public void testFindAll() { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); List<Emp> list = dao.findAll(); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 根据部门查询员工 */ @Test public void testFindByDept() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(10); List<Emp> list = dao.findByDept(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询大于当前收入的员工 */ @Test public void testFindBySalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setSalary(4000.0); List<Emp> list = dao.findBySalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询当前部门下,大于当前收入的员工 */ @Test public void testFindByDeptAndSalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(20); cond.setSalary(2000.0); List<Emp> list = dao.findByDeptAndSalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } }
使用MyBatis动态SQL的set元素,实现更新员工。
set元素使用语法如下:
<update …>
update 表
<set>
动态追加更新字段
</set>
</update>
实现此案例需要按照如下步骤进行。
步骤一:增加更新员工的方法
在EmpDao中增加更新员工的方法,代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); List<Emp> findByDeptAndSalary(Condition cond); #cold_bold void update(Emp emp); }
步骤二:实现更新员工的方法
在EmpMapper.xml中增加更新员工的SQL,代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 其他配置略 --> #cold_bold <!-- set --> #cold_bold <!-- 更新员工 --> #cold_bold <update id="update" #cold_bold parameterType="com.tarena.entity.Emp"> #cold_bold update t_emp #cold_bold <set> #cold_bold <if test="ename!=null"> #cold_bold ename=#{ename}, #cold_bold </if> #cold_bold <if test="job!=null"> #cold_bold job=#{job}, #cold_bold </if> #cold_bold </set> #cold_bold where empno=#{empno} #cold_bold </update> </mapper>
步骤三:测试更新员工的方法
在TestEmpDao中增加测试更新员工的方法,代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { //其他方法略 #cold_bold /** #cold_bold * 更新员工 #cold_bold */ #cold_bold @Test #cold_bold public void testUpdate() { #cold_bold ApplicationContext ctx = #cold_bold new ClassPathXmlApplicationContext("applicationContext.xml"); #cold_bold EmpDao dao = ctx.getBean(EmpDao.class); #cold_bold Emp e = new Emp(); #cold_bold e.setEmpno(14); #cold_bold e.setEname("Leo"); #cold_bold dao.update(e); #cold_bold } }
EmpDao完整代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); List<Emp> findByDeptAndSalary(Condition cond); void update(Emp emp); }
EmpMapper.xml完整代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 查询全部的员工 --> <select id="findAll" resultType="com.tarena.entity.Emp"> select * from t_emp </select> <!-- if --> <!-- 查询部门下的所有员工 --> <select id="findByDept" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <if test="deptno != null"> where deptno=#{deptno} </if> </select> <!-- choose --> <!-- 查询大于当前收入的员工 --> <select id="findBySalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <choose> <when test="salary > 3000"> where sal>#{salary} </when> <otherwise> where sal>=3000 </otherwise> </choose> </select> <!-- where --> <!-- 查询当前部门下,大于当前收入的员工 --> <select id="findByDeptAndSalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <where> <if test="deptno != null"> and deptno=#{deptno} </if> <if test="salary != null"> and sal>#{salary} </if> </where> </select> <!-- set --> <!-- 更新员工 --> <update id="update" parameterType="com.tarena.entity.Emp"> update t_emp <set> <if test="ename!=null"> ename=#{ename}, </if> <if test="job!=null"> job=#{job}, </if> </set> where empno=#{empno} </update> </mapper>
TestEmpDao完整代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { /** * 测试查询全部员工 */ @Test public void testFindAll() { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); List<Emp> list = dao.findAll(); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 根据部门查询员工 */ @Test public void testFindByDept() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(10); List<Emp> list = dao.findByDept(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询大于当前收入的员工 */ @Test public void testFindBySalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setSalary(4000.0); List<Emp> list = dao.findBySalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询当前部门下,大于当前收入的员工 */ @Test public void testFindByDeptAndSalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(20); cond.setSalary(2000.0); List<Emp> list = dao.findByDeptAndSalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 更新员工 */ @Test public void testUpdate() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Emp e = new Emp(); e.setEmpno(14); e.setEname("Leo"); dao.update(e); } }
使用MyBatis动态SQL的trim元素代替where和set,重写findByDeptAndSalary和update方法。
trim元素使用语法如下:
<!– 等价于where元素 -->
<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
</trim>
<!– 等价于set元素 -->
<trim prefix="SET" suffixOverrides=",">
…
</trim>
实现此案例需要按照如下步骤进行。
步骤一:重新增加根据部门和工资查询员工的方法,以及更新员工的方法
在EmpDao中增加findByDeptAndSalary2和update2方法,代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); List<Emp> findByDeptAndSalary(Condition cond); void update(Emp emp); #cold_bold List<Emp> findByDeptAndSalary2(Condition cond); #cold_bold #cold_bold void update2(Emp emp); }
步骤二:重新实现根据部门和工资查询员工的方法,以及更新员工的方法
在EmpMapper.xml中,实现findByDeptAndSalary2和update2,代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 其他配置略 --> #cold_bold <!-- 使用trim代替where --> #cold_bold <!-- 查询当前部门下,大于当前收入的员工 --> #cold_bold <select id="findByDeptAndSalary2" #cold_bold parameterType="com.tarena.entity.Condition" #cold_bold resultType="com.tarena.entity.Emp"> #cold_bold select * from t_emp #cold_bold <trim prefix="where" prefixOverrides="and"> #cold_bold <if test="deptno != null"> #cold_bold and deptno=#{deptno} #cold_bold </if> #cold_bold <if test="salary != null"> #cold_bold and sal>#{salary} #cold_bold </if> #cold_bold </trim> #cold_bold </select> #cold_bold #cold_bold <!-- 使用trim代替set --> #cold_bold <update id="update2" #cold_bold parameterType="com.tarena.entity.Emp"> #cold_bold update t_emp #cold_bold <trim prefix="set" suffixOverrides=","> #cold_bold <if test="ename!=null"> #cold_bold ename=#{ename}, #cold_bold </if> #cold_bold <if test="job!=null"> #cold_bold job=#{job}, #cold_bold </if> #cold_bold </trim> #cold_bold where empno=#{empno} #cold_bold </update> </mapper>
步骤三:重新测试根据部门和工资查询员工的方法,以及更新员工的方法
在TestEmpDao中,增加测试findByDeptAndSalary2和update2方法,代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { //其他方法略 #cold_bold /** #cold_bold * 查询当前部门下,大于当前收入的员工 #cold_bold */ #cold_bold @Test #cold_bold public void testFindByDeptAndSalary2() { #cold_bold ApplicationContext ctx = #cold_bold new ClassPathXmlApplicationContext("applicationContext.xml"); #cold_bold EmpDao dao = ctx.getBean(EmpDao.class); #cold_bold Condition cond = new Condition(); #cold_bold cond.setDeptno(20); #cold_bold cond.setSalary(2000.0); #cold_bold List<Emp> list = dao.findByDeptAndSalary2(cond); #cold_bold for(Emp e : list) { #cold_bold System.out.println( #cold_bold e.getEmpno() + " " + #cold_bold e.getEname() + " " + #cold_bold e.getJob() #cold_bold ); #cold_bold } #cold_bold } #cold_bold #cold_bold /** #cold_bold * 更新员工 #cold_bold */ #cold_bold @Test #cold_bold public void testUpdate2() { #cold_bold ApplicationContext ctx = #cold_bold new ClassPathXmlApplicationContext("applicationContext.xml"); #cold_bold EmpDao dao = ctx.getBean(EmpDao.class); #cold_bold Emp e = new Emp(); #cold_bold e.setEmpno(14); #cold_bold e.setEname("Lee"); #cold_bold dao.update2(e); #cold_bold } }
EmpDao完整代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); List<Emp> findByDeptAndSalary(Condition cond); void update(Emp emp); List<Emp> findByDeptAndSalary2(Condition cond); void update2(Emp emp); }
EmpMapper.xml完整代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 查询全部的员工 --> <select id="findAll" resultType="com.tarena.entity.Emp"> select * from t_emp </select> <!-- if --> <!-- 查询部门下的所有员工 --> <select id="findByDept" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <if test="deptno != null"> where deptno=#{deptno} </if> </select> <!-- choose --> <!-- 查询大于当前收入的员工 --> <select id="findBySalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <choose> <when test="salary > 3000"> where sal>#{salary} </when> <otherwise> where sal>=3000 </otherwise> </choose> </select> <!-- where --> <!-- 查询当前部门下,大于当前收入的员工 --> <select id="findByDeptAndSalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <where> <if test="deptno != null"> and deptno=#{deptno} </if> <if test="salary != null"> and sal>#{salary} </if> </where> </select> <!-- set --> <!-- 更新员工 --> <update id="update" parameterType="com.tarena.entity.Emp"> update t_emp <set> <if test="ename!=null"> ename=#{ename}, </if> <if test="job!=null"> job=#{job}, </if> </set> where empno=#{empno} </update> <!-- 使用trim代替where --> <!-- 查询当前部门下,大于当前收入的员工 --> <select id="findByDeptAndSalary2" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <trim prefix="where" prefixOverrides="and"> <if test="deptno != null"> and deptno=#{deptno} </if> <if test="salary != null"> and sal>#{salary} </if> </trim> </select> <!-- 使用trim代替set --> <update id="update2" parameterType="com.tarena.entity.Emp"> update t_emp <trim prefix="set" suffixOverrides=","> <if test="ename!=null"> ename=#{ename}, </if> <if test="job!=null"> job=#{job}, </if> </trim> where empno=#{empno} </update> </mapper>
TestEmpDao完整代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { /** * 测试查询全部员工 */ @Test public void testFindAll() { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); List<Emp> list = dao.findAll(); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 根据部门查询员工 */ @Test public void testFindByDept() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(10); List<Emp> list = dao.findByDept(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询大于当前收入的员工 */ @Test public void testFindBySalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setSalary(4000.0); List<Emp> list = dao.findBySalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询当前部门下,大于当前收入的员工 */ @Test public void testFindByDeptAndSalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(20); cond.setSalary(2000.0); List<Emp> list = dao.findByDeptAndSalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 更新员工 */ @Test public void testUpdate() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Emp e = new Emp(); e.setEmpno(14); e.setEname("Leo"); dao.update(e); } /** * 查询当前部门下,大于当前收入的员工 */ @Test public void testFindByDeptAndSalary2() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(20); cond.setSalary(2000.0); List<Emp> list = dao.findByDeptAndSalary2(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 更新员工 */ @Test public void testUpdate2() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Emp e = new Emp(); e.setEmpno(14); e.setEname("Lee"); dao.update2(e); } }
使用MyBatis动态SQL的foreach元素,实现根据一组员工ID查询员工。
foreach元素使用语法如下:
<select …>
select 字段 from 表 where 字段 in
<foreach collection=“集合” item=“迭代变量"
open="(" separator="," close=")">
#{迭代变量}
</foreach>
</select>
实现此案例需要按照如下步骤进行。
步骤一:增加根据一组员工ID查询员工的方法
在EmpDao中增加根据一组员工ID查询员工的方法,代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); List<Emp> findByDeptAndSalary(Condition cond); void update(Emp emp); List<Emp> findByDeptAndSalary2(Condition cond); void update2(Emp emp); #cold_bold List<Emp> findByIds(Condition cond); }
步骤二:实现根据一组员工ID查询员工的方法
在EmpMapper.xml中增加根据一组员工ID查询员工的SQL,代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 其他配置略 --> #cold_bold <!-- foreach --> #cold_bold <!-- 根据ID查询员工 --> #cold_bold <select id="findByIds" #cold_bold parameterType="com.tarena.entity.Condition" #cold_bold resultType="com.tarena.entity.Emp"> #cold_bold select * from t_emp where empno in #cold_bold <foreach collection="empnos" #cold_bold open="(" close=")" separator="," item="id"> #cold_bold #{id} #cold_bold </foreach> #cold_bold </select> </mapper>
步骤三:测试根据一组员工ID查询员工的方法
在TestEmpDao中增加测试findByIds的方法,代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { //其他方法略 #cold_bold /** #cold_bold * 根据员工ID查询员工 #cold_bold */ #cold_bold @Test #cold_bold public void testFindByIds() { #cold_bold ApplicationContext ctx = #cold_bold new ClassPathXmlApplicationContext("applicationContext.xml"); #cold_bold EmpDao dao = ctx.getBean(EmpDao.class); #cold_bold List<Integer> ids = new ArrayList<Integer>(); #cold_bold ids.add(3); #cold_bold ids.add(7); #cold_bold ids.add(8); #cold_bold Condition cond = new Condition(); #cold_bold cond.setEmpnos(ids); #cold_bold List<Emp> list = dao.findByIds(cond); #cold_bold for(Emp e : list) { #cold_bold System.out.println( #cold_bold e.getEmpno() + " " + #cold_bold e.getEname() + " " + #cold_bold e.getJob() #cold_bold ); #cold_bold } #cold_bold } }
EmpDao完整代码如下:
package com.tarena.dao; import java.util.List; import com.tarena.annotation.MyBatisRepository; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * 员工表的DAO组件 */ @MyBatisRepository public interface EmpDao { List<Emp> findAll(); List<Emp> findByDept(Condition cond); List<Emp> findBySalary(Condition cond); List<Emp> findByDeptAndSalary(Condition cond); void update(Emp emp); List<Emp> findByDeptAndSalary2(Condition cond); void update2(Emp emp); List<Emp> findByIds(Condition cond); }
EmpMapper.xml完整代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.tarena.dao.EmpDao"> <!-- 查询全部的员工 --> <select id="findAll" resultType="com.tarena.entity.Emp"> select * from t_emp </select> <!-- if --> <!-- 查询部门下的所有员工 --> <select id="findByDept" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <if test="deptno != null"> where deptno=#{deptno} </if> </select> <!-- choose --> <!-- 查询大于当前收入的员工 --> <select id="findBySalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <choose> <when test="salary > 3000"> where sal>#{salary} </when> <otherwise> where sal>=3000 </otherwise> </choose> </select> <!-- where --> <!-- 查询当前部门下,大于当前收入的员工 --> <select id="findByDeptAndSalary" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <where> <if test="deptno != null"> and deptno=#{deptno} </if> <if test="salary != null"> and sal>#{salary} </if> </where> </select> <!-- set --> <!-- 更新员工 --> <update id="update" parameterType="com.tarena.entity.Emp"> update t_emp <set> <if test="ename!=null"> ename=#{ename}, </if> <if test="job!=null"> job=#{job}, </if> </set> where empno=#{empno} </update> <!-- 使用trim代替where --> <!-- 查询当前部门下,大于当前收入的员工 --> <select id="findByDeptAndSalary2" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp <trim prefix="where" prefixOverrides="and"> <if test="deptno != null"> and deptno=#{deptno} </if> <if test="salary != null"> and sal>#{salary} </if> </trim> </select> <!-- 使用trim代替set --> <update id="update2" parameterType="com.tarena.entity.Emp"> update t_emp <trim prefix="set" suffixOverrides=","> <if test="ename!=null"> ename=#{ename}, </if> <if test="job!=null"> job=#{job}, </if> </trim> where empno=#{empno} </update> <!-- foreach --> <!-- 根据ID查询员工 --> <select id="findByIds" parameterType="com.tarena.entity.Condition" resultType="com.tarena.entity.Emp"> select * from t_emp where empno in <foreach collection="empnos" open="(" close=")" separator="," item="id"> #{id} </foreach> </select> </mapper>
TestEmpDao完整代码如下:
package com.tarena.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tarena.dao.EmpDao; import com.tarena.entity.Condition; import com.tarena.entity.Emp; /** * EmpDao测试类 */ public class TestEmpDao { /** * 测试查询全部员工 */ @Test public void testFindAll() { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); List<Emp> list = dao.findAll(); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 根据部门查询员工 */ @Test public void testFindByDept() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(10); List<Emp> list = dao.findByDept(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询大于当前收入的员工 */ @Test public void testFindBySalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setSalary(4000.0); List<Emp> list = dao.findBySalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 查询当前部门下,大于当前收入的员工 */ @Test public void testFindByDeptAndSalary() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(20); cond.setSalary(2000.0); List<Emp> list = dao.findByDeptAndSalary(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 更新员工 */ @Test public void testUpdate() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Emp e = new Emp(); e.setEmpno(14); e.setEname("Leo"); dao.update(e); } /** * 查询当前部门下,大于当前收入的员工 */ @Test public void testFindByDeptAndSalary2() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Condition cond = new Condition(); cond.setDeptno(20); cond.setSalary(2000.0); List<Emp> list = dao.findByDeptAndSalary2(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } /** * 更新员工 */ @Test public void testUpdate2() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); Emp e = new Emp(); e.setEmpno(14); e.setEname("Lee"); dao.update2(e); } /** * 根据员工ID查询员工 */ @Test public void testFindByIds() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDao dao = ctx.getBean(EmpDao.class); List<Integer> ids = new ArrayList<Integer>(); ids.add(3); ids.add(7); ids.add(8); Condition cond = new Condition(); cond.setEmpnos(ids); List<Emp> list = dao.findByIds(cond); for(Emp e : list) { System.out.println( e.getEmpno() + " " + e.getEname() + " " + e.getJob() ); } } }