java-mybaits-00502-案例-映射分析-一對一、一對多、多對多
阿新 • • 發佈:2017-05-13
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;View Codeprivate 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; } }
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-案例-映射分析-一對一、一對多、多對多