溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mybatis_day05中怎么實(shí)現(xiàn)關(guān)聯(lián)查詢

發(fā)布時(shí)間:2021-08-13 15:15:20 來源:億速云 閱讀:152 作者:Leah 欄目:數(shù)據(jù)庫

本篇文章給大家分享的是有關(guān)Mybatis_day05中怎么實(shí)現(xiàn)關(guān)聯(lián)查詢,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

 關(guān)聯(lián)查詢

一對一查詢

案例:查詢所有訂單信息,關(guān)聯(lián)查詢下單用戶信息。

注意:因?yàn)橐粋€(gè)訂單信息只會是一個(gè)人下的訂單,所以從查詢訂單信息出發(fā)關(guān)聯(lián)查詢用戶信息為一對一查詢。如果從用戶信息出發(fā)查詢用戶下的訂單信息則為一對多查詢,因?yàn)橐粋€(gè)用戶可以下多個(gè)訂單。

方法一:

使用resultType,定義訂單信息po類,此po類中包括了訂單信息和用戶信息:

Sql語句:

SELECT  orders.*,  user.username,  userss.address  FROM  orders,  user  WHERE orders.user_id = user.id

定義po類

Po類中應(yīng)該包括上邊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接口實(shí)例  UserMapper userMapper = session.getMapper(UserMapper.class);  //查詢訂單信息  List<OrdersCustom> list = userMapper.findOrdersList();  System.out.println(list);  //關(guān)閉session  session.close();  }

小結(jié):

定義專門的po類作為輸出類型,其中定義了sql查詢結(jié)果集所有的字段。此方法較為簡單,企業(yè)中使用普遍。

方法二:

使用resultMap,定義專門的resultMap用于映射一對一查詢結(jié)果。

Sql語句:

SELECT  orders.*,  user.username,  user.address  FROM  orders,  user  WHERE orders.user_id = user.id

定義po類

在Orders類中加入U(xiǎn)ser屬性,user屬性中用于存儲關(guān)聯(lián)查詢的用戶信息,因?yàn)橛唵侮P(guān)聯(lián)查詢用戶是一對一關(guān)系,所以這里使用單個(gè)User對象存儲關(guān)聯(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

<!-- 查詢訂單關(guān)聯(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"/> <!-- 一對一關(guān)聯(lián)映射 --> <!-- property:Orders對象的user屬性  javaType:user屬性對應(yīng) 的類型  -->  <association property="user" javaType="com.pp.po.User">  <!-- column:user表的主鍵對應(yīng)的列 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:表示進(jìn)行關(guān)聯(lián)查詢單條記錄  property:表示關(guān)聯(lián)查詢的結(jié)果存儲在com.pp.mybatis.po.Orders的user屬性中  javaType:表示關(guān)聯(lián)查詢的結(jié)果類型  <id property="id"  column="user_id"/>:查詢結(jié)果的user_id列對應(yīng)關(guān)聯(lián)對象的id屬性,這里是<id  />表示user_id是關(guān)聯(lián)查詢對象的唯一標(biāo)識。  <result property="username"  column="username"/>:查詢結(jié)果的username列對應(yīng)關(guān)聯(lián)對象的username屬性。

Mapper接口:

public List<Orders> findOrdersListResultMap() throws Exception;  測試:  Public void testfindOrdersListResultMap()throws Exception{  //獲取session  SqlSession session = sqlSessionFactory.openSession();  //獲限mapper接口實(shí)例  UserMapper userMapper = session.getMapper(UserMapper.class);  //查詢訂單信息  List<Orders> list = userMapper.findOrdersList2();  System.out.println(list);  //關(guān)閉session  session.close();  }

小結(jié):

使用association完成關(guān)聯(lián)查詢,將關(guān)聯(lián)查詢信息映射到pojo對象中。

一對多查詢

案例:查詢所有用戶信息及用戶關(guān)聯(lián)的訂單信息。

用戶信息和訂單信息為一對多關(guān)系。

使用resultMap實(shí)現(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"/>  <!-- 一對多關(guān)聯(lián)映射 -->  <collection property="orders" ofType="com.pp.po.Orders">  <id property="id" column="oid"/>  <!--用戶id已經(jīng)在user對象中存在,此處可以不設(shè)置-->  <!-- <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部分定義了用戶關(guān)聯(lián)的訂單信息。表示關(guān)聯(lián)查詢結(jié)果集

property="orders":關(guān)聯(lián)查詢的結(jié)果集存儲在User對象的上哪個(gè)屬性。

ofType="orders":指定關(guān)聯(lián)查詢的結(jié)果集中的對象類型即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中怎么實(shí)現(xiàn)關(guān)聯(lián)查詢,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI