05. mybatis多表關聯(lián)結果處理

05. mybatis多表關聯(lián)結果處理

1十嘿、準備數(shù)據(jù)

創(chuàng)建表:

dept表:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `DEPTNO` int(2) NOT NULL,
  `DNAME` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `LOC` varchar(13) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`DEPTNO`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES (40, 'OPERATIONS', 'BOSTON');

SET FOREIGN_KEY_CHECKS = 1;

emp表:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp`  (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `JOB` varchar(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `MGR` int(4) NULL DEFAULT NULL,
  `HIREDATE` date NULL DEFAULT NULL,
  `SAL` double(7, 2) NULL DEFAULT NULL,
  `COMM` double(7, 2) NULL DEFAULT NULL,
  `DEPTNO` int(2) NOT NULL,
  PRIMARY KEY (`EMPNO`) USING BTREE,
  INDEX `emp`(`DEPTNO`) USING BTREE,
  CONSTRAINT `emp` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20);
INSERT INTO `emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30);
INSERT INTO `emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30);
INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20);
INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30);
INSERT INTO `emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30);
INSERT INTO `emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10);
INSERT INTO `emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000.00, NULL, 20);
INSERT INTO `emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10);
INSERT INTO `emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30);
INSERT INTO `emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100.00, NULL, 20);
INSERT INTO `emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30);
INSERT INTO `emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20);
INSERT INTO `emp` VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10);

SET FOREIGN_KEY_CHECKS = 1;

如上述兩張表担汤,互相有著關聯(lián)關系:一個部門會有多名員工徐伐,一名員工附屬于一個部門得湘,因此建立了外鍵關系。

2蓝厌、建立Po模型類

DeptPo.java

package com.company.project.Po;

import java.util.List;

public class DeptPo {
    private int deptno;
    private String dname;
    private String loc;
    
    private List<EmpPo> empPos;

    public int getDeptno() {
        return deptno;
    }

    public String getDname() {
        return dname;
    }

    public String getLoc() {
        return loc;
    }

    public List<EmpPo> getEmpPos() {
        return empPos;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    public void setEmpPos(List<EmpPo> empPos) {
        this.empPos = empPos;
    }

    @Override
    public String toString() {
        return "DeptPo [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + ", empPos=" + empPos + "]";
    }
}

EmpPo.java

package com.company.project.Po;

import java.sql.Date;

public class EmpPo {
    private int empno;
    private String ename;
    private String job;
    private int mgr;
    private Date hiredate;
    private double sal;
    private double comm;
    private DeptPo deptPo;
    public int getEmpno() {
        return empno;
    }
    public String getEname() {
        return ename;
    }
    public String getJob() {
        return job;
    }
    public int getMgr() {
        return mgr;
    }
    public Date getHiredate() {
        return hiredate;
    }
    public double getSal() {
        return sal;
    }
    public double getComm() {
        return comm;
    }

    public DeptPo getDeptPo() {
        return deptPo;
    }
    public void setEmpno(int empno) {
        this.empno = empno;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public void setMgr(int mgr) {
        this.mgr = mgr;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
    public void setSal(double sal) {
        this.sal = sal;
    }
    public void setComm(double comm) {
        this.comm = comm;
    }

    public void setDeptPo(DeptPo deptPo) {
        this.deptPo = deptPo;
    }
    @Override
    public String toString() {
        return "EmpPo [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate
                + ", sal=" + sal + ", comm=" + comm + ", deptPo=" + deptPo + "]";
    }
}

3玄叠、建立Dao接口

EmpDao.java

package com.company.project.dao;

import java.util.List;
import java.util.Map;

import com.company.project.Po.DeptPo;
import com.company.project.Po.EmpPo;

public interface EmpDao {
    EmpPo findById(int empno);
    Map<String, Object> findById2(int empno);
}

DeptDao.java

package com.company.project.dao;

import java.util.List;

import com.company.project.Po.DeptPo;
import com.company.project.Po.EmpPo;

public interface DeptDao {
    DeptPo findById(int deptno);

}

4、建立xml映射文件

利用 resultMap 來組合封裝查詢結果拓提,利用association標簽來組裝屬性對象的結果集读恃。

EmpMapper.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.company.project.dao.EmpDao">
    <!-- 把重復的sql代碼可以提煉出來,通過定義別名把sql列名和java屬性對應 -->
    <sql id="selectResult">
        e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno,d.DNAME,d.LOC 
    </sql>
    
    
    <!-- sql查詢結果與javaPo類的對應關系 -->
     <resultMap type="EmpPo" id="EmpResult">
        <id property="empno" column="empno"/>
        <result property="ename"  column="ename"/>
        <result property="job"  column="job"/>
        <result property="mgr"  column="mgr"/>
        <result property="hiredate"  column="hiredate"/>
        <result property="sal"  column="sal"/>
        <result property="comm"  column="comm"/>
         <!--利用association標簽,建立屬性對象的映射 -->
        <association property="deptPo" javaType="deptPo">
            <id property="deptno" column="deptno"/>
            <result property="dname"  column="dname"/>
            <result property="loc"  column="loc"/>
        </association>
     </resultMap>

    <!--第一種方式:利用resultMap定義查詢結果的映射關系 -->
    <select id="findById" parameterType="int" resultMap="EmpResult">
        select
            <include refid="selectResult"></include>
        from 
            emp e
        join
            dept d
        on
            e.DEPTNO = d.DEPTNO
        where e.empno = #{empno}
    </select>
    
    
    <!--第一種方式:利用map使用數(shù)據(jù)庫列名接收結果 -->
    <select id="findById2" parameterType="int" resultType="map">
        select
            <include refid="selectResult"></include>
        from 
            emp e
        join
            dept d
        on
            e.DEPTNO = d.DEPTNO
        where e.empno = #{empno}
    </select>

</mapper>

DeptMapper.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.company.project.dao.DeptDao">
       
   <!-- sql查詢結果與javaPo類的對應關系 -->
   <resultMap type="DeptPo" id="deptMap">
        <id column="deptno" property="deptno"/>
        <result column="dname" property="dname"/>
        <result column="loc" property="loc"/>
        <!-- 將一個部門中 的多個員工封裝到集合中 -->
        <collection property="empPos" javaType="list" ofType="EmpPo">
            <id property="empno" column="empno"/>
            <result property="ename"  column="ename"/>
            <result property="job"  column="job"/>
            <result property="mgr"  column="mgr"/>
            <result property="hiredate"  column="hiredate"/>
            <result property="sal"  column="sal"/>
            <result property="comm"  column="comm"/>
        </collection>
   </resultMap>
   
   <select id="findById" parameterType="int" resultMap="deptMap">
        SELECT
            e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno,d.DNAME,d.LOC 
        FROM
            dept d
            JOIN emp e ON d.deptno = e.deptno 
        WHERE
            d.deptno = #{deptno}
   </select>
   

   </mapper> 

在寫完xml映射文件之后寺惫,需要在全局配置文件mybatis-config.xml文件中添加映射文件信息

    <!-- 將我們寫好的sql映射文件一定要注冊到全局配置文件中 -->
    <mappers>
        <!-- 利用package標簽可以直接把整個包的 xml配置文件都導入疹吃,這塊是導入數(shù)據(jù)庫表與java Po類對應的配置文件 -->
        <mapper resource="com/company/project/mapper/EmpMapper.xml"/>
        <mapper resource="com/company/project/mapper/DeptMapper.xml"/>
    </mappers>

5、測試類

EmpTest.java

package com.company.project.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.company.project.Po.EmpPo;
import com.company.project.dao.EmpDao;
import com.company.project.util.MyBatisUtil;

import junit.framework.TestCase;

public class EmpTest extends TestCase {
    public void testFindById() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        EmpDao empDao = sqlSession.getMapper(EmpDao.class);
        EmpPo empPo = empDao.findById(7369);
        System.out.println(empPo);
    }
    
}

DeptTest.java

package com.company.project.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.company.project.Po.DeptPo;
import com.company.project.Po.EmpPo;
import com.company.project.dao.DeptDao;
import com.company.project.dao.EmpDao;
import com.company.project.util.MyBatisUtil;

import junit.framework.TestCase;

public class DeptTest extends TestCase {
    public void testFindById() {
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            DeptDao deptDao = sqlSession.getMapper(DeptDao.class);
            DeptPo deptPo = deptDao.findById(20);
            System.out.println(deptPo);
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            MyBatisUtil.closeSession();
        }
    }

}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末西雀,一起剝皮案震驚了整個濱河市萨驶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艇肴,老刑警劉巖腔呜,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異再悼,居然都是意外死亡核畴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門帮哈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膛檀,“玉大人,你說我怎么就攤上這事娘侍】校” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵憾筏,是天一觀的道長嚎杨。 經(jīng)常有香客問我,道長氧腰,這世上最難降的妖魔是什么枫浙? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮古拴,結果婚禮上箩帚,老公的妹妹穿的比我還像新娘。我一直安慰自己黄痪,他們只是感情好紧帕,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桅打,像睡著了一般是嗜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挺尾,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天鹅搪,我揣著相機與錄音,去河邊找鬼遭铺。 笑死丽柿,一個胖子當著我的面吹牛恢准,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甫题,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼顷歌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幔睬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤芹扭,失蹤者是張志新(化名)和其女友劉穎麻顶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舱卡,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡辅肾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轮锥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矫钓。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舍杜,靈堂內(nèi)的尸體忽然破棺而出新娜,到底是詐尸還是另有隱情,我是刑警寧澤既绩,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布概龄,位于F島的核電站,受9級特大地震影響饲握,放射性物質(zhì)發(fā)生泄漏私杜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一救欧、第九天 我趴在偏房一處隱蔽的房頂上張望衰粹。 院中可真熱鬧,春花似錦笆怠、人聲如沸铝耻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽田篇。三九已至,卻和暖如春箍铭,著一層夾襖步出監(jiān)牢的瞬間泊柬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工诈火, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兽赁,地道東北人状答。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像刀崖,于是被迫代替她去往敵國和親惊科。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容