Mybatis多表关联查询的实现(DEMO)
发布时间 - 2026-01-10 23:15:49 点击率:次概要

本节要实现的是多表关联查询的简单demo。场景是根据id查询某商品分类信息,并展示该分类下的商品列表。
一、Mysql测试数据
新建表Category(商品分类)和Product(商品),并插入几条测试数据。
create table Category (
Id int not null auto_increment,
Name varchar(80) null,
constraint pk_category primary key (Id)
);
INSERT INTO category(Name) VALUES ('女装');
INSERT INTO category(Name) VALUES ('美妆');
INSERT INTO category(Name) VALUES ('书籍');
create table product (
Id int not null auto_increment,
categoryId int not null,
Name varchar(80) null,
constraint pk_product primary key (Id),
constraint fk_product_2 foreign key (categoryId)
references category (Id)
);
create index productCat on product (categoryId);
create index productName on product (Name);
INSERT INTO product(CategoryId,Name) VALUES (1, '裂帛');
INSERT INTO product(CategoryId,Name) VALUES (1, '雅鹿');
INSERT INTO product(CategoryId,Name) VALUES (2,'膜法世家');
INSERT INTO product(CategoryId,Name) VALUES (2,'御泥坊');
INSERT INTO product(CategoryId,Name) VALUES (2, '雅诗兰黛');
INSERT INTO product(CategoryId,Name) VALUES (2, '欧莱雅');
INSERT INTO product(CategoryId,Name) VALUES (2, '韩后');
INSERT INTO product(CategoryId,Name) VALUES (2, '相宜本草');
INSERT INTO product(CategoryId,Name) VALUES (3,'疯狂JAVA');
INSERT INTO product(CategoryId,Name) VALUES (3,'JAVA核心技术');
二、配置mybatis-generator-config.xml
配置mybatis-generator-config.xml的方法见 JAVA入门[7]-Mybatis generator(MBG)自动生成mybatis代码 ,这里主要改动的是table节点。
<table tableName="category" enableCountByExample="true" enableDeleteByExample="true" enableSelectByExample="true" enableUpdateByExample="true"> <generatedKey column="Id" sqlStatement="mysql" identity="true"/> </table> <table tableName="product" enableCountByExample="true" enableSelectByExample="true" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true" enableDeleteByPrimaryKey="true" enableInsert="true"> <generatedKey column="Id" sqlStatement="mysql" identity="true"></generatedKey> </table>
配置好xml文件后,在Maven面板运行mybatis-generator:generate,自动生成相关的类。
三、自定义mybatis关联查询
1.封装实体dto
我们新定义CategoryDto,封装商品分类信息及其商品列表。
public class CategoryDto {
private Category category;
private List<Product> products;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
}
2.为CategoryMapper.java接口新增方法getById()
CategoryDto getById(int id);
3.配置CategoryMapper.xml
首先定义select节点,id对应上面的方法名getById;parameterType参数类型为Integer;resultMap为自定义resultMap的id。
<select id="getById" parameterType="java.lang.Integer" resultMap="CategoryResult">
SELECT Category.Id AS CateId,Category.Name AS CateName,Product.Id AS ProductId,Product.Name AS ProductName
FROM Category,Product
WHERE Category.Id=Product.CategoryId AND Category.Id=#{id}
</select>
接下来定义resultMap节点id为CategoryResult,type为CategoryDto。
关于resultMap:
- id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
- result – 注入到字段或 JavaBean 属性的普通结果
- association – 一个复杂的类型关联;许多结果将包成这种类型
- 嵌入结果映射 – 结果映射自身的关联,或者参考一个
- collection – 复杂类型的集
- 嵌入结果映射 – 结果映射自身的集,或者参考一个
完整参考官网:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps
用association对应category,collection对应products,然后用result对应到每个具体字段。
<resultMap id="CategoryResult" type="com.data.dto.CategoryDto"> <association property="category" javaType="com.data.pojo.Category"> <result property="id" column="CateId"></result> <result property="name" column="CateName"></result> </association> <collection property="products" ofType="com.data.pojo.Product"> <result property="id" column="ProductId"></result> <result property="name" column="ProductName"></result> </collection> </resultMap>
四、测试
在上一节测试基础上新增测试方法:
@Test
public void test_getById(){
int id=2;
CategoryDto dto= categoryMapper.getById(id);
if(dto==null){
System.out.println("不存在");
}else {
System.out.println("商品id="+dto.getId()+" name="+dto.getCategory().getName());
System.out.println("Products:"+dto.getProducts().size());
for(Product product:dto.getProducts()){
System.out.println(" |_"+product.getName());
}
}
}
运行之后居然报错了
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 6
后来找到了解决方案,修改resultMap,添加id节点就可以了。
<resultMap id="CategoryResult" type="com.data.dto.CategoryDto"> <id property="id" column="CateId"></id> …… </resultMap>
运行结果:
商品id=2 name=美妆
Products:6
|_膜法世家
|_御泥坊
|_雅诗兰黛
|_欧莱雅
|_韩后
|_相宜本草
# mybatis
# 多表关联查询
# ybatis
# 关联查询
# 关于QueryWrapper
# 实现MybatisPlus多表关联查询方式
# Mybatis 一对多和多对一关联查询问题
# mybatis-plus多表关联查询功能的实现
# mybatis如何使用注解实现一对多关联查询
# MyBatis实践之动态SQL及关联查询
# MyBatis 三表外关联查询的实现(用户、角色、权限)
# Mybatis关联查询之一对多和多对一XML配置详解
# Mybatis实现一对一、一对多关联查询的方法(示例详解)
# Mybatis-Plus多表关联查询的使用案例解析
# MyBatis的关联查询实现(一对一、一对多、多对多)
# 本草
# 的是
# 自定义
# 分类信息
# 自动生成
# 雅诗兰黛
# 测试数据
# 基础上
# 欧莱
# 错了
# 不存在
# 在上
# 可以帮助
# 几条
# 核心技术
# 商品分类
# 官网
# 就可以
# 本节
# 应到
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
JS去除重复并统计数量的实现方法
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何在云主机快速搭建网站站点?
香港服务器租用每月最低只需15元?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何自定义建站之星模板颜色并下载新样式?
Laravel如何使用Vite进行前端资源打包?(配置示例)
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
详解Oracle修改字段类型方法总结
如何在万网自助建站平台快速创建网站?
Laravel如何使用withoutEvents方法临时禁用模型事件
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
如何在橙子建站上传落地页?操作指南详解
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
郑州企业网站制作公司,郑州招聘网站有哪些?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Laravel如何生成API文档?(Swagger/OpenAPI教程)
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
php json中文编码为null的解决办法
如何选择PHP开源工具快速搭建网站?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
详解MySQL数据库的安装与密码配置
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
JavaScript如何实现倒计时_时间函数如何精确控制
如何将凡科建站内容保存为本地文件?
Android利用动画实现背景逐渐变暗
jQuery中的100个技巧汇总
如何为不同团队 ID 动态生成多个非值班状态按钮
如何快速搭建高效简练网站?
Laravel Fortify是什么,和Jetstream有什么关系
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel如何实现数据库事务?(DB Facade示例)
如何彻底删除建站之星生成的Banner?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何为不同团队 ID 动态生成多个独立按钮
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
原生JS实现图片轮播切换效果
如何快速使用云服务器搭建个人网站?
米侠浏览器网页背景异常怎么办 米侠显示修复
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
进行网站优化必须要坚持的四大原则
如何在七牛云存储上搭建网站并设置自定义域名?
如何在局域网内绑定自建网站域名?
微信小程序 配置文件详细介绍

