Mybatis表的關(guān)聯(lián)查詢詳情
導(dǎo)語
關(guān)于<resultMap>標(biāo)簽映射,<association>&<collection>的使用
什么時候用<resultMap>標(biāo)簽映射
- 1.當(dāng)我們查詢結(jié)果的返回值是由對象封裝的且對象中封裝了另一個對象時,用標(biāo)簽映射: 具體細節(jié)見:Mybatis表的關(guān)聯(lián)查詢
- 2.當(dāng)我們的實體類名與數(shù)據(jù)庫列名不一致時,可以使用標(biāo)簽映射:


什么時候用<association>&<collection>
- 當(dāng)我們的實體類中存有另一個實體類對象時,用
<association>來映射內(nèi)部的實體類對象。 - 一對一、多對一的關(guān)聯(lián)關(guān)系一般用
<association>。 - 當(dāng)我們的實體類中存有List或map集合是,用
<collection>來映射。 - 一對多的關(guān)聯(lián)關(guān)系一般用
<collection>。 - 無論是什么關(guān)聯(lián)關(guān)系,如果某方持有另一方的集合,則使用
<collection>標(biāo)簽完成映射,如果某方持有另一方的對象,則使用<association>標(biāo)簽完成映射。 - 具體細節(jié)見:Mybatis表的關(guān)聯(lián)查詢
無論是什么關(guān)聯(lián)關(guān)系,如果某方持有另一方的集合,則使用標(biāo)簽完成映射,如果某方持有另一方的對象,則使用標(biāo)簽完成映射。
Mybatis表的關(guān)聯(lián)查詢
一對多查詢
根據(jù)顧客ID查詢顧客信息(一),同時將顧客名下所有訂單查出(多)。
實現(xiàn)思路:
創(chuàng)建顧客類,存儲顧客信息:注意我們在顧客類中用List集合封裝了顧客名下的訂單信息。
package com.user.pojo;
import java.util.List;
public class Customer {
//customer表中的三個列
private Integer id;
private String name;
private Integer age;
//該客戶名下所有訂單集合
private List<Order> orderList;
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", orderList=" + orderList +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
public Customer(Integer id, String name, Integer age, List<Order> orderList) {
this.id = id;
this.name = name;
this.age = age;
this.orderList = orderList;
}
public Customer() {
}
}創(chuàng)建訂單類,存儲訂單信息:
package com.user.pojo;
public class Order {
private Integer id;
private String orderNumber;
private Double orderPrice;
@Override
public String toString() {
return "Order{" +
"id=" + id +
", orderNumber='" + orderNumber + '\'' +
", orderPrice=" + orderPrice +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}
public Double getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(Double orderPrice) {
this.orderPrice = orderPrice;
}
public Order(Integer id, String orderNumber, Double orderPrice) {
this.id = id;
this.orderNumber = orderNumber;
this.orderPrice = orderPrice;
}
public Order() {
}
}動態(tài)代理接口:
package com.user.mapper;
import com.user.pojo.Customer;
public interface CustomerMapper {
//根據(jù)客戶id查詢客戶所有信息并同時查詢該客戶名下的所有訂單
Customer getById(Integer id);
}Mapper.xml文件:
因為我們的查詢結(jié)果包括該顧客信息和顧客所有的訂單信息,所以我們的返回值需要自定義一個map集合來存儲。我們這里使用 <resultMap>標(biāo)簽映射的方式創(chuàng)建我們的集合customermap,并將該集合作為我們的返回值類型。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.user.mapper.CustomerMapper">
<!--
type:map集合中存儲的數(shù)據(jù)單位,是customer對象
id:該map結(jié)構(gòu)的標(biāo)識符
-->
<resultMap id="customermap" type="customer">
<!--
主鍵用id標(biāo)簽綁定,非主鍵用result標(biāo)簽綁定,集合用collection標(biāo)簽綁定
property是customer類中的屬性,column是屬性對應(yīng)存儲的數(shù)據(jù)庫表中的列名,ofType是集合中存儲的數(shù)據(jù)類型
-->
<!--主鍵綁定-->
<id property="id" column="id"></id>
<!--非主鍵綁定-->
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<!--訂單數(shù)據(jù),不在customer表內(nèi)-->
<collection property="orderList" ofType="order">
<id property="id" column="id"></id>
<result property="orderNumber" column="orderNumber"></result>
<result property="orderPrice" column="orderPrice"></result>
</collection>
</resultMap>
<select id="getById" parameterType="Integer" resultMap="customermap">
select customer.id ,name,age ,orders.id ,orderNumber ,orderPrice ,customer_id
from customer left join orders on customer.id = orders.customer_id
where customer.id = #{id}
</select>
<!--#{id}為占位符,隨便寫的,表示所要查詢的顧客ID-->
</mapper>測試程序:
import java.io.InputStream;
import java.util.List;
public class MyTest {
SqlSession sqlSession;
CustomerMapper customerMapper;
@Before
public void openSqlSession() throws IOException {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
sqlSession = factory.openSession();
customerMapper = sqlSession.getMapper(CustomerMapper.class);
}
@After
public void closeSqlSession(){
sqlSession.close();
}
@Test
public void testGetCustomerById(){
Customer customer = customerMapper.getById(1);
System.out.println(customer);
}
}其余基礎(chǔ)配置文件SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.user.pojo"/>
<package name="com.user.mapper"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.user.mapper"></package>
</mappers>
</configuration>

多對一查詢
根據(jù)訂單ID查詢訂單信息及該訂單所屬的顧客的信息。
實現(xiàn)思路:
創(chuàng)建訂單類,存儲訂單信息:注意我們在訂單類中封裝了該訂單下的顧客的信息。
package com.user.pojo;
public class Order {
//訂單信息
private Integer id;
private String orderNumber;
private Double orderPrice;
private Integer customer_id;
//訂單所屬的客戶
private Customer customer;
@Override
public String toString() {
return "Order{" +
"id=" + id +
", orderNumber='" + orderNumber + '\'' +
", orderPrice=" + orderPrice +
", customer_id=" + customer_id +
", customer=" + customer +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}
public Double getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(Double orderPrice) {
this.orderPrice = orderPrice;
}
public Integer getCustomer_id() {
return customer_id;
}
public void setCustomer_id(Integer customer_id) {
this.customer_id = customer_id;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public Order(Integer id, String orderNumber, Double orderPrice, Integer customer_id, Customer customer) {
this.id = id;
this.orderNumber = orderNumber;
this.orderPrice = orderPrice;
this.customer_id = customer_id;
this.customer = customer;
}
public Order() {
}
}創(chuàng)建顧客類,存儲顧客信息:
package com.user.pojo;
import java.util.List;
public class Customer {
//顧客信息
private Integer id;
private String name;
private Integer age;
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Customer(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Customer() {
}
}動態(tài)代理接口:
package com.user.mapper;
import com.user.pojo.Customer;
import com.user.pojo.Order;
public interface OrderMapper {
//根據(jù)主鍵查訂單并同時查詢該訂單的客戶信息
Order getById(Integer id);
}Mapper.xml文件:
因為我們的查詢結(jié)果包括該訂單信息和訂單所屬顧客的信息,所以我們的返回值需要自定義一個map集合來存儲。我們這里使用 <resultMap>標(biāo)簽映射的方式創(chuàng)建我們的集合customermap,并將該集合作為我們的返回值類型。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.user.mapper.OrderMapper">
<!--
type:map集合中存儲的數(shù)據(jù)單位,是order對象
id:該map結(jié)構(gòu)的標(biāo)識符
-->
<resultMap id="ordermap" type="order">
<!--
主鍵用id標(biāo)簽綁定,非主鍵用result標(biāo)簽綁定,集合用collection標(biāo)簽綁定,
這里沒有用collection標(biāo)簽,而是用了association,因為返回的只有一行數(shù)據(jù)(一個顧客的信息),不需要集合存儲
property是order類中的屬性,column是屬性對應(yīng)存儲的數(shù)據(jù)庫表中的列名,javaType是返回的數(shù)據(jù)用什么存儲
-->
<!--主鍵綁定-->
<id property="id" column="id"></id>
<!--非主鍵綁定-->
<result property="orderNumber" column="orderNumber"></result>
<result property="orderPrice" column="orderPrice"></result>
<result property="customer_id" column="customer_id"></result>
<!--顧客數(shù)據(jù),不在order表內(nèi)-->
<association property="customer" javaType="customer">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
</association>
</resultMap>
<select id="getById" parameterType="Integer" resultMap="ordermap">
select orders.id ,orderNumber ,orderPrice ,customer_id ,customer.id ,name,age
from orders left join customer on orders.customer_id = customer.id
where orders.id = #{id}
</select>
</mapper>
測試類:
package com.user;
import com.user.mapper.OrderMapper;
import com.user.pojo.Order;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyTest {
SqlSession sqlSession;
OrderMapper orderMapper;
@Before
public void openSqlSession() throws IOException {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
sqlSession = factory.openSession();
orderMapper = sqlSession.getMapper(OrderMapper.class);
}
@After
public void closeSqlSession(){
sqlSession.close();
}
@Test
public void testGetOrderById(){
Order order = orderMapper.getById(11);
System.out.println(order);
}
}其余基礎(chǔ)配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.user.pojo"/>
<package name="com.user.mapper"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.user.mapper"></package>
</mappers>
</configuration>

一對一查詢
同多對一。
實體類:

動態(tài)代理接口:

mapper.xml文件:

多對多查詢
多對多關(guān)聯(lián)中,需要通過中間表化解關(guān)聯(lián)關(guān)系。中間表描述兩張主鍵表的關(guān)聯(lián)。
到此這篇關(guān)于Mybatis表的關(guān)聯(lián)查詢詳情的文章就介紹到這了,更多相關(guān)Mybatis關(guān)聯(lián)查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中instanceof和getClass()的區(qū)別分析
本篇文章介紹了,在java中instanceof和getClass()的區(qū)別分析。需要的朋友參考下2013-04-04
Java解決xss轉(zhuǎn)義導(dǎo)致轉(zhuǎn)碼的問題
跨站腳本攻擊XSS是最普遍的Web應(yīng)用安全漏洞,本文主要介紹了Java解決xss轉(zhuǎn)義導(dǎo)致轉(zhuǎn)碼的問題,具有一定的參考價值,感興趣的可以了解一下2023-08-08
Java設(shè)計模式之觀察者模式(Observer Pattern)詳解
觀察者模式(Observer Pattern)是一種行為型設(shè)計模式,它定義了一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都能夠自動地得到通知并進行更新,本文將詳細的給大家介紹一下Java觀察者模式,需要的朋友可以參考下2023-07-07
httpclient staleConnectionCheckEnabled獲取連接流程解析
這篇文章主要為大家介紹了httpclient staleConnectionCheckEnabled獲取連接流程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
線程池之newCachedThreadPool可緩存線程池的實例
這篇文章主要介紹了線程池之newCachedThreadPool可緩存線程池的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
詳解Kotlin中如何實現(xiàn)類似Java或C#中的靜態(tài)方法
Kotlin中如何實現(xiàn)類似Java或C#中的靜態(tài)方法,本文總結(jié)了幾種方法,分別是:包級函數(shù)、伴生對象、擴展函數(shù)和對象聲明。這需要大家根據(jù)不同的情況進行選擇。2017-05-05
SpringBoot項目改為SpringCloud項目使用nacos作為注冊中心的方法
本文主要介紹了SpringBoot項目改為SpringCloud項目使用nacos作為注冊中心,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

