MyBatis高等映照進修教程。本站提示廣大學習愛好者:(MyBatis高等映照進修教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis高等映照進修教程正文
對mybatis基本入門不太清晰的同伙可以參考下本篇文章:MyBatis入門進修教程(一)-MyBatis疾速入門。
熟悉MyBatis
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷徙到了谷歌 code,而且更名為MyBatis 。2013年11月遷徙到Github。
iBATIS一詞起源於“internet”和“abatis”的組合,是一個基於Java的耐久層框架。iBATIS供給的耐久層框架包含SQL Maps和Data Access Objects(DAO)
mybatis圖冊
簡介
後面說過了簡略的數據庫查詢和治理查詢,在開辟需求中有一些一對1、一對多和多對多的需求開辟,如在開辟購物車的時刻,定單和用戶是一對一,用戶和定單是一對多,用戶和商品是多對多。這些在Hibernate開辟中也是罕見的,Hibernate中是經由過程數據映照來完成的,在MyBatis中也是經由過程設置裝備擺設文件的數據映照來完成。
一對一查詢
假如我們要查詢定單信息,聯系關系查詢創立定單的用戶信息,那末這就是典范的一對一查詢。完成一對一查詢有兩種完成方法:應用resultType和resultMap。resultType須要額定界說POJO,然後把查詢的字段和新界說的POJO逐個對應。resultMap則須要經由過程設置裝備擺設文件來完成兩個POJO的一對一聯系關系。上面我們就這兩種方法來分離完成。
resultType:
1、創立POJO,將須要映照的新的屬性參加到新的POJO中。
public class OrderCustom extends Orders{
//添加用戶信息
private String username;
private String sex;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2、映照文件:
<select id="findOrderUser" resultType="com.luchao.mybatis.first.po.OrderCustom">
select
orders.*,
user.username,
user.sex,
user.address
from orders,user
where
orders.user_id = user.id
</select>
3、Mapper接口的完成:
//查詢定單和用戶信息 public List<OrderCustom> findOrderUser() throws Exception;
4、測試代碼:
public void findOrdersUser() throws Exception {
// 獲得sqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 創立OrderMapper對象,MyBatis主動生成mapper署理
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
// 挪用orderMapper的辦法,查詢定單和用戶信息
List<OrderCustom> orderCustoms = orderMapper.findOrderUser();
System.out.println(orderCustoms.size());
}
resultMap完成:
resultMap將查詢成果中的定單信息映照到Orders對象中,在orders類中添加User屬性,將聯系關系查詢出來的用戶信息映照到orders對象中的user屬性中。
1、創立POJO,在Order類中參加User屬性。
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用戶信息
private User user;
//定單條目
private List<Orderdetail> orderdetails;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
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;
}
}
2、映照文件:
<!-- 定單查詢聯系關系用戶的resultMap,將全部查詢成果映照到orders中 -->
<resultMap type="com.luchao.mybatis.first.po.Orders" id="ordersUserResultMap">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<result column="createtime" property="createtime" />
<result column="note" property="note" />
<!-- 設置裝備擺設映照的聯系關系的用戶信息 -->
<!-- association:用於映照聯系關系查詢單個對象的信息 property:要將聯系關系查詢的用戶信息映照到Orders中哪一個屬性 -->
<association property="user" javaType="com.luchao.mybatis.first.po.User">
<!-- id:聯系關系查詢用戶的唯 一標識 column:指定唯 一標識用戶信息的列 javaType:映照到user的哪一個屬性 -->
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
<result column="address" property="address" />
</association>
</resultMap>
<select id="findOrderUserMap" resultMap="ordersUserResultMap">
select
orders.*,
user.username,
user.sex,
user.address
from orders,user
where
orders.user_id = user.id
</select>
association:用於映照聯系關系查詢單個對象的信息,property:要將聯系關系查詢的用戶信息映照到Orders中哪一個屬性。
3、Mapper接口
//查詢定單和用戶信息經由過程resultMap public List<Orders> findOrderUserMap() throws Exception;
4、測試代碼:
public void findOrdersUserMap() throws Exception {
// 獲得sqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 創立OrderMapper對象,MyBatis主動生成mapper署理
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
// 挪用orderMapper的辦法,查詢定單和用戶信息
List<Orders> orders = orderMapper.findOrderUserMap();
System.out.println(orders.size());
}
resultType和resultMap完成一對一查詢總結:
resultType:應用resultType完成較為簡略,假如pojo中沒有包含查詢出來的列名,須要增長列名對應的屬性,便可完成映照。假如沒有查詢成果的特別請求建議應用resultType。
resultMap:須要零丁界說resultMap,完成有點費事,假如對查詢成果有特別的請求,應用resultMap可以完成將聯系關系查詢映照pojo的屬性中。resultMap可以完成延遲加載,resultType沒法完成延遲加載。
一對多查詢
假如須要查詢定單及定單明細的信息,那末這就是一對多的查詢需求。
1、POJO和下面resultMap的Order的POJO雷同,將定單明細設為List作為Order的屬性。
2、映照文件:
<!-- 定單及定單明細和用戶信息的map 應用繼續不消在設置裝備擺設定單和用戶信息 -->
<resultMap type="com.luchao.mybatis.first.po.Orders" id="ordersOrderdetailResultMap"
extends="ordersUserResultMap">
<collection property="orderdetails"
ofType="com.luchao.mybatis.first.po.Orderdetail">
<result column="orderdetail_id" property="id" />
<result column="items_id" property="itemsId" />
<result column="items_num" property="itemsNum" />
<result column="orders_id" property="ordersId" />
</collection>
</resultMap>
<select id="findOrderAndOrderdetailMap" resultMap="ordersOrderdetailResultMap">
select
orders.*,
user.username,
user.sex,
user.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
from
orders,user,orderdetail
where orders.user_id = user.id and
orderdetail.orders_id = orders.id
</select>
定單及定單明細的resultMap,應用extends繼續,不消在中設置裝備擺設定單信息和用戶信息的映照。
collection:對聯系關系查詢到多筆記錄映照到聚集對象中,property:將聯系關系查詢到多筆記錄映照到Orders哪一個屬性。
ofType:指定映照到list聚集屬性中pojo的類型,留意這裡是ofType與一對一照樣有差別的。
3、Mapper接口:
//查詢定單、定單明細和用戶信息經由過程resultMap
public List<Orders> findOrderAndOrderdetailMap() throws Exception;
4、測試代碼:
public void findOrderAndOrderdetailMap() throws Exception {
// 獲得sqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 創立OrderMapper對象,MyBatis主動生成mapper署理
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
// 挪用orderMapper的辦法,查詢定單和用戶信息
List<Orders> orders = orderMapper.findOrderAndOrderdetailMap();
System.out.println(orders.get().getOrderdetails().size());
System.out.println(orders.size());
}
一對多小結:
mybatis應用resultMap的collection對聯系關系查詢的多筆記錄映照到一個list聚集屬性中。
應用resultType完成:
將定單明細映照到orders中的orderdetails中,須要本身處置,應用兩重輪回遍歷,去失落反復記載,將定單明細放在orderdetails中。如許會比擬費事。
多對多
假如我們查詢用戶及用戶購置商品信息,這個就是多對多,可使用MyBatis的多對多映照。
將用戶信息映照到user中。在user類中添加定單列表屬性List<Orders> orderslist,將用戶創立的定單映照到orderslist,在Orders中添加定單明細列表屬性List<OrderDetail>orderdetials,將定單的明細映照到orderdetials,在OrderDetail中添加Items屬性,將定單明細所對應的商品映照到Items。
1、POJO
public class Orderdetail {
private Integer id;
private Integer ordersId;
private Integer itemsId;
private Integer itemsNum;
//商品信息
private Items items;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOrdersId() {
return ordersId;
}
public void setOrdersId(Integer ordersId) {
this.ordersId = ordersId;
}
public Integer getItemsId() {
return itemsId;
}
public void setItemsId(Integer itemsId) {
this.itemsId = itemsId;
}
public Integer getItemsNum() {
return itemsNum;
}
public void setItemsNum(Integer itemsNum) {
this.itemsNum = itemsNum;
}
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
@Override
public String toString() {
return "Orderdetail [id=" + id + ", ordersId=" + ordersId
+ ", itemsId=" + itemsId + ", itemsNum=" + itemsNum + "]";
}
}
2、映照文件:
<!-- 查詢用戶及購置的商品 -->
<resultMap type="com.luchao.mybatis.first.po.User" id="ordersItemsResultMap">
<!-- 用戶信息 -->
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
<result column="address" property="address" />
<!-- 定單信息 一個用戶對應多個定單,應用collection映照 -->
<collection property="ordersList" ofType="com.luchao.mybatis.first.po.Orders">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<result column="createtime" property="createtime" />
<result column="note" property="note" />
<!-- 定單明細 一個定單包含 多個明細 -->
<collection property="orderdetails"
ofType="com.luchao.mybatis.first.po.Orderdetail">
<id column="id" property="id" />
<result column="items_id" property="itemsId" />
<result column="items_num" property="itemsNum" />
<result column="orders_id" property="ordersId" />
<!-- 商品信息 一個定單明細對應一個商品 -->
<association property="items"
javaType="com.luchao.mybatis.first.po.Items">
<id column="items_id" property="id" />
<result column="items_name" property="name" />
<result column="items_detail" property="detail" />
<result column="items_price" property="price" />
</association>
</collection>
</collection>
</resultMap>
<select id="findOrderAndItemMap" resultMap="ordersItemsResultMap">
select
orders.*,
user.username,
user.sex,
user.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id,
items.id items_id,
items.name items_name,
items.detail items_detail,
items.price items_price
from orders,user,orderdetail,items
where orders.user_id =
user.id and orderdetail.orders_id = orders.id AND orderdetail.items_id
= items.id
</select>
可以看出,多對多根本上就是一對多和一對一的組合,一切龐雜成績根本都是簡略成績的組合,只需細細剖析,理清晰其道理。
3、Mapper接口:
//查詢定單、定單明細和用戶信息經由過程resultMap public List<User> findOrderAndItemMap() throws Exception;
4、測試代碼:
public void findOrderAndItemMap() throws Exception {
// 獲得sqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 創立OrderMapper對象,MyBatis主動生成mapper署理
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
// 挪用orderMapper的辦法,查詢定單和用戶信息
List<User> users = orderMapper.findOrderAndItemMap();
System.out.println(users.get().getOrdersList().get()
.getOrderdetails().get().getId());
// System.out.println(orders.size());
}
多對多查詢總結:
上邊的需求就應用resultType將查詢到的記載映照到一個擴大的pojo中,很簡略完成明細清單的功效,然則這類不克不及完成延遲加載。應用resultMap將用戶購置的商品明細列表映照到對象中,可以完成延遲加載。應用resultMap是針對那些對查詢成果映照有特別請求的功效,,好比特別請求映照成list中包含 多個list。
resultMap總結
1、resultType:
感化:
將查詢成果依照sql列名pojo屬性名分歧性映照到pojo中。
場所:
罕見一些明細記載的展現,好比用戶購置商品明細,將聯系關系查詢信息全體展現在頁面時,此時可直接應用resultType將每筆記錄映照到pojo中,在前端頁面遍歷list(list中是pojo)便可。
2、resultMap:
應用association和collection完成一對一和一對多高等映照(對成果有特別的映照請求)。
association:
感化:
將聯系關系查詢信息映照到一個pojo對象中。
場所:
為了便利查詢聯系關系信息可使用association將聯系關系定單信息映照為用戶對象的pojo屬性中,好比:查詢定單及聯系關系用戶信息。
應用resultType沒法將查詢成果映照到pojo對象的pojo屬性中,依據對成果集查詢遍歷的須要選擇應用resultType照樣resultMap。
collection:
感化:
將聯系關系查詢信息映照到一個list聚集中。
場所:
為了便利查詢遍歷聯系關系信息可使用collection將聯系關系信息映照到list聚集中,好比:查詢用戶權限規模模塊及模塊下的菜單,可以使用collection將模塊映照到模塊list中,將菜單列表映照到模塊對象的菜單list屬性中,如許的作的目標也是便利對查詢成果集停止遍歷查詢。
假如應用resultType沒法將查詢成果映照到list聚集中。
以上內容是小編給年夜家引見的MyBatis高等映照進修教程,願望對年夜家有所贊助,假如年夜家想懂得更多內容,敬請存眷網站!