11.高級映射(一對一查詢)

1.一對一查詢

需求:查詢訂單信息谴供,關(guān)聯(lián)查詢創(chuàng)建訂單的用戶信息能扒。

1)resultType實現(xiàn)

  • sql語句
    確定主查詢表:訂單表
    確定查詢的關(guān)聯(lián)表:用戶表
    關(guān)聯(lián)查詢使用內(nèi)鏈接還是外鏈接
SELECT orders.* ,user.username,user.sex,user.address
FROM orders,user 
WHERE orders.user_id=user.id
  • 將各個數(shù)據(jù)表寫成類
  • pojo
    將上面查詢的結(jié)果集映射到pojo中佣渴,pojo中必須包括所有的查詢。
    在pojo下新建一個OrderCustom類初斑。
package com.chinglee.mybatis.pojo;

/**
 * 訂單的擴(kuò)展類
 * 通過此類映射訂單和用戶的結(jié)果辛润,讓此類繼承包括字段較多的pojo類
 */
public class OrderCustom extends Orders{
    //添加用戶的屬性
    //user.username,user.sex,user.address
    private String username;
    private String sex;
    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

  • mapper.xml
    新建一個OrderCustomMapper.xml,為了在SqlMapConfig中使用批量加載,需要將mapper.xml和mapper.java文件放在同一個文件夾下见秤。


<?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">

<!--namespace命名空間砂竖,作用就是對sql進(jìn)行分類化管理,理解sql隔離
注:使用mapper代理方法開發(fā)鹃答,namespace有特殊作用
-->

<mapper namespace="com.chinglee.mybatis.mapper.OrderCustomMapper">
    <!--查詢訂單關(guān)聯(lián)查詢用戶信息-->
    <select id="findOrdersUser"  resultType="com.chinglee.mybatis.pojo.OrderCustom">
        SELECT orders.* ,user.username,user.sex,user.address
         FROM orders,user
        WHERE orders.user_id=user.id
    </select>

</mapper>
  • OrserCustomMapper.java
package com.chinglee.mybatis.mapper;

import com.chinglee.mybatis.pojo.OrderCustom;

import java.util.List;

/**
 * 訂單的mapper
 */
public interface OrderCustomMapper {
    //查詢訂單關(guān)聯(lián)查詢用戶信息
    public List<OrderCustom> findOrdersUser() throws Exception;
}
  • 沒有配置批量加載乎澄,需要到SqlMapConfig配置
  <!--加載映射文件-->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
        <!--<mapper resource="mapper/UserMapper.xml"/>-->

        <!--通過mapper接口加載
         遵循一些規(guī)范:需要將mapper接口類名和mapper.xml映射文件名稱保持一致,且在一個目錄中
         前提:使用mapper代理的方法
        -->
        <!--
        <mapper class="com.chinglee.mybatis.mapper.UserMapper"/>
        -->

        <!--批量加載mapper
           指定mapper接口的包名测摔,mybatis自動掃描包下面所有mapper接口進(jìn)行加載
           遵循一些規(guī)范:需要將mapper接口類名和mapper.xml映射文件名稱保持一致置济,且在一個目錄中
         前提:使用mapper代理的方法
        -->
         <package name="com.chinglee.mybatis.mapper"/>
    </mappers>

  • test方法
public class OrderCustomMapperTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception {
        String resource="SqlMapConfig.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);


    }

    @Test
    public void findOrdersUserTest() throws Exception {
      SqlSession sqlSession=sqlSessionFactory.openSession();
      //創(chuàng)建代理對象
      OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
      //調(diào)用mapper的方法
        List<OrderCustom> list =orderCustomMapper.findOrdersUser();
        System.out.println(list);
        sqlSession.close();
    }

2)resultMap實現(xiàn)

  • sql語句
    同resultType實現(xiàn)的sql
  • 使用resultMap映射的思路
    使用resultMap將查詢結(jié)果中的訂單信息映射到Orders對象中,在Orders類中添加User屬性锋八,將關(guān)聯(lián)查詢出來的用戶信息映射到orders對象中的user屬性中浙于。
  • 需要在Orders類中添加user屬性
public class Orders {
    private int id;
    private int userId;
    private String number;
    private Date createtime;
    private String note;

    //使用resultMap時添加的user屬性
    private User user;

  • mapper.xml
    定義resultMap
 <!--訂單關(guān)聯(lián)查詢用戶的resultMap-->
    <resultMap id="OrdersUserResultMap" type="com.chinglee.mybatis.pojo.Orders">
        <!-- 配置映射的訂單信息-->
        <!--指定查詢列中的唯一標(biāo)識,訂單信息中的唯一標(biāo)識挟纱,如果有多個列組成唯一標(biāo)識路媚,配置多個id
            column:訂單信息的唯一標(biāo)識列
            property:訂單信息的唯一標(biāo)識列所映射到Orders中的那個屬性
         -->
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <!--配置映射關(guān)聯(lián)的用戶信息-->
        <!-- association:用于映射關(guān)聯(lián)查詢對象的信息
           property:要將關(guān)聯(lián)查詢的用戶信息映射到Orders中的那個屬性
        -->
        <association property="user" javaType="com.chinglee.mybatis.pojo.User">
            <!-- id:關(guān)聯(lián)查詢用戶的唯一標(biāo)識
            唯一標(biāo)識用戶信息的列
            -->
            <id column="user_id" javaType="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>

        </association>

    </resultMap>
 <!--查詢訂單關(guān)聯(lián)查詢用戶信息,使用resultMap-->
    <select id="findOrdersUser"  resultMap="OrdersUserResultMap">
        SELECT orders.* ,user.username,user.sex,user.address
        FROM orders,user
        WHERE orders.user_id=user.id
    </select>
  • mapper.java
 public List<Order> findOrdersUserResultMap() throws Exception;
  • test
 @Test
    public void findOrdersUserResultMapTest() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //創(chuàng)建代理對象
        OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
        //調(diào)用mapper的方法
        List<Order> list =orderCustomMapper.findOrdersUserResultMap();
        System.out.println(list);
        sqlSession.close();
    }

實現(xiàn)一對一的查詢:
resultType:使用resultType較為簡單,如果pojo中沒有包括查詢出來的列明樊销,需要增加列名對應(yīng)的屬性整慎,即可完成映射。
如果沒有查詢結(jié)果的特殊要求建議使用resultType围苫。

resultMap:需要單獨的定義裤园,實現(xiàn)相對麻煩,如果對查詢結(jié)果有特殊的要求使用resultMap可以完成將關(guān)聯(lián)查詢映射到pojo的屬性中剂府。

resultMap可以實現(xiàn)延遲加載拧揽,resultType無法實現(xiàn)延遲加載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腺占,一起剝皮案震驚了整個濱河市淤袜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衰伯,老刑警劉巖铡羡,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異意鲸,居然都是意外死亡烦周,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門怎顾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來读慎,“玉大人,你說我怎么就攤上這事槐雾∝参” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵募强,是天一觀的道長株灸。 經(jīng)常有香客問我,道長钻注,這世上最難降的妖魔是什么蚂且? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮幅恋,結(jié)果婚禮上杏死,老公的妹妹穿的比我還像新娘。我一直安慰自己捆交,他們只是感情好淑翼,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著品追,像睡著了一般玄括。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肉瓦,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天遭京,我揣著相機(jī)與錄音胃惜,去河邊找鬼。 笑死哪雕,一個胖子當(dāng)著我的面吹牛船殉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斯嚎,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼利虫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堡僻?” 一聲冷哼從身側(cè)響起糠惫,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钉疫,沒想到半個月后硼讽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡陌选,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年理郑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咨油。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡您炉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出役电,到底是詐尸還是另有隱情赚爵,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布法瑟,位于F島的核電站冀膝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏霎挟。R本人自食惡果不足惜窝剖,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酥夭。 院中可真熱鬧赐纱,春花似錦、人聲如沸熬北。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讶隐。三九已至起胰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巫延,已是汗流浹背效五。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工地消, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畏妖。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓犯建,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓜客。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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