-------------------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. BOM及改变this指向

    bom ( borwser object model 浏览器对象模型) 定义js操作浏览器的属性和方法 window.open(url way())    中有两个参数 url代表打开的网页地址 wa ...

  2. Hibernate inverse反转

    inverse: inverse: 指定由哪一方来维护之间的关联关系 false默认,表示不放弃,是主动放 true:表示把关联关系的维护反转(放弃),对集合对象的修改不会被反映到数据库中 容易出现的 ...

  3. Spring 基础使用

    1 id 和 name 的区别 id:不可重复,不可包含特殊字符 name:可以重复,可以包含特殊字符 2 scope singleton:配置单例模式(默认),在容器启动时创建对象,而且只创建一个 ...

  4. 笔记本电脑安装centos 7(转)

    1. 下载 CentOS 镜像 下载地址 : https://wiki.centos.org/Download, 我下载的是1406 2. 使用 UltraISo 将镜像刻录到U盘 UltraISo  ...

  5. ECCV 2018 | 旷视科技提出GridFace:通过学习局部单应变换实现人脸校正

    全球计算机视觉三大顶会之一 ECCV 2018(European Conference on Computer Vision)即将于 9 月 8 -14 日在德国慕尼黑拉开帷幕,旷视科技有多篇论文被此 ...

  6. String.Join() 方法 的用法

    连接指定数组的元素或集合的成员,在每个元素或成员之间使用指定的分隔符.重载此成员.有关此成员的完整信息(包括语法.用法和示例),请单击重载列表中的相应名称 Join(String, IEnumerab ...

  7. Tornado之模板

    知识点 静态文件配置 static_path StaticFileHandler 模板使用 变量与表达式 控制语句 函数 块 4.1 静态文件 现在有一个预先写好的静态页面文件 (下载静态文件资源), ...

  8. centos7.3 快速安装 mariadb(mysql)

    从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自带的repos安装很简单: yum install mariadb mariadb-server systemct ...

  9. jpa 一对一

    实体   Manager package entity; import javax.persistence.Column; import javax.persistence.Entity; impor ...

  10. Django中使用Celery实现定时任务(用djcelery)

    一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...