-------------------siwuxie095

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

MyBatis 多对多查询

 
 

 
 

以订单和商品为例,即
一个订单可以有多个商品,

一个商品可以属于多个订单

 
 

PS:这里需要订单详情作为中间表,以维护关系

 
 

 
 

需求如下:

 
 

根据订单号查询订单,并查出订单详情中的商品

 
 

 
 

具体实现:

 
 

1、先创建数据库
mybatis_db, 再创建表 t_order、t_detail 和 t_item,并

插入若干数据,其中:各自的主键分别是 order_id、detail_id 和 item_id,

且为自动增长,另外:t_detail 中的 order_id 和 item_id 为外键

 
 

 
 

 
 

 
 

 
 

 
 

2、创建实体类

 
 

Order.java:

 
 

package com.siwuxie095.entity;

 
 

import java.util.List;

 
 

public class Order {

 

private Integer orderId;

private String orderNo;

private Integer userId;

 

// 在 Order 类中添加 Detail 对象的 List 集合

private List<Detail> detailList;

 

public List<Detail> getDetailList() {

return detailList;

}

public
void setDetailList(List<Detail> detailList) {

this.detailList = detailList;

}

 

public Integer getOrderId() {

return orderId;

}

public
void setOrderId(Integer orderId) {

this.orderId = orderId;

}

 

public String getOrderNo() {

return orderNo;

}

 

public
void setOrderNo(String orderNo) {

this.orderNo = orderNo;

}

 

public Integer getUserId() {

return userId;

}

public
void setUserId(Integer userId) {

this.userId = userId;

}

 

@Override

public String toString() {

return
"Order [orderId=" + orderId + ", orderNo=" + orderNo

+ ", userId=" + userId + ", detailList=" + detailList + "]";

}

 

}

 
 

 
 

 
 

Detail.java:

 
 

package com.siwuxie095.entity;

 
 

public class Detail {

private Integer detailId;

private Integer totalPrice;

private Integer orderId;

private Integer itemId;

 

// 在 Detail 类中添加一个 Item 对象

private Item item;

 

public Item getItem() {

return item;

}

public
void setItem(Item item) {

this.item = item;

}

 

public Integer getDetailId() {

return detailId;

}

public
void setDetailId(Integer detailId) {

this.detailId = detailId;

}

 

public Integer getTotalPrice() {

return totalPrice;

}

public
void setTotalPrice(Integer totalPrice) {

this.totalPrice = totalPrice;

}

 

public Integer getOrderId() {

return orderId;

}

public
void setOrderId(Integer orderId) {

this.orderId = orderId;

}

 

public Integer getItemId() {

return itemId;

}

public
void setItemId(Integer itemId) {

this.itemId = itemId;

}

 

@Override

public String toString() {

return
"Detail [detailId=" + detailId + ", totalPrice=" + totalPrice

+ ", orderId=" + orderId + ", itemId=" + itemId + ", item=" + item + "]";

}

 

}

 
 

 
 

 
 

Item.java:

 
 

package com.siwuxie095.entity;

 
 

public class Item {

private Integer itemId;

private String itemName;

private Integer itemPrice;

 

public Integer getItemId() {

return itemId;

}

public
void setItemId(Integer itemId) {

this.itemId = itemId;

}

 

public String getItemName() {

return itemName;

}

public
void setItemName(String itemName) {

this.itemName = itemName;

}

 

public Integer getItemPrice() {

return itemPrice;

}

public
void setItemPrice(Integer itemPrice) {

this.itemPrice = itemPrice;

}

 

@Override

public String toString() {

return
"Item [itemId=" + itemId + ", itemName=" + itemName

+ ", itemPrice=" + itemPrice + "]";

}

 

}

 
 

 
 

 
 

3、创建映射器接口

 
 

OrderMapper.java:

 
 

package com.siwuxie095.mapper;

 
 

import com.siwuxie095.entity.Order;

 
 

public interface OrderMapper {

 

/**

* 根据订单号查询订单和订单详情中的商品

* @param orderNo

* @return

*/

Order getOrderAndItem(String orderNo);

}

 
 

 
 

 
 

4、创建
MyBatis 映射配置文件

 
 

OrderMapper.xml:

 
 

<?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.siwuxie095.mapper.OrderMapper">

 
 

<!-- 此时,resultType 自动映射已经不能满足,所以需要使用 resultMap 手动映射 -->

<select
id="getOrderAndItem"
resultMap="orderAndItemResultMap">

<!--

具体的 SQL 语句,其中:通过 #{} 占位符
获取传入的参数

 

注意:因为这里只有一个参数,所以大括号中可任意,建议

和实体类属性对应(不是和数据库表字段对应,这里相同只

是巧合)

-->

select o.*, d.detail_id, i.* from t_order o

left join t_detail d on o.order_id=d.order_id

left join t_item i on d.item_id=i.item_id

where order_no=#{orderNo}

</select>

 

 

<!--

注意:如果 resultMap 标签中没有嵌套映射,其 autoMapping 属性默认为 true,

反之则为 false。即
如果 resultMap 标签中没有 association、collection 等

标签,其 autoMapping 属性默认为 true,反之则为 false

 

所以这里要将 autoMapping 属性手动改为 true,当然,把所有属性一一写出来直

接映射也可以,这样就不用改 autoMapping 属性了

-->

<resultMap
type="Order"
id="orderAndItemResultMap"
autoMapping="true">

<id
column="order_id"
property="orderId"/>

<!--

collection 标签用于指定 Order 类中的 Detail 对象的 List 集合

 

javaType 属性为 List,ofType 属性为 List 中存放元素的类型

-->

<collection
property="detailList"
javaType="List"
ofType="Detail"
autoMapping="true">

<id
column="detail_id"
property="detailId"/>

<!-- association 标签用于指定 Detail 类中的 Item 对象 -->

<association
property="item"
javaType="Item"
autoMapping="true">

<id
column="item_id"
property="itemId"/>

</association>

</collection>

</resultMap>

 

</mapper>

 
 

 
 

 
 

5、创建
MyBatis 核心配置文件

 
 

mybatis-config.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>

 

<!-- 开启自动驼峰命名规则映射 -->

<settings>

<setting
name="mapUnderscoreToCamelCase"
value="true"/>

</settings>

 

 

<!-- 配置类型别名 -->

<typeAliases>

<typeAlias
type="com.siwuxie095.entity.Order"
alias="Order"/>

<typeAlias
type="com.siwuxie095.entity.Detail"
alias="Detail"/>

<typeAlias
type="com.siwuxie095.entity.Item"
alias="Item"/>

</typeAliases>

 

 

<!-- 配置环境(environments):包括事务管理和连接池 -->

<environments
default="development">

<environment
id="development">

 

<!-- 配置事务管理器 -->

<transactionManager
type="JDBC"
/>

 

<!-- 配置数据源:这里使用 MyBatis 内置连接池 -->

<dataSource
type="POOLED">

<property
name="driver"
value="com.mysql.jdbc.Driver"
/>

<!--

jdbc:mysql://localhost:3306/mybatis_db 可省略为 jdbc:mysql:///mybatis_db

-->

<property
name="url"
value="jdbc:mysql:///mybatis_db"
/>

<property
name="username"
value="root"
/>

<property
name="password"
value="8888"
/>

</dataSource>

 

</environment>

</environments>

 

 

<!-- 引入映射配置文件 -->

<mappers>

<mapper
resource="com/siwuxie095/mapper/OrderMapper.xml"/>

</mappers>

 

</configuration>

 
 

 
 

 
 

6、创建单元测试类

 
 

MyBatisManyToManyTest.java:

 
 

package com.siwuxie095.test;

 
 

import java.io.IOException;

import java.io.InputStream;

 
 

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.Test;

 
 

import com.siwuxie095.entity.Order;

import com.siwuxie095.mapper.OrderMapper;

 
 

public class MyBatisManyToManyTest {

 

/**

* 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 的 jar 包)

*

* 选中方法名,右键->Run As->JUint Test

*/

@Test

public
void testGetOrderAndItem() throws IOException{

 

String resource="mybatis-config.xml";

InputStream inputStream=Resources.getResourceAsStream(resource);

SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

SqlSession sqlSession=sqlSessionFactory.openSession();

 

OrderMapper orderMapper=sqlSession.getMapper(OrderMapper.class);

Order order = orderMapper.getOrderAndItem("D5221");

System.out.println(order);

 

sqlSession.close();

}

}

 
 

 
 

 
 

工程结构目录一览:

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

【made by siwuxie095】

MyBatis多对多查询的更多相关文章

  1. mybatis(一、原理,一对多,多对一查询)

    MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...

  2. SpringBoot使用Mybatis注解进行一对多和多对多查询(2)

    SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...

  3. mybatis学习记录六——一对一、一对多和多对多查询

    9       订单商品数据模型 9.1     数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...

  4. MyBatis 高级查询之多对多查询(十一)

    高级查询之多对多查询 查询条件:根据玩家名,查询游戏信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据玩家名查询游戏 * @param name ...

  5. Mybatis 多表实现多对多查询、添加操作

    Mybatis 多表实现多对多查询.添加操作 学习内容: 1. 多对多之添加操作 1.1.需求 1.2.数据库表(多对多数据库设计需要设计中间表) 1.3.类设计 1.4.Mapper 接口和 Map ...

  6. Mybatis 多表实现多对一查询、添加操作

    Mybatis 多表实现多对一查询.添加操作 学习内容: 1. 多对一之添加操作 1.1.需求 1.2.数据库表(多对一或一对多,数据库外键都是设置在多的一方) 1.3.类设计 1.4.Mapper ...

  7. mybatis由浅入深day02_4多对多查询_多对多查询总结

    4 多对多查询 4.1 需求(查询用户及用户购买商品信息) 查询用户及用户购买商品信息. 4.2 sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关 ...

  8. mybatis多对一关联

    mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ...

  9. 22Mybatis_订单商品数据模型_多对多查询以及对多对多查询的总结

    之前讲了一对一,一对多查询,这篇文章讲的是多对多. 先给出需求:查询用户及用户购买商品信息. 我们由之前的文章知道,这个需求是多对多的. 还是那个终止我们的mybatis所做的不管是之前的一对一还是一 ...

随机推荐

  1. R语言学习——欧拉计划(11)Largest product in a grid

    Problem 11 In the 20×20 grid below, four numbers along a diagonal line have been marked in red. 08 0 ...

  2. 长短时记忆网络(LSTM)

    长短时记忆网络 循环神经网络很难训练的原因导致它的实际应用中很处理长距离的依赖.本文将介绍改进后的循环神经网络:长短时记忆网络(Long Short Term Memory Network, LSTM ...

  3. Web 过滤器参数设置问题

    问题描述: 在代码定义了3个过滤器,分别为filter1,filter2,filter3,过滤的Servlet范围分别是"/*","/Servlet1",&qu ...

  4. PHP书写格式

    从一个例子开始. 启动编辑器,创建一个php文件并键入如下代码: <?php echo "你好!"; ?> 运行 将该文件命名为 test.php 并存储于 E:htm ...

  5. ElasticSearch client API

    从运行结果看并没有打印节点信息出来 从结果看出来,集群节点信道打印出来了,不过这种方法有个问题,就是当我们连接的节点挂掉了,就没法连接整个集群了,这个时候我们就利用他的一个嗅探的功能. 从这里我们可以 ...

  6. 【转载】全栈工程师-Hadoop, HBase, Hive, Spark

    学习参考这篇文章: http://www.shareditor.com/blogshow/?blogId=96 机器学习.数据挖掘等各种大数据处理都离不开各种开源分布式系统, hadoop用于分布式存 ...

  7. 模板方法模式( TemplateMethod)

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. AbstractClass 是抽象类,其实也是一个抽象模板,定义并实现 ...

  8. python拓展1 week1-week5复习回顾

    知识内容: 1.python基础概念及基础语法 2.python基础数据类型 3.python模块相关 4.python函数相关 5.python面向对象相关 6.python文件处理相关 注:本节内 ...

  9. OpenCL 图像卷积 3 使用 CPU

    ▶ CPU 图像卷积,共四种方法.分别为基本串行,使用模板,使用局部内存,使用AVX指令优化 ● 全部的代码,仅在主函数中选择调用的函数名即可. #include <stdio.h> #i ...

  10. MySQL5.7.20 二进制包 在Linux系统中的 安装和配置

    01, 下载安装包 =>  https://dev.mysql.com/downloads/mysql/ 02, 上传到linux系统, 笔者这里安装在 root 目录下, 常见安装在 var/ ...