MyBatis學習筆記(三)——輸入(parameterType)與輸出(resultType、resultMap)對映
一、輸入對映 parameterType
在MyBatis中,我們通過parameterType屬性完成輸入型別對映。這個屬性可接收普通型別也可以接收一個pojo物件。那麼如果我們想要通過這個屬性對映兩個或多個pojo物件時應該怎麼做呢? 這個時候我們就可以運用包裝類來解決這一問題。
1.先在資料庫中建一個表(order_detail):
2.建立order_detail的實體類(OrderDetail.java):
package domain; public class OrderDetail { private Integer id; private Integer order_id; private Integer item_id; private Integer item_num; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getOrder_id() { return order_id; } public void setOrder_id(Integer order_id) { this.order_id = order_id; } public Integer getItem_id() { return item_id; } public void setItem_id(Integer item_id) { this.item_id = item_id; } public Integer getItem_num() { return item_num; } public void setItem_num(Integer item_num) { this.item_num = item_num; } }
3.建立包裝類(OrderQueryVo.java):
package domain; public class OrderQueryVo{ private Order order; private OrderDetail orderDetail; public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } public OrderDetail getOrderDetail() { return orderDetail; } public void setOrderDetail(OrderDetail orderDetail) { this.orderDetail = orderDetail; } }
4.在OrderMapper.xml中新增如下配置資訊:
5.在OrderMapper.java中新增對應方法:
二、輸出對映
輸出對映有resultType和resultMap,他們都是指定輸出結果的型別(pojo、簡單型別、hashmap…),並將sql查詢結果對映為java物件
2.1 resultType
使用resultType時我們應該注意:sql查詢的列名要和resultType指定pojo的屬性名相同,指定相同屬性方可對映成功,如果sql查詢的列名要和resultType指定pojo的屬性名全部不相同(或是部分不相同),則對映到pojo物件中的對應屬性為null。例如有時候我們不需要查詢select * from user where id = ?
select username,address _address where id = ?
此時我們給查詢的address列名給了一個別名_address,這樣我們通過查詢表中address的資料然後在將它對映到User物件時,該物件的address屬性就為null,即沒將從表中查詢到的address資料對映到user物件的address屬性中。
此時resultMap就出現了。如果sql查詢列名和最終要對映的pojo的屬性名不一致,使用resultMap就可以將列名和pojo的屬性名做一個對應關係 (列名和屬性名對映配置)。
2.2 resultMap
2.2.1 使用resultMap解決sql查詢列名和最終要對映的pojo的屬性名不一致情況
使用resultMap需要在UserMapper.xml中進行配置:
然後在UserMapper.xml中使用它:
2.2.2 使用resultMap對映包裝類
用<association></association>標籤去關聯包裝類中的型別
在UserMapper.xml中進行配置:
2.2.3 當類中有集合屬性時,也可用resultMap輸出對映集合屬性:
用<collection></collection>標籤去關聯包裝類中的集合屬性
重新編寫一下包裝類:
package domain;
import java.util.List;
public class OrderQueryVo{
private Order order;
private List<OrderDetail> orderDetailList;//集合屬性
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public List<OrderDetail> getOrderDetail() {
return orderDetailList;
}
public void setOrderDetail(List<OrderDetail> orderDetailList) {
this.orderDetailList = orderDetailList;
}
}
在UserMapper.xml中進行配置: