Mybatis表的關(guān)聯(lián)查詢?cè)斍?/h1>
更新時(shí)間:2022年09月21日 16:23:58 作者:姓蔡小朋
這篇文章主要介紹了Mybatis表的關(guān)聯(lián)查詢?cè)斍?,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
導(dǎo)語
關(guān)于<resultMap>標(biāo)簽映射,<association>&<collection>的使用
什么時(shí)候用<resultMap>標(biāo)簽映射
- 1.當(dāng)我們查詢結(jié)果的返回值是由對(duì)象封裝的且對(duì)象中封裝了另一個(gè)對(duì)象時(shí),用標(biāo)簽映射: 具體細(xì)節(jié)見:Mybatis表的關(guān)聯(lián)查詢
- 2.當(dāng)我們的實(shí)體類名與數(shù)據(jù)庫列名不一致時(shí),可以使用標(biāo)簽映射:


什么時(shí)候用<association>&<collection>
- 當(dāng)我們的實(shí)體類中存有另一個(gè)實(shí)體類對(duì)象時(shí),用
<association>來映射內(nèi)部的實(shí)體類對(duì)象。 - 一對(duì)一、多對(duì)一的關(guān)聯(lián)關(guān)系一般用
<association>。 - 當(dāng)我們的實(shí)體類中存有List或map集合是,用
<collection>來映射。 - 一對(duì)多的關(guān)聯(lián)關(guān)系一般用
<collection>。 - 無論是什么關(guān)聯(lián)關(guān)系,如果某方持有另一方的集合,則使用
<collection>標(biāo)簽完成映射,如果某方持有另一方的對(duì)象,則使用<association>標(biāo)簽完成映射。 - 具體細(xì)節(jié)見:Mybatis表的關(guān)聯(lián)查詢
無論是什么關(guān)聯(lián)關(guān)系,如果某方持有另一方的集合,則使用標(biāo)簽完成映射,如果某方持有另一方的對(duì)象,則使用標(biāo)簽完成映射。
Mybatis表的關(guān)聯(lián)查詢
一對(duì)多查詢
根據(jù)顧客ID查詢顧客信息(一),同時(shí)將顧客名下所有訂單查出(多)。
實(shí)現(xiàn)思路:
創(chuàng)建顧客類,存儲(chǔ)顧客信息:注意我們?cè)陬櫩皖愔杏肔ist集合封裝了顧客名下的訂單信息。
package com.user.pojo;
import java.util.List;
public class Customer {
//customer表中的三個(gè)列
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)建訂單類,存儲(chǔ)訂單信息:
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() {
}
}
動(dòng)態(tài)代理接口:
package com.user.mapper;
import com.user.pojo.Customer;
public interface CustomerMapper {
//根據(jù)客戶id查詢客戶所有信息并同時(shí)查詢?cè)摽蛻裘碌乃杏唵?
Customer getById(Integer id);
}
Mapper.xml文件:
因?yàn)槲覀兊牟樵兘Y(jié)果包括該顧客信息和顧客所有的訂單信息,所以我們的返回值需要自定義一個(gè)map集合來存儲(chǔ)。我們這里使用 <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集合中存儲(chǔ)的數(shù)據(jù)單位,是customer對(duì)象
id:該map結(jié)構(gòu)的標(biāo)識(shí)符
-->
<resultMap id="customermap" type="customer">
<!--
主鍵用id標(biāo)簽綁定,非主鍵用result標(biāo)簽綁定,集合用collection標(biāo)簽綁定
property是customer類中的屬性,column是屬性對(duì)應(yīng)存儲(chǔ)的數(shù)據(jù)庫表中的列名,ofType是集合中存儲(chǔ)的數(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>


多對(duì)一查詢
根據(jù)訂單ID查詢訂單信息及該訂單所屬的顧客的信息。
實(shí)現(xiàn)思路:
創(chuàng)建訂單類,存儲(chǔ)訂單信息:注意我們?cè)谟唵晤愔蟹庋b了該訂單下的顧客的信息。
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)建顧客類,存儲(chǔ)顧客信息:
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() {
}
}
動(dòng)態(tài)代理接口:
package com.user.mapper;
import com.user.pojo.Customer;
import com.user.pojo.Order;
public interface OrderMapper {
//根據(jù)主鍵查訂單并同時(shí)查詢?cè)撚唵蔚目蛻粜畔?
Order getById(Integer id);
}
Mapper.xml文件:
因?yàn)槲覀兊牟樵兘Y(jié)果包括該訂單信息和訂單所屬顧客的信息,所以我們的返回值需要自定義一個(gè)map集合來存儲(chǔ)。我們這里使用 <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集合中存儲(chǔ)的數(shù)據(jù)單位,是order對(duì)象
id:該map結(jié)構(gòu)的標(biāo)識(shí)符
-->
<resultMap id="ordermap" type="order">
<!--
主鍵用id標(biāo)簽綁定,非主鍵用result標(biāo)簽綁定,集合用collection標(biāo)簽綁定,
這里沒有用collection標(biāo)簽,而是用了association,因?yàn)榉祷氐闹挥幸恍袛?shù)據(jù)(一個(gè)顧客的信息),不需要集合存儲(chǔ)
property是order類中的屬性,column是屬性對(duì)應(yīng)存儲(chǔ)的數(shù)據(jù)庫表中的列名,javaType是返回的數(shù)據(jù)用什么存儲(chǔ)
-->
<!--主鍵綁定-->
<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>


一對(duì)一查詢
同多對(duì)一。
實(shí)體類:

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

mapper.xml文件:

多對(duì)多查詢
多對(duì)多關(guān)聯(lián)中,需要通過中間表化解關(guān)聯(lián)關(guān)系。中間表描述兩張主鍵表的關(guān)聯(lián)。
到此這篇關(guān)于Mybatis表的關(guān)聯(lián)查詢?cè)斍榈奈恼戮徒榻B到這了,更多相關(guān)Mybatis關(guān)聯(lián)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
基于String不可變字符與StringBuilder可變字符的效率問題
這篇文章主要介紹了String不可變字符與StringBuilder可變字符的效率問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2021-07-07
-
在Java的Hibernate框架中使用SQL語句的簡單介紹
這篇文章主要介紹了在Java的Hibernate框架中使用SQL語句的方法,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下 2016-01-01
-
Java 中的 BufferedWriter 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
BufferedWriter 是緩沖字符輸出流。它繼承于Writer。接下來通過本文給大家分享Java 中的 BufferedWriter知識(shí),需要的朋友參考下吧 2017-05-05
-
SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能
這篇文章主要詳細(xì)介紹了SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能的步驟詳解,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀 2023-06-06
-
關(guān)于ElasticSearch的常用增刪改查DSL和代碼
這篇文章主要介紹了關(guān)于ElasticSearch的常用增刪改查DSL和代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2024-04-04
最新評(píng)論
導(dǎo)語
關(guān)于<resultMap>標(biāo)簽映射,<association>&<collection>的使用
什么時(shí)候用<resultMap>標(biāo)簽映射
- 1.當(dāng)我們查詢結(jié)果的返回值是由對(duì)象封裝的且對(duì)象中封裝了另一個(gè)對(duì)象時(shí),用標(biāo)簽映射: 具體細(xì)節(jié)見:Mybatis表的關(guān)聯(lián)查詢
- 2.當(dāng)我們的實(shí)體類名與數(shù)據(jù)庫列名不一致時(shí),可以使用標(biāo)簽映射:


什么時(shí)候用<association>&<collection>
- 當(dāng)我們的實(shí)體類中存有另一個(gè)實(shí)體類對(duì)象時(shí),用
<association>來映射內(nèi)部的實(shí)體類對(duì)象。 - 一對(duì)一、多對(duì)一的關(guān)聯(lián)關(guān)系一般用
<association>。 - 當(dāng)我們的實(shí)體類中存有List或map集合是,用
<collection>來映射。 - 一對(duì)多的關(guān)聯(lián)關(guān)系一般用
<collection>。 - 無論是什么關(guān)聯(lián)關(guān)系,如果某方持有另一方的集合,則使用
<collection>標(biāo)簽完成映射,如果某方持有另一方的對(duì)象,則使用<association>標(biāo)簽完成映射。 - 具體細(xì)節(jié)見:Mybatis表的關(guān)聯(lián)查詢
無論是什么關(guān)聯(lián)關(guān)系,如果某方持有另一方的集合,則使用標(biāo)簽完成映射,如果某方持有另一方的對(duì)象,則使用標(biāo)簽完成映射。
Mybatis表的關(guān)聯(lián)查詢
一對(duì)多查詢
根據(jù)顧客ID查詢顧客信息(一),同時(shí)將顧客名下所有訂單查出(多)。
實(shí)現(xiàn)思路:
創(chuàng)建顧客類,存儲(chǔ)顧客信息:注意我們?cè)陬櫩皖愔杏肔ist集合封裝了顧客名下的訂單信息。
package com.user.pojo;
import java.util.List;
public class Customer {
//customer表中的三個(gè)列
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)建訂單類,存儲(chǔ)訂單信息:
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() {
}
}動(dòng)態(tài)代理接口:
package com.user.mapper;
import com.user.pojo.Customer;
public interface CustomerMapper {
//根據(jù)客戶id查詢客戶所有信息并同時(shí)查詢?cè)摽蛻裘碌乃杏唵?
Customer getById(Integer id);
}Mapper.xml文件:
因?yàn)槲覀兊牟樵兘Y(jié)果包括該顧客信息和顧客所有的訂單信息,所以我們的返回值需要自定義一個(gè)map集合來存儲(chǔ)。我們這里使用 <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集合中存儲(chǔ)的數(shù)據(jù)單位,是customer對(duì)象
id:該map結(jié)構(gòu)的標(biāo)識(shí)符
-->
<resultMap id="customermap" type="customer">
<!--
主鍵用id標(biāo)簽綁定,非主鍵用result標(biāo)簽綁定,集合用collection標(biāo)簽綁定
property是customer類中的屬性,column是屬性對(duì)應(yīng)存儲(chǔ)的數(shù)據(jù)庫表中的列名,ofType是集合中存儲(chǔ)的數(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>

多對(duì)一查詢
根據(jù)訂單ID查詢訂單信息及該訂單所屬的顧客的信息。
實(shí)現(xiàn)思路:
創(chuàng)建訂單類,存儲(chǔ)訂單信息:注意我們?cè)谟唵晤愔蟹庋b了該訂單下的顧客的信息。
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)建顧客類,存儲(chǔ)顧客信息:
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() {
}
}動(dòng)態(tài)代理接口:
package com.user.mapper;
import com.user.pojo.Customer;
import com.user.pojo.Order;
public interface OrderMapper {
//根據(jù)主鍵查訂單并同時(shí)查詢?cè)撚唵蔚目蛻粜畔?
Order getById(Integer id);
}Mapper.xml文件:
因?yàn)槲覀兊牟樵兘Y(jié)果包括該訂單信息和訂單所屬顧客的信息,所以我們的返回值需要自定義一個(gè)map集合來存儲(chǔ)。我們這里使用 <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集合中存儲(chǔ)的數(shù)據(jù)單位,是order對(duì)象
id:該map結(jié)構(gòu)的標(biāo)識(shí)符
-->
<resultMap id="ordermap" type="order">
<!--
主鍵用id標(biāo)簽綁定,非主鍵用result標(biāo)簽綁定,集合用collection標(biāo)簽綁定,
這里沒有用collection標(biāo)簽,而是用了association,因?yàn)榉祷氐闹挥幸恍袛?shù)據(jù)(一個(gè)顧客的信息),不需要集合存儲(chǔ)
property是order類中的屬性,column是屬性對(duì)應(yīng)存儲(chǔ)的數(shù)據(jù)庫表中的列名,javaType是返回的數(shù)據(jù)用什么存儲(chǔ)
-->
<!--主鍵綁定-->
<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>

一對(duì)一查詢
同多對(duì)一。
實(shí)體類:

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

mapper.xml文件:

多對(duì)多查詢
多對(duì)多關(guān)聯(lián)中,需要通過中間表化解關(guān)聯(lián)關(guān)系。中間表描述兩張主鍵表的關(guān)聯(lián)。
到此這篇關(guān)于Mybatis表的關(guān)聯(lián)查詢?cè)斍榈奈恼戮徒榻B到這了,更多相關(guān)Mybatis關(guān)聯(lián)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于String不可變字符與StringBuilder可變字符的效率問題
這篇文章主要介紹了String不可變字符與StringBuilder可變字符的效率問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
在Java的Hibernate框架中使用SQL語句的簡單介紹
這篇文章主要介紹了在Java的Hibernate框架中使用SQL語句的方法,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-01-01
Java 中的 BufferedWriter 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
BufferedWriter 是緩沖字符輸出流。它繼承于Writer。接下來通過本文給大家分享Java 中的 BufferedWriter知識(shí),需要的朋友參考下吧2017-05-05
SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能
這篇文章主要詳細(xì)介紹了SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能的步驟詳解,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀2023-06-06
關(guān)于ElasticSearch的常用增刪改查DSL和代碼
這篇文章主要介紹了關(guān)于ElasticSearch的常用增刪改查DSL和代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

