您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Mybatis_day05中怎么實現關聯查詢,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
關聯查詢
一對一查詢
案例:查詢所有訂單信息,關聯查詢下單用戶信息。
注意:因為一個訂單信息只會是一個人下的訂單,所以從查詢訂單信息出發關聯查詢用戶信息為一對一查詢。如果從用戶信息出發查詢用戶下的訂單信息則為一對多查詢,因為一個用戶可以下多個訂單。
方法一:
使用resultType,定義訂單信息po類,此po類中包括了訂單信息和用戶信息:
Sql語句:
SELECT orders.*, user.username, userss.address FROM orders, user WHERE orders.user_id = user.id
定義po類
Po類中應該包括上邊sql查詢出來的所有字段,如下:
public class OrdersCustom extends Orders { private String username;// 用戶名稱 private String address;// 用戶地址 get/set。。。。 OrdersCustom類繼承Orders類后OrdersCustom類包括了Orders類的所有字段,只需要定義用戶的信息字段即可。
Mapper.xml
<!-- 查詢所有訂單信息 --> <select id="findOrdersList" resultType="com.pp.mybatis.po.OrdersCustom"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
Mapper接口:
public List<OrdersCustom> findOrdersList() throws Exception; 測試: Public void testfindOrdersList()throws Exception{ //獲取session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper接口實例 UserMapper userMapper = session.getMapper(UserMapper.class); //查詢訂單信息 List<OrdersCustom> list = userMapper.findOrdersList(); System.out.println(list); //關閉session session.close(); }
小結:
定義專門的po類作為輸出類型,其中定義了sql查詢結果集所有的字段。此方法較為簡單,企業中使用普遍。
方法二:
使用resultMap,定義專門的resultMap用于映射一對一查詢結果。
Sql語句:
SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id
定義po類
在Orders類中加入User屬性,user屬性中用于存儲關聯查詢的用戶信息,因為訂單關聯查詢用戶是一對一關系,所以這里使用單個User對象存儲關聯查詢的用戶信息。
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; private User user; 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; } 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; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "Orders{" + "id=" + id + ", userId=" + userId + ", number='" + number + '\'' + ", createtime=" + createtime + ", note='" + note + '\'' + ", user=" + user + '}'; } }
Mapper.xml
<!-- 查詢訂單關聯用戶信息使用resultmap --> <resultMap type="com.pp.po.Orders" id="orderUserResultMap"> <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"/> <!-- 一對一關聯映射 --> <!-- property:Orders對象的user屬性 javaType:user屬性對應 的類型 --> <association property="user" javaType="com.pp.po.User"> <!-- column:user表的主鍵對應的列 property:user對象中id屬性--> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="address" property="address"/> </association> </resultMap> <select id="findOrdersWithUserResultMap" resultMap="orderUserResultMap"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM orders o JOIN `user` u ON u.id = o.user_id </select> 這里resultMap指定orderUserResultMap。 association:表示進行關聯查詢單條記錄 property:表示關聯查詢的結果存儲在com.pp.mybatis.po.Orders的user屬性中 javaType:表示關聯查詢的結果類型 <id property="id" column="user_id"/>:查詢結果的user_id列對應關聯對象的id屬性,這里是<id />表示user_id是關聯查詢對象的唯一標識。 <result property="username" column="username"/>:查詢結果的username列對應關聯對象的username屬性。
Mapper接口:
public List<Orders> findOrdersListResultMap() throws Exception; 測試: Public void testfindOrdersListResultMap()throws Exception{ //獲取session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper接口實例 UserMapper userMapper = session.getMapper(UserMapper.class); //查詢訂單信息 List<Orders> list = userMapper.findOrdersList2(); System.out.println(list); //關閉session session.close(); }
小結:
使用association完成關聯查詢,將關聯查詢信息映射到pojo對象中。
一對多查詢
案例:查詢所有用戶信息及用戶關聯的訂單信息。
用戶信息和訂單信息為一對多關系。
使用resultMap實現如下:
Sql語句:
SELECT u.*, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN orders o ON u.id = o.user_id
定義po類
在User類中加入List
public class User { private int id; private String username; private String sex; private Date birthday; private String address; private List<Orders> ordersList; @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + ", address='" + address + '\'' + ", ordersList=" + ordersList + '}'; } public List<Orders> getOrdersList() { return ordersList; } public void setOrdersList(List<Orders> ordersList) { this.ordersList = ordersList; } public int getId() { return id; } public void setId(int id) { this.id = id; } 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 Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
Mapper.xml
<resultMap type="com.pp.po.user" id="userOrderResultMap"> <!-- 用戶信息映射 --> <id property="id" column="id"/> <result property="username" column="username"/> <result property="birthday" column="birthday"/> <result property="sex" column="sex"/> <result property="address" column="address"/> <!-- 一對多關聯映射 --> <collection property="orders" ofType="com.pp.po.Orders"> <id property="id" column="oid"/> <!--用戶id已經在user對象中存在,此處可以不設置--> <!-- <result property="userId" column="id"/> --> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> </collection> </resultMap> <select id="getUserOrderList" resultMap="userOrderResultMap"> SELECT u.*, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN orders o ON u.id = o.user_id </select>
collection部分定義了用戶關聯的訂單信息。表示關聯查詢結果集
property="orders":關聯查詢的結果集存儲在User對象的上哪個屬性。
ofType="orders":指定關聯查詢的結果集中的對象類型即List中的對象類型。此處可以使用別名,也可以使用全限定名。
Mapper接口:
List<User> getUserOrderList();
測試
@Test public void getUserOrderList() { SqlSession session = sqlSessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<User> result = userMapper.getUserOrderList(); for (User user : result) { System.out.println(user); } session.close(); }
以上就是Mybatis_day05中怎么實現關聯查詢,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。