共計 6396 個字符,預計需要花費 16 分鐘才能閱讀完成。
本篇文章給大家分享的是有關 Mybatis_day05 中怎么實現(xiàn)關聯(lián)查詢,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
關聯(lián)查詢
一對一查詢
案例:查詢所有訂單信息,關聯(lián)查詢下單用戶信息。
注意:因為一個訂單信息只會是一個人下的訂單,所以從查詢訂單信息出發(fā)關聯(lián)查詢用戶信息為一對一查詢。如果從用戶信息出發(fā)查詢用戶下的訂單信息則為一對多查詢,因為一個用戶可以下多個訂單。
方法一:
使用 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 查詢結果集所有的字段。此方法較為簡單,企業(yè)中使用普遍。
方法二:
使用 resultMap,定義專門的 resultMap 用于映射一對一查詢結果。
Sql 語句:
SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id
定義 po 類
在 Orders 類中加入 User 屬性,user 屬性中用于存儲關聯(lián)查詢的用戶信息,因為訂單關聯(lián)查詢用戶是一對一關系,所以這里使用單個 User 對象存儲關聯(lián)查詢的用戶信息。
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
!-- 查詢訂單關聯(lián)用戶信息使用 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 / !-- 一對一關聯(lián)映射 -- !-- 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:表示進行關聯(lián)查詢單條記錄 property:表示關聯(lián)查詢的結果存儲在 com.pp.mybatis.po.Orders 的 user 屬性中 javaType:表示關聯(lián)查詢的結果類型 id property= id column= user_id /:查詢結果的 user_id 列對應關聯(lián)對象的 id 屬性,這里是 id / 表示 user_id 是關聯(lián)查詢對象的唯一標識。 result property= username column= username /:查詢結果的 username 列對應關聯(lián)對象的 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 完成關聯(lián)查詢,將關聯(lián)查詢信息映射到 pojo 對象中。
一對多查詢
案例:查詢所有用戶信息及用戶關聯(lián)的訂單信息。
用戶信息和訂單信息為一對多關系。
使用 resultMap 實現(xiàn)如下:
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 類中加入 Listorders 屬性
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 / !-- 一對多關聯(lián)映射 -- 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 部分定義了用戶關聯(lián)的訂單信息。表示關聯(lián)查詢結果集
property= orders:關聯(lián)查詢的結果集存儲在 User 對象的上哪個屬性。
ofType= orders:指定關聯(lián)查詢的結果集中的對象類型即 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 中怎么實現(xiàn)關聯(lián)查詢,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業(yè)資訊頻道。