1. 程式人生 > >java-mybaits-00502-案例-映射分析-一對一、一對多、多對多

java-mybaits-00502-案例-映射分析-一對一、一對多、多對多

per username nfa view 2.3 puts opened org double

1、一對一查詢【類屬性即可,association 】

案例:查詢所有訂單信息,關聯查詢下單用戶信息。 註意:因為一個訂單信息只會是一個人下的訂單,所以從查詢訂單信息出發關聯查詢用戶信息為一對一查詢。如果從用戶信息出發查詢用戶下的訂單信息則為一對多查詢,因為一個用戶可以下多個訂單。

1.1、方法一【resultType】:

使用resultType,定義訂單信息po類,此po類中包括了訂單信息和用戶信息:

1.1.1、Sql語句:

SELECT orders.*,
  user.username,  user.address
FROM
  orders, 
user WHERE orders.user_id = user.id

1.1.2、定義pojo類

將上邊sql查詢的結果映射到pojo中,pojo中必須包括所有查詢列名。 原始的Orders.java不能映射全部字段,需要新創建的pojo。 創建 一個pojo繼承包括查詢字段較多的po類,如下: 技術分享
package com.lhx.mybatis.po;

import java.util.Date;

public class Order {
    private Integer id;
    private String user_id;
    
private Double number; private String note; private Date createtime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUser_id() { return user_id; } public void setUser_id(String user_id) {
this.user_id = user_id; } public Double getNumber() { return number; } public void setNumber(Double number) { this.number = number; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } }
View Code 技術分享
package com.lhx.mybatis.po;

public class OrdersCustom extends Order {
    private String username;
    private String address;

    public String getUsername() {
        return username;
    }

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

    public String getAddress() {
        return address;
    }

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

    @Override
    public String toString() {
        return "OrdersCustom [username=" + username + ", address=" + address + ", getId()=" + getId()
                + ", getUser_id()=" + getUser_id() + ", getNumber()=" + getNumber() + ", getNote()=" + getNote()
                + ", getCreatetime()=" + getCreatetime() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
                + ", toString()=" + super.toString() + "]";
    }

    

    

}
View Code

OrdersCustom類繼承Orders類後OrdersCustom類包括了Orders類的所有字段,只需要定義用戶的信息字段即可。

1.1.3、Mapper.xml

<mapper namespace="com.lhx.mybatis.mapperproxy.OrderMapper">
    <!-- 查詢所有訂單信息 -->
    <select id="findOrdersList" resultType="com.lhx.mybatis.po.OrdersCustom">
        SELECT
        orders.*,
        user.username,
        user.address
        FROM
        orders, user
        WHERE orders.user_id = user.id
    </select>
</mapper>

1.1.4、Mapper接口:

    public List<OrdersCustom> findOrdersList() throws Exception;

1.1.5、測試:

技術分享
package com.lhx.mybatis.mapperproxy;

import java.io.InputStream;
import java.util.List;

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 com.lhx.mybatis.po.OrdersCustom;

import junit.framework.TestCase;

public class OrderMapperTest extends TestCase {

    private SqlSessionFactory sqlSessionFactory;

    protected void setUp() throws Exception {
        // mybatis配置文件
        String resource = "SqlMapConfig-MapperProxy.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 使用SqlSessionFactoryBuilder創建sessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    public void testfindOrdersList() throws Exception {
        // 獲取session
        SqlSession session = sqlSessionFactory.openSession();
        // 獲限mapper接口實例
        OrderMapper orderMapper = session.getMapper(OrderMapper.class);
        // 查詢訂單信息
        List<OrdersCustom> list = orderMapper.findOrdersList();
        System.out.println(list);
        for(int i=0,len = list.size();i<len;i++){
            System.out.println(list.get(i));
        }
        // 關閉session
        session.close();
    }
}
View Code

1.1.6、總結:

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

1.2、方法二【resultMap】:

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

1.2.1 Sql語句:

同上

1.2.2、定義po類

在Orders類中加入User屬性,user屬性中用於存儲關聯查詢的用戶信息,因為訂單關聯查詢用戶是一對一關系,所以這裏使用單個User對象存儲關聯查詢的用戶信息。

1.2.3、Mapper.xml

    <select id="findOrdersListResultMap" resultMap="userordermap">
        SELECT
        orders.*,
        user.username,
        user.address
        FROM
        orders, user
        WHERE orders.user_id =
        user.id
    </select>

這裏resultMap指定userordermap。

1.2.4、定義resultMap

需要關聯查詢映射的是用戶信息,使用association將用戶信息映射到訂單對象的用戶屬性中。
    <!-- 訂單信息resultmap -->
    <resultMap type="com.lhx.mybatis.po.Order" id="userordermap">
        <!-- 這裏的id,是mybatis在進行一對一查詢時將user字段映射為user對象時要使用,必須寫 -->
        <id property="id" column="id" />
        <result property="user_id" column="user_id" />
        <result property="number" column="number" />
        <association property="user" javaType="com.lhx.mybatis.po.User">
            <!-- 這裏的id為user的id,如果寫上表示給user的id屬性賦值 -->
            <id property="id" column="user_id" />
            <result property="username" column="username" />
            <result property="address" column="address" />
        </association>
    </resultMap>

association:表示進行關聯查詢單條記錄

property:表示關聯查詢的結果存儲在Order的user屬性中 javaType:表示關聯查詢的結果類型 <id property="id" column="user_id"/>:查詢結果的user_id列對應關聯對象的id屬性,這裏是<id />表示user_id是關聯查詢對象的唯一標識。 <result property="username" column="username"/>:查詢結果的username列對應關聯對象的username屬性。

1.2.5 Mapper接口:

    List<Order> findOrdersListResultMap() throws Exception;

1.2.6 測試:

    public void testfindOrdersListResultMap() throws Exception {
        // 獲取session
        SqlSession session = sqlSessionFactory.openSession();
        // 獲限mapper接口實例
        OrderMapper orderMapper = session.getMapper(OrderMapper.class);
        // 查詢訂單信息
        List<Order> list = orderMapper.findOrdersListResultMap();
        System.out.println(list);
        for (int i = 0, len = list.size(); i < len; i++) {
            System.out.println(list.get(i));
        }
        // 關閉session
        session.close();
    }

1.2.7、小結:

使用association完成關聯查詢,將關聯查詢信息映射到pojo對象中。 實現一對一查詢: resultType:使用resultType實現較為簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應的屬性,即可完成映射。 如果沒有查詢結果的特殊要求建議使用resultType。 resultMap:需要單獨定義resultMap,實現有點麻煩,如果對查詢結果有特殊的要求,使用resultMap可以完成將關聯查詢映射pojo的屬性中。 resultMap可以實現延遲加載,resultType無法實現延遲加載。

java-mybaits-00502-案例-映射分析-一對一、一對多、多對多