Mybatis框架關聯查詢詳解

1、1對1關聯查詢

        一種業務需要,需要顯示訂單表的信息,同時還需要下訂單的人的信息。這就是多表查詢,由於一條訂單隻會對應一個用戶,1對1關聯查詢。

兩種方式:

1.   將原來的實體類中增加一個新的屬性

(1)、在實體類中增加對應另一張表的實體類的屬性。get/set toString

(2)、輸出映射改爲resultMap,手動去映射對應的屬性

(3)、association     (1對1關聯) property原來orders中的user屬性

        JavaType    User 剩下的還是要手動映射

UserMapper.xml

<resultMap id="ordersView"type="cn.hd.query.Orders">

    <idproperty="id" column="id"></id>

    <resultproperty="eatTime" column="eatTime"></result>
    <resultproperty="orderTime" column="orderTime"></result>
    <association property="user"javaType="cn.hd.pojo.User">
        <id property="id"column="orderId"></id>
        <resultproperty="name" column="name"></result>
        <resultproperty="address" column="address"></result>
    </association>
</resultMap>
<select id="findOrdersView" resultMap="ordersView">
    SELECT * FROM orders o LEFT JOINt_user u ON o.orderId = u.id
</select>

接口

List<Orders>findOrdersView();

Orders

public class Orders {

   private Integer id;
   private Integer ordersId;
   private String orderTime;
   private String eatTime;
   private User user;

測試類

List<Orders> users = mapper.findOrdersView();

System.out.println(users);

注意:

(1).只要不手動書寫映射,他都不會幫你獲得數據庫中的值,即使名字一樣。

(2).如果名字重複了,它會自動幫你增加一個1,但是你如果不起別名,他是不會幫你映射的。

SELECT * FROM orders oLEFT JOIN t_user u ON o.orderId = u.id

2.新建一個實體類(resultType)

業務的需要往往不需要訂單人的全部信息,只需要部分信息,也可能不需要訂單的全部信息。根據業務邏輯建立一個新的實體類。在這個實體類中包含要顯示的所有字段,並且要和數據庫查出來的字段保持一致。

新建一個實體類

public class OrdersView extends Orders{

    private String name;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

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

    @Override
    public String toString() {
        return "OrdersView{" +
                "name='" + name+ '\'' +
                ", address='" +address + '\'' +
                '}';
    }
}

接口

List<OrdersView>findOrdersView();

UserMapper.xml

<select id="findOrdersView"resultType="cn.hd.query.OrdersView">

      SELECT * FROM orders o LEFT JOIN t_user uON o.orderId = u.id
</select>

測試類

List<OrdersView> users =mapper.findOrdersView();

System.out.println(users);

2、1對多關聯查詢

       結果映射中的resultType就不能用了,建議使用resultMap。

接口

List<User>findUserAndOrders();

UserMapper.xml

<resultMap id="user_orders" type="cn.hd.pojo.User">

    <id property="id" column="id"></id>
    <result property="name" column="name"></result>
    <result property="address"column="address"></result>
    <collection property="orders"javaType="list" ofType="cn.hd.query.Orders">
        <id property="id" column="ordersId"></id>
        <result property="orderTime"column="orderTime"></result>
    </collection>
</resultMap>
<select id="findUserAndOrders" resultMap="user_orders">
    SELECT u.*,o.id ASordersId,o.orderTime,o.eatTime FROM orders o RIGHT JOIN t_user u ON o.orderId =u.id
</select>

User類

public class User {

private Integer id;
    private String name;
    private String sex;
    private String address;
    private Integer balance;
    /*1對多*/
    List<Orders> orders;

測試類

@Test

public void fun4(){
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userAndOrders =mapper.findUserAndOrders();
    System.out.println(userAndOrders);
}

       Collection對應的是一對多的關係,property要和user中的集合名字保持一致,JavaType對應的集合的類型.ofType集合中的元素。

       注意事項和1對1查詢一致。


發佈了87 篇原創文章 · 獲贊 381 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章