1. 程式人生 > >Mybatis學習筆記(七) —— 關聯查詢

Mybatis學習筆記(七) —— 關聯查詢

一、一對多查詢

  需求:查詢所有訂單資訊,關聯查詢下單使用者資訊。

  注意:因為一個訂單資訊只會是一個人下的訂單,所以從查詢訂單資訊出發關聯查詢使用者資訊為一對一查詢。如果從使用者資訊出發查詢使用者下的訂單資訊則為一對多查詢,因為一個使用者可以下多個訂單。

     

  sql語句:

SELECT
    o.id,
    o.user_id userId,
    o.number,
    o.createtime,
    o.note,
    u.username,
    u.address
FROM
    `order` o
LEFT JOIN
`user` u ON o.user_id = u.id

1.1 方法一:使用resultType

  使用resultType,改造訂單pojo類,此pojo類中包括了訂單資訊和使用者資訊,這樣返回物件的時候,mybatis自動把使用者資訊也注入進來了。

1.1.1 改造pojo類

  OrderUser類繼承Order類後OrderUser類包括了Order類的所有欄位,只需要定義使用者的資訊欄位即可:

public class OrderUser extends Order {
    private String username;
    private String address;
    get
/set... }

 1.1.2 Mapper.xml

  在UserMapper.xml中新增sql:

  <!-- 查詢訂單,同時包含使用者資料 -->
    <select id="queryOrderUser" resultType="orderUser">
        SELECT
            o.id,
            o.user_id,
            o.number,
            o.createtime,
            o.note,
            u.username,
            u.address 
        FROM
            `order` o
            LEFT JOIN `user` u ON o.user_id = u.id
    
</select>

 1.1.3 Mapper介面

  在UserMapper介面新增方法:  

    /**
     * 一對一關聯,查詢訂單同時包含使用者
     * @return
     */
    List<OrderUser> queryOrderUser();

 1.1.4 測試方法

  @Test
    public void testQueryOrderUser() throws Exception {
        // mybatis和spring整合,整合之後,交給spring管理
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 建立Mapper介面的動態代理物件,整合之後,交給spring管理
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 使用userMapper執行根據條件查詢使用者
        List<OrderUser> list = userMapper.queryOrderUser();
        for (OrderUser orderUser : list) {
            System.out.println(orderUser);
        }
        // mybatis和spring整合,整合之後,交給spring管理
        sqlSession.close();
    }

 1.1.5 小結

  定義專門的pojo類作為輸出型別,其中定義了sql查詢結果集所有的欄位。此方法較為簡單,企業中使用普遍。

1.2 方法二:使用resultMap

  使用resultMap,定義專門的resultMap用於對映一對一查詢結果。

1.2.1 改造pojo類

       在Order類中加入User屬性,user屬性中用於儲存關聯查詢的使用者資訊,因為訂單關聯查詢使用者是一對一關係,所以這裡使用單個User物件儲存關聯查詢的使用者資訊。

public class Order {
    // 訂單id
    private int id;
    // 使用者id
    private Integer userId;
    // 訂單號
    private String number;
    // 訂單建立時間
    private Date createtime;
    // 備註
    private String note;
    
    private User user;
   get/set...
}

 1.2.2 Mapper.xml

  這裡resultMap指定orderUserResultMap:

<resultMap type="order" id="orderUserResultMap">
        <id property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="number" column="number"/>
        <result property="createtime" column="createtime"/>
        <result property="note" column="note"/>
    
        <!-- association :配置一對一屬性 -->
        <!-- property:order裡面的User屬性名 -->
        <!-- javaType:屬性型別 -->
        <association property="user" javaType="user">
            <!-- id:宣告主鍵,表示user_id是關聯查詢物件的唯一標識-->
            <id property="id" column="user_id"/>
            <result property="username" column="username" />
            <result property="address" column="address" />
        </association>
    </resultMap>
    
    <!-- 一對一關聯,查詢訂單,訂單內部包含使用者屬性 -->
    <select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
        SELECT
            o.id,
            o.user_id,
            o.number,
            o.createtime,
            o.note,
            u.username,
            u.address
        FROM
            `order` o
        LEFT JOIN `user` u ON o.user_id = u.id
    </select>

1.2.3 Mapper介面

  在UserMapper.xml中新增方法:

    /**
     * 一對一關聯,查詢訂單,訂單內部包含使用者屬性
     * @return
     */
    List<Order> queryOrderUserResultMap();

 1.2.4 測試方法

  @Test
    public void testQueryOrderUserResultMap() throws Exception {
        // mybatis和spring整合,整合之後,交給spring管理
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 建立Mapper介面的動態代理物件,整合之後,交給spring管理
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        List<Order> list = userMapper.queryOrderUserResultMap();

        for (Order order : list) {
            System.out.println(order);
        }

        // mybatis和spring整合,整合之後,交給spring管理
        sqlSession.close();
    }

二、一對多查詢

  需求:查詢所有使用者資訊及使用者關聯的訂單資訊

  使用者資訊和訂單資訊為一對多關係。

  sql語句:

SELECT
    u.id,
    u.username,
    u.birthday,
    u.sex,
    u.address,
    o.number,
    o.createtime,
    o.note 
FROM
    `user` u
    LEFT JOIN `order` o ON u.id = o.user_id

2.1 修改pojo類

  在User類中加入List<Order> orders屬性:

public class User {
    private int id;
    private String username;// 使用者姓名
    private String sex;// 性別
    private Date birthday;// 生日
    private String address;// 地址
    
    private List<Order> orders;

   get/set...
}

2.2 Mapper.xml

  在UserMapper.xml新增sql:

<resultMap type="user" id="userOrderResultMap">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="sex" column="sex"/>
        <result property="birthday" column="birthday"/>
        <result property="address" column="address"/>
        
        <!-- 配置一對多關係 -->
        <collection property="orders" javaType="list" ofType="order">
            <!-- 配置主鍵,是關聯Order的唯一標識 -->
            <id property="id" column="oid"/>
            
            <result property="number" column="number" />
            <result property="createtime" column="createtime" />
            <result property="note" column="note" />
        </collection>
    </resultMap>
    
    <!-- 一對多關聯,查詢使用者的同時查詢該使用者下的訂單 -->
    <select id="queryUserOrder" resultMap="userOrderResultMap">
        SELECT
            u.id,
            u.username,
            u.birthday,
            u.sex,
            u.address,
            o.number,
            o.createtime,
            o.note 
        FROM
            `user` u
            LEFT JOIN `order` o ON u.id = o.user_id
    </select>

2.3 Mapper介面

  在UserMapper.java中新增方法:

    /**
     * 一對多關聯,查詢使用者,使用者內部包含該使用者的訂單
     * @return
     */
    List<User> queryUserOrder();

2.4 測試方法

    @Test
    public void testQueryUserOrder() throws Exception {
        // mybatis和spring整合,整合之後,交給spring管理
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 建立Mapper介面的動態代理物件,整合之後,交給spring管理
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = userMapper.queryUserOrder();
        for (User user : list) {
            System.out.println(user);
        }
        // mybatis和spring整合,整合之後,交給spring管理
        sqlSession.close();
    }