1. 程式人生 > >Mybatis3.1-[tp-30-31]-select_resultMap_關聯查詢_級聯屬性封裝結果__association定義關聯物件封裝規則

Mybatis3.1-[tp-30-31]-select_resultMap_關聯查詢_級聯屬性封裝結果__association定義關聯物件封裝規則

筆記要點

出錯分析與總結

在全域性配置中,對映dao包下的全部:

<mapper>
    <package name="com.dao"/>
    </mappers>


工程組織

 

1.定義介面

package com.dao;
import com.bean.*;
public interface EmployeeMapperPlus {

    public Employee getEmpAndDept(Integer id);//關聯查詢
    public Employee getEmpAndDept2(Integer id); //
關聯查詢 ,使用association public Employee getEmpById(Integer id); }

2.定義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.EmployeeMapperPlus"
> <!--ResultMap ;自定義結果集對映規則; type: 自定義規則的Java型別;id: 唯一的標識,方便引用--> <resultMap id="MySimpleEmp" type="com.bean.Employee"> <!--指定主鍵列的封裝規則,id定義主鍵,底層會有優化規則; column : 指定結果集的具體的那一列; property:指定的JavaBean對應的屬性--> <id column="id" property="id"
/> <!--定義普通列的封裝規則--> <result column="last_name" property="lastName"/> <!--,其他不指定的列會自動封裝;但是, 我們只要寫ResultMap,就把剩下的對映全部都寫上--> <result column="email" property="email"/> <result column="gender" property="gender"/> </resultMap> <!--public Employee getEmpById(Integer id); 注意進行更改為resultMap--> <select id="getEmpById" resultMap="MySimpleEmp"> select * from tbl_employee where id=#{id} </select> <!--場景1 ,方法1:使用級聯屬性的方式 查詢Employee的同時查詢員工對應的部門Employee.dept=Department.id; 輸出員工對應的部門的全部資訊: id last_name gender did dept_name --> <resultMap id="MyDifEmp" type="com.bean.Employee"> <!--column : 指定結果集的具體的那一列; property:指定的JavaBean對應的屬性--> <id column="id" property="id"/> <result column="last_name" property="lastName"/> <result column="gender" property="gender"/> <result column="email" property="email"/> <result column="did" property="dept.id"/> <result column="dept_name" property="dept.departmentName"/> </resultMap> <!--public Employee getEmpAndDept2(Integer id); //association 定義封裝規則!--> <select id="getEmpAndDept" resultMap="MyDifEmp"> SELECT e.id id,e.last_name last_name,e.`gender` gender,e.`d_id` d_id, d.id did,d.`dept_name` dept_name,email FROM tbl_employee e,tbl_dept d WHERE e.`d_id`=d.`id` AND e.id=#{id}; </select> <!--方法2:-使用association可以指定聯合的javaBean的物件 --> <resultMap id="MyDifEmp2" type="com.bean.Employee"> <!--column : 指定結果集的具體的那一列; property:指定的JavaBean對應的屬性--> <id column="id" property="id"/> <result column="last_name" property="lastName"/> <result column="gender" property="gender"/> <result column="email" property="email"/> <!--使用association可以指定聯合的javaBean的物件;(定義單個物件的封裝規則!) property="dept";指定那個屬性是聯合的物件;javaType="dept";指定那個屬性物件的型別;--> <association property="dept" javaType="com.bean.Department"> <id column="did" property="id"/> <result column="dept_name" property="departmentName"/> </association> </resultMap> <!--public Employee getEmpAndDept2(Integer id); //關聯查詢--> <select id="getEmpAndDept2" resultMap="MyDifEmp2"> SELECT e.id id,e.last_name last_name,e.`gender` gender,e.`d_id` d_id, d.id did,d.`dept_name` dept_name,email FROM tbl_employee e,tbl_dept d WHERE e.`d_id`=d.`id` AND e.id=#{id}; </select> </mapper>
View Code

3.編寫測試程式碼

package com.test.resultMap;

import com.bean.Employee;
import com.dao.EmployeeMapperPlus;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class test_tp30 {
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void test06() throws Exception{

        SqlSession openSession = getSqlSessionFactory().openSession();
        try {
            EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
            System.out.println("--------多表關聯查詢,級聯屬性的封裝結果!--------");
            Employee employee = mapper.getEmpAndDept(1);
            System.out.println(employee);
            System.out.println("--------多表關聯查詢,使用association進行連線!--------");
            Employee employee2 = mapper.getEmpAndDept2(1);
            System.out.println(employee2);
            openSession.commit();//預設是不自動提交資料的,需要我們自己手動提交
        }finally {
            openSession.close();
        }
    }
}

 


測試結果

--------多表關聯查詢,級聯屬性的封裝結果!--------
DEBUG 12-01 10:37:03,938 ==>  Preparing: SELECT e.id id,e.last_name last_name,e.`gender` gender,e.`d_id` d_id, d.id did,d.`dept_name` dept_name,email FROM tbl_employee e,tbl_dept d WHERE e.`d_id`=d.`id` AND e.id=?;   (BaseJdbcLogger.java:145) 
DEBUG 12-01 10:37:03,958 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 12-01 10:37:03,968 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee{id=1, lastName='jerry', email='[email protected]', gender='1'}
--------多表關聯查詢,使用association進行連線!--------
DEBUG 12-01 10:37:03,969 ==>  Preparing: SELECT e.id id,e.last_name last_name,e.`gender` gender,e.`d_id` d_id, d.id did,d.`dept_name` dept_name,email FROM tbl_employee e,tbl_dept d WHERE e.`d_id`=d.`id` AND e.id=?;   (BaseJdbcLogger.java:145) 
DEBUG 12-01 10:37:03,969 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 12-01 10:37:03,970 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee{id=1, lastName='jerry', email='[email protected]', gender='1'}

Process finished with exit code 0