_分步查询传递多列值&fetchType_discriminator鉴别器
笔记要点
出错分析与总结
Department.java bean
public class Department { private Integer id; private String departmentName; private List<Employee> emps; }
DepartmentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dao.DepartmentMapper"> <!--public Department getDeptById(Integer id);--> <select id="getDeptById" resultType="com.bean.Department"> select id,dept_name departmentName from tbl_dept where id=#{id} </select> <!--==========================================================================================--> <!-- public class Department { private Integer id; private String departmentName; private List<Employee> emps; } JavaBean中: did dept_name || eid last_name email gender --> <!--public Department getDeptByIdPlus(Integer id);--> <!--进行collection的联合查询/ 分步查询和延迟查询 --> <resultMap id="MyDept" type="com.bean.Department"> <id column="did" property="id"/> <result column="dept_name" property="departmentName"/> <!-- collection 用于定义关联集合类型的属性的封装规则! ofType用于指定集合中的类型;--> <collection property="emps" ofType="com.bean.Employee"> <id column="eid" property="id"/> <result column="last_name" property="lastName"/> <result column="email" property="email"/> <result column="gender" property="gender"/> </collection> </resultMap> <select id="getDeptByIdPlus" resultMap="MyDept"> SELECT d.id did,d.dept_name dept_name,e.id eid,e.last_name last_name,e.email email,gender FROM tbl_dept d LEFT JOIN tbl_employee e ON d.id=e.d_id WHERE d.id=#{id}; </select> <!--========================================--> <!--Department中有属性: private List<Employee> emps; public Department getDeptByIdStep(Integer id); //执行Collection 的分步查询--> <resultMap id="MyDeptStep" type="com.bean.Department"> <id column="id" property="id"/> <result column="detp_name" property="departmentName"/> <collection property="emps" select="com.dao.EmployeeMapperPlus.getEmpsByDeptId" column="{deptId=id}" fetchType="lazy"> </collection> </resultMap> <select id="getDeptByIdStep" resultMap="MyDeptStep"> select id,dept_name departmentName from tbl_dept where id=#{id} </select> <!--=======================================--> <!--扩展,将多列的值传递过去,封装成map进行传递! column="{key1=列1,key2=列2}" fetchType="lazy" ,标识使用延迟加载; -lazy: 延迟; -eager:立即; --> </mapper>
测试
public class test_tp36 { public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test08() throws Exception { SqlSession openSession = getSqlSessionFactory().openSession(); try { EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class); System.out.println("---tp_37-使用鉴别器-"); Employee emp = mapper.getEmpByIdStep(1); //测试为女生 ,gender=0 System.out.println(emp); emp = mapper.getEmpByIdStep(4); //测试为男生,gender=1 System.out.println(emp); openSession.commit();//默认是不自动提交数据的,需要我们自己手动提交 } finally { openSession.close(); } } }
测试结果:
---tp_37-使用鉴别器- DEBUG 12-04 13:10:50,471 ==> Preparing: select id,last_name,gender,email,d_id from tbl_employee where id = ? (BaseJdbcLogger.java:145) DEBUG 12-04 13:10:50,488 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 12-04 13:10:50,498 <== Total: 1 (BaseJdbcLogger.java:145) Employee{id=1, lastName='jerry', email='jerry', gender='1', dept=null} DEBUG 12-04 13:10:50,499 ==> Preparing: select id,last_name,gender,email,d_id from tbl_employee where id = ? (BaseJdbcLogger.java:145) DEBUG 12-04 13:10:50,499 ==> Parameters: 4(Integer) (BaseJdbcLogger.java:145) DEBUG 12-04 13:10:50,558 <== Total: 1 (BaseJdbcLogger.java:145) DEBUG 12-04 13:10:50,558 ==> Preparing: select id,dept_name departmentName from tbl_dept where id=? (BaseJdbcLogger.java:145) DEBUG 12-04 13:10:50,558 ==> Parameters: 2(Integer) (BaseJdbcLogger.java:145) DEBUG 12-04 13:10:50,561 <== Total: 1 (BaseJdbcLogger.java:145) Employee{id=4, lastName='葫芦娃', email='葫芦娃@163.com', gender='0', dept=Department{id=2, departmentName='测试部'}}