-------------------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. COMMON INTERVIEW QUESTIONS

    1. What do you see yourself doing five years from now? 2. What motivates you to put forth your great ...

  2. [转]Java. SqlServer 使用

    public void add(Emp emp) throws Exception { String connectionUrl = "jdbc:sqlserver://localhost: ...

  3. 模型融合策略voting、averaging、stacking

    原文:https://zhuanlan.zhihu.com/p/25836678 1.voting 对于分类问题,采用多个基础模型,采用投票策略选择投票最多的为最终的分类. 2.averaging 对 ...

  4. 可怕的SCN!(转载)

    一.什么是SCNSCN(System Change Number 简称 SCN)是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字.在Oracle中,有四种SCN,分别为:系统检查点 ...

  5. Spark分析之TaskScheduler

    TaskScheduler概述: TaskScheduler是一个可插拔任务调度接口,通过不同的SchedulerBackend进行任务的调度.主要功能如下: 1.一个TaskScheduler只为一 ...

  6. Missing write access to /usr/local/lib/node_modules/webpack/node_modules/assert

    1. 加上sudo指令 sudo npm install ... 2. 可能是网络原因, 改用cnpm cnpm install ...

  7. vb 导出excel生成图表统计

    Private Sub btnExprot_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnE ...

  8. Laravel 5.4: 特殊字段太长报错

    laravel 5.4 改变了默认的数据库字符集,现在utf8mb4包括存储emojis支持.如果你运行MySQL v5.7.7或者更高版本,则不需要做任何事情. 当你试着在一些MariaDB或者一些 ...

  9. DevExpress ImageComboBoxEdit增加

    Combo_订单类型.Properties.Items.Clear() Select Case Combo_客户名称.EditValue Case "ABC" Combo_订单类型 ...

  10. linux查看磁盘占用常用的两个命令

    1.查看总容量.已使用.未使用容量:df -hl -h:以kb以上单位显示 -l:仅显示本地文件系统 2.查看当前路径下,每个文件/夹占用空间大小:du -sh *