MyBatis 之 mapper.xml(二)

執行查詢操做的時候,一般返回的結果集會出現一下幾種狀況:
java

    1. 一對一查詢:返回的結果集的惟一主鍵是非重複的。(下面會標出惟一主鍵,和 oracle 的主鍵有區別sql

        查詢訂單以及訂單的用戶信息,兩種接收結果集的方式:mybatis

        1)使用 pojo 對象去接收結果集(惟一主鍵:)oracle

        

public class OrderCustom extends User {
	private int orderId; //訂單id
	private int user_id; //用戶id
	private String orderNumber; //訂單號
	public int getOrderId() {
		return orderId;
	}
	public void setOrderId(int orderId) {
		this.orderId = orderId;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public String getOrderNumber() {
		return orderNumber;
	}
	public void setOrderNumber(String orderNumber) {
		this.orderNumber = orderNumber;
	}
	@Override
	public String toString() {
		String userString = super.toString();
		return "OrderCustom {orderId=" + orderId + ", user_id=" + user_id
				+ ", orderNumber=" + orderNumber + "[" + userString + "]" + "}";
	}
	
}
<!-- 查詢訂單及用戶信息,resultType -->
  <select databaseId="oracle" id="findOrdersUsers_resultType" resultType="orderCustom">
  	select orders.*, users.* from orders, users where orders.user_id = users.userid
  </select>
public class OrderMapperTest extends TestCase {
	
	private SqlSessionFactory sqlSessionFactory;
	
	private String resource = "SqlMapConfig.xml";
	
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		//經過輸入流讀取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//獲取SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development_oracle");
	}
	
	//一對一查詢,使用resultType
	@Test
	public void testFindOrdersUsers_resultType() throws Exception {
		//獲取SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//指定 mapper 接口的類型,MyBatis經過動態代理的方式實現mapper接口
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		
		List<OrderCustom> list = orderMapper.findOrdersUsers_resultType();
		System.out.println(list.size());
		
		Iterator<OrderCustom> iterator = list.iterator();
		while (iterator.hasNext()) {
			OrderCustom orderCustom = (OrderCustom) iterator.next();
			System.out.println(orderCustom);
		}
	}
}

       執行結果:app

         2)使用resultMap接收結果集ide

public class Order {
	private int orderId; //訂單id
	private int user_id; //用戶id
	private String orderNumber; //訂單號
	
	private User user; //用戶信息
	private List<OrderDetail> orderDetails;  //訂單明細

	public int getOrderId() {
		return orderId;
	}

	public void setOrderId(int orderId) {
		this.orderId = orderId;
	}

	public int getUser_id() {
		return user_id;
	}

	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}

	public String getOrderNumber() {
		return orderNumber;
	}

	public void setOrderNumber(String orderNumber) {
		this.orderNumber = orderNumber;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public List<OrderDetail> getOrderDetails() {
		return orderDetails;
	}

	public void setOrderDetails(List<OrderDetail> orderDetails) {
		this.orderDetails = orderDetails;
	}

	@Override
	public String toString() {
		return "Order [orderId=" + orderId + ", user_id=" + user_id
				+ ", orderNumber=" + orderNumber + ", user=" + user
				+ ", orderDetails=" + orderDetails + "]";
	}
}
<!-- 查詢訂單及用戶信息,resultMap -->
<resultMap id="orderUserMap" type="mybatis_b.model.Order">
  <!-- order信息 -->
  <!-- 這裏的id 是mybatis在進行一對一查詢時,將orderId字段映射爲Order 對象使用,必須寫 -->
  <id property="orderId" column="orderId"/>
  <result property="user_id" column="user_id"/>
  <result property="orderNumber" column="orderNumber"/>
  <!-- 用戶信息 -->
  <!-- 將用戶信息 使用 association 封裝成一個user對象-->
  <!-- association:用於一對一查詢,將查詢出來的如下字段映射到單個對象
      property="user" : 指定封裝對象存儲的屬性在orders中
      javaType : 指定屬性的javaType
      user.username, user.sex, user.address
  -->
  <association property="user" javaType="mybatis_b.model.User">
  <!-- 這裏的id爲user的id,若是寫表示給user的id屬性賦值 -->
      <id property="userId" column="userId"/>
      <result property="username" column="username"/>
      <result property="sex" column="sex"/>
      <result property="birthday" column="birthday"/>
      <result property="address" column="address"/>
      <result property="detail" column="detail"/>
      <result property="score" column="score"/>
  </association>
</resultMap>
  
<select id="findOrdersUsers_resultMap" resultMap="orderUserMap">
    select orders.*, users.* from orders, users where orders.user_id = users.userid
</select>

        java調用代碼同上,只需修改 ui

List<OrderCustom> list = orderMapper.findOrdersUsers_resultMap();

2.  一對多查詢:返回的結果集的惟一主鍵是非重複的。以下:this

    查詢訂單以及訂單明細信息,能夠看出記錄中存在 兩個訂單明細是屬於同一個訂單的 狀況,這就是一對多的查詢結果集。結果集有5條記錄,可是應該只存在四個OrderId(由於兩個重複的)。
spa

    一對多查詢結果須要使用 resultMap 來接收,代碼以下:
代理

<!-- 訂單及明細信息 -->
<resultMap id="orderDetails" type="mybatis_b.model.Order">
      <!-- id 這裏表示結果集的惟一主鍵,雖然出現重複的orderDetail,可是屬於同一個orderId -->
      <id property="orderId" column="orderId"/>
      <result property="user_id" column="user_id"/>
      <result property="orderNumber" column="orderNumber"/>
      <!-- collect:用於一對多查詢,接收 List<object> 對象; ofType表示 List 中對象的類型 -->
      <!-- 上面 Order 類中的List<OrderDetail> 就是用來接收一對多的結果集 -->
      <collection property="orderDetails" ofType="mybatis_b.model.OrderDetail">
  	    <id property="orderDetailId" column="orderDetailId"/>
  	    <result property="item_id" column="item_id"/>
  	    <result property="item_number" column="item_number"/>
  	    <result property="item_price" column="item_price"/>
      </collection>
</resultMap>

<select id="findOrderDetails" resultMap="orderDetails">
  select orders.*, orderDetail.orderDetailId, orderDetail.item_id, 
  orderDetail.item_number, orderDetail.item_price from orders, orderDetail 
  where orders.orderId = orderDetail.order_id
</select>

    OrderDetail 類:

public class OrderDetail {
	private int orderDetailId;  //order明細id
	private int order_id;	//訂單id
	private int item_id;	//商品id
	private int item_number;	//商品數量
	private Float item_price;	//單價
	
	public int getOrderDetailId() {
		return orderDetailId;
	}
	public void setOrderDetailId(int orderDetailId) {
		this.orderDetailId = orderDetailId;
	}
	public int getOrder_id() {
		return order_id;
	}
	public void setOrder_id(int order_id) {
		this.order_id = order_id;
	}
	public int getItem_id() {
		return item_id;
	}
	public void setItem_id(int item_id) {
		this.item_id = item_id;
	}
	public int getItem_number() {
		return item_number;
	}
	public void setItem_number(int item_number) {
		this.item_number = item_number;
	}
	public Float getItem_price() {
		return item_price;
	}
	public void setItem_price(Float item_price) {
		this.item_price = item_price;
	}
	@Override
	public String toString() {
		return "OrderDetail [orderDetailId=" + orderDetailId + ", order_id="
				+ order_id + ", item_id=" + item_id + ", item_number="
				+ item_number + ", item_price=" + item_price + "]";
	}
}

     java調用代碼同上,只需修改 

List<OrderCustom> list = orderMapper.findOrderDetails();

    執行結果:能夠看出,第二條order信息中,有兩條 orderDetail 信息

3.  resultMap 繼承

    MyBatis 的 mapper.xml 配置文件中能夠使用 resultMap 的繼承。以下:

    查詢訂單、訂單明細以及訂單的用戶信息。上面咱們已經有 orderUserMap 這個resultMap 來接收 訂單以及用戶信息了。下面繼承這個 resultMap:

<!-- 訂單、訂單明細及用戶信息 -->
<resultMap id="orderDetailsAndUser" type="mybatis_b.model.Order" extends="orderUserMap">
  <collection property="orderDetails" ofType="mybatis_b.model.OrderDetail">
  	<id property="orderDetailId" column="orderDetailId"/>
  	<result property="item_id" column="item_id"/>
  	<result property="item_number" column="item_number"/>
  	<result property="item_price" column="item_price"/>
  </collection>
</resultMap>
  
<select id="findOrderDetailsAndUser" resultMap="orderDetailsAndUser">
  select orders.*,users.*, orderDetail.orderDetailId, orderDetail.item_id, 
  orderDetail.item_number, orderDetail.item_price from orders, users, orderDetail 
  where orders.user_id = users.userid and orders.orderId = orderDetail.order_id
</select>

    代碼中 orderDetailsAndUser 這個 resultMap 繼承了 orderUserMap, 因此 order 和 user 屬性配置能夠省略,減小代碼量。

相關文章
相關標籤/搜索