執行查詢操做的時候,一般返回的結果集會出現一下幾種狀況:
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 屬性配置能夠省略,減小代碼量。