以下是有關collection多對一的使用(以部門和員工爲例)
部門的實體類
private Integer id; //部門編號
private String departmentName; //部門名稱
private List<Employee> employees;//部門和員工是多對一的關係
..
員工的實體類
private Integer id;
// 不能被修改
private String lastname;
private String email;
// 從前端傳入的是 String 類型, 所以需要注意轉換
private Date birth;
// 不能被修改
private Date createtime;
//添加頭像
private String emp_image;
// 單向 n-1 的關聯關係
private Department department;
..
DepartmentMapper.xml文件 嵌套結果集的形式
<!--//根據di查詢出部門信息
Department getDeptByidPlus(Integer id); -->
<resultMap type="com.ldp.mybatis.bean.Department" id="dept_emp">
<!-- 定義主鍵 -->
<id column="id" property="id"/>
<!-- 普通字段 -->
<result column="departmentName" property="departmentName"/>
<!-- 下面是關聯查詢
collection:多對一使用該標籤
property="employees"在部門pojo中屬性名名稱
ofType:代表集合中的對象
-->
<collection property="employees" ofType="com.ldp.mybatis.bean.Employee">
<!-- 主鍵 -->
<id column="eid" property="id"/>
<!-- 普通字段 -->
<result column="lastname" property="lastname"/>
<result column="email" property="email"/>
<result column="birth" property="birth"/>
<result column="createtime" property="createtime"/>
<result column="emp_image" property="emp_image"/>
<!-- 查詢出來的是 department_id 所以屬性中的也需要department.id點一下-->
<result column="department_id" property="department.id"/>
</collection>
</resultMap>
<select id="getDeptByidPlus" parameterType="int" resultMap="dept_emp">
SELECT
d.`id`,
d.`departmentName`,
e.`id` eid,
e.`birth`,
e.`createtime`,
e.`department_id`,
e.`email`,
e.`emp_image`,
e.`lastname`
FROM
`department` d LEFT JOIN employee e
ON d.`id`=e.`department_id`
WHERE d.`id`=#{id};
</select>
/**
* 測試多對一
* @throws IOException
*/
@Test
public void test01() throws IOException {
//首先獲得SqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//獲得sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
try {
DepartmentMapper departmentMapper = sqlSession.getMapper(DepartmentMapper.class);
//進行查詢
Department department = departmentMapper.getDeptByidPlus(1);
System.out.println(department);
List<Employee> list=department.getEmployees();
for (Employee employee : list) {
System.out.println(employee);
}
} finally {
sqlSession.close();
}
}
測試的結果
DEBUG 04-15 19:38:54,444 ==> Preparing: SELECT d.`id`, d.`departmentName`, e.`id` eid, e.`birth`, e.`createtime`, e.`department_id`, e.`email`, e.`emp_image`, e.`lastname` FROM `department` d LEFT JOIN employee e ON d.`id`=e.`department_id` WHERE d.`id`=?; (BaseJdbcLogger.java:145)
DEBUG 04-15 19:38:54,542 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 04-15 19:38:54,592 <== Total: 4 (BaseJdbcLogger.java:145)
Department [id=1, departmentName=行政部]
Employee [id=7, lastname=劉東平7, [email protected], birth=Wed Mar 27 00:00:00 CST 2019, createtime=Wed Mar 27 20:01:59 CST 2019, emp_image=C:/upload/14/2/f0312f6e638248058eaebae3f4d8952f.jpg, department=Department [id=1, departmentName=null]]
Employee [id=201, lastname=楊峯, [email protected], birth=Mon Apr 15 11:44:26 CST 2019, createtime=Mon Apr 15 11:34:26 CST 2019, emp_image=null, department=Department [id=1, departmentName=null]]
Employee [id=202, lastname=楊峯, [email protected], birth=Mon Apr 15 14:40:48 CST 2019, createtime=Mon Apr 15 14:40:48 CST 2019, emp_image=null, department=Department [id=1, departmentName=null]]
Employee [id=203, lastname=楊峯, [email protected], birth=Mon Apr 15 14:42:17 CST 2019, createtime=Mon Apr 15 14:42:17 CST 2019, emp_image=null, department=Department [id=1, departmentName=null]]
利用collection分步查詢
com.ldp.mybatis.dao.EmployeeMapper 下面定義一個根據部門id查詢員工信息的配置信息
<select id="getBydeptId" parameterType="int" resultType="com.ldp.mybatis.bean.Employee">
select * from employee where department_id=#{department_id};
</select>
在com.ldp.mybatis.dao.DepartmentMapper.xml 下面的定義信息
<!-- //collection進分步查詢出數據
Department getDeptBySept(Integer id); -->
<resultMap type="com.ldp.mybatis.bean.Department" id="dept_emp_sept">
<!-- 定義主鍵 -->
<id column="id" property="id"/>
<!-- 普通字段 -->
<result column="departmentName" property="departmentName"/>
<!-- 下面是關聯查詢
collection:多對一使用該標籤
property="employees"在部門pojo中屬性名名稱
ofType:代表集合中的對象
-->
<collection property="employees" select="com.ldp.mybatis.dao.EmployeeMapper.getBydeptId" column="id"></collection>
</resultMap>
<!-- 定義的查詢方法 -->
<select id="getDeptBySept" parameterType="int" resultMap="dept_emp_sept">
select * from department where id=#{id}
</select>
/**
* 測試多對一(利用分步查詢的方式)
* @throws IOException
*/
@Test
public void test02() throws IOException {
//首先獲得SqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//獲得sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
try {
DepartmentMapper departmentMapper = sqlSession.getMapper(DepartmentMapper.class);
//進行查詢
Department department = departmentMapper.getDeptBySept(1);
System.out.println(department);
List<Employee> list=department.getEmployees();
for (Employee employee : list) {
System.out.println(employee);
}
} finally {
sqlSession.close();
}
}
查詢結果:會有兩條SQL語句
DEBUG 04-15 20:02:35,029 ==> Preparing: select * from department where id=? (BaseJdbcLogger.java:145)
DEBUG 04-15 20:02:35,119 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 04-15 20:02:35,441 <== Total: 1 (BaseJdbcLogger.java:145)
DEBUG 04-15 20:02:35,444 ==> Preparing: select * from employee where department_id=?; (BaseJdbcLogger.java:145)
DEBUG 04-15 20:02:35,446 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 04-15 20:02:35,456 <== Total: 4 (BaseJdbcLogger.java:145)
Department [id=1, departmentName=行政部]
Employee [id=7, lastname=劉東平7, [email protected], birth=Wed Mar 27 00:00:00 CST 2019, createtime=Wed Mar 27 20:01:59 CST 2019, emp_image=C:/upload/14/2/f0312f6e638248058eaebae3f4d8952f.jpg, department=null]
Employee [id=201, lastname=楊峯, [email protected], birth=Mon Apr 15 11:44:26 CST 2019, createtime=Mon Apr 15 11:34:26 CST 2019, emp_image=null, department=null]
Employee [id=202, lastname=楊峯, [email protected], birth=Mon Apr 15 14:40:48 CST 2019, createtime=Mon Apr 15 14:40:48 CST 2019, emp_image=null, department=null]
Employee [id=203, lastname=楊峯, [email protected], birth=Mon Apr 15 14:42:17 CST 2019, createtime=Mon Apr 15 14:42:17 CST 2019, emp_image=null, department=null]
collection也有緩存加載(也稱按需加載)
前提條件需要在配置文件中配置以下信息
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"/>
<!--顯示的指定每個我們需要更改的配置的值,即使他是默認的。防止版本更新帶來的問題 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
將測試代碼修改爲
DepartmentMapper departmentMapper = sqlSession.getMapper(DepartmentMapper.class);
//進行查詢
Department department = departmentMapper.getDeptBySept(1);
System.out.println(department.getDepartmentName());
查詢的結果只有一條SQL語句
DEBUG 04-15 20:08:02,050 ==> Preparing: select * from department where id=? (BaseJdbcLogger.java:145)
DEBUG 04-15 20:08:02,168 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 04-15 20:08:02,414 <== Total: 1 (BaseJdbcLogger.java:145)
行政部
擴展知識
1.在進行分步查詢的時候:如果column需要傳輸多列的值的情況如何處理?
將多列值封裝成map傳輸過去
column{key1=“id”,key=“lasename”}
2.配置文件之後默認是進行延遲加載的,那麼是否可以手動修改懶加載狀態?
fetchType=“lazy” 表示使用延遲加載
lazy:表示延遲加載
eager:表示即使加載