Mybatis【18】-- Mybatis自关联多对一查询方式
注:代码已托管在GitHub
上,地址是:https://github.com/Damaer/Mybatis-Learning
,项目是mybatis-14-oneself-many2one
,需要自取,需要配置maven环境以及mysql
环境(sql
语句在resource
下的test.sql
中),觉得有用可以点个小星星。
docsify
文档地址在:https://damaer.github.io/Mybatis-Learning/#/
现在有个数据库查询需求,给出当前新闻栏目的id
,希望查出父辈栏目,父辈的父辈栏目等等信息。
数据表设计如下:
实体类设计:
package beans;
import java.util.Set;
public class NewsLabel {
private Integer id;
private String name;
private NewsLabel parent;
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 NewsLabel getParent() {
return parent;
}
@Override
public String toString() {
return "NewsLabel [id=" + id + ", name=" + name + ", parent=" + parent
+ "]";
}
public void setParent(NewsLabel parent) {
this.parent = parent;
}
}
sql查询接口定义:
public interface INewsLabelDao {
NewsLabel selectParentByParentId(int pid);
}
sql
定义在mapper.xml
文件中,可以看到,我们查询的时候调用的是id
为“selectParentByParentId”
的sql,返回结果做了一个映射(resultMap
),resultMap
的id
是“newsLabelMapper”
,“newsLabelMapper”
中除了id
映射和name
映射,还有一个<association/>
,里面定义的是关联关系定义。
property="parent"
:表示映射的属性是parent
javaType="NewsLabel"
:表示映射的类型是NewsLabel
column="pid"
:使用pid
作为参数传递进去再次查询。select="selectParentByParentId"
:查询parent
属性执行的语句
<?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="dao.INewsLabelDao">
<resultMap type="NewsLabel" id="newsLabelMapper">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="parent"
javaType="NewsLabel"
select="selectParentByParentId"
column="pid"/>
</resultMap>
<select id="selectParentByParentId" resultMap="newsLabelMapper">
select id,name,pid from newslabel where id=#{xxx}
</select>
</mapper>
测试类:
public class MyTest {
private INewsLabelDao dao;
private SqlSession sqlSession;
@Before
public void Before(){
sqlSession=MyBatisUtils.getSqlSession();
dao=sqlSession.getMapper(INewsLabelDao.class);
}
@Test
public void TestselectMinisterById(){
NewsLabel children=dao.selectParentByParentId(7);
System.out.println(children);
}
@After
public void after(){
if(sqlSession!=null){
sqlSession.close();
}
}
}
查询出来结果:
[service] 2018-07-16 11:54:10,123 - dao.INewsLabelDao.selectParentByParentId -683 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ==> Preparing: select id,name,pid from newslabel where id=?
[service] 2018-07-16 11:54:10,154 - dao.INewsLabelDao.selectParentByParentId -714 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ==> Parameters: 7(Integer)
[service] 2018-07-16 11:54:10,174 - dao.INewsLabelDao.selectParentByParentId -734 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ====> Preparing: select id,name,pid from newslabel where id=?
[service] 2018-07-16 11:54:10,174 - dao.INewsLabelDao.selectParentByParentId -734 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ====> Parameters: 4(Integer)
[service] 2018-07-16 11:54:10,181 - dao.INewsLabelDao.selectParentByParentId -741 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ======> Preparing: select id,name,pid from newslabel where id=?
[service] 2018-07-16 11:54:10,181 - dao.INewsLabelDao.selectParentByParentId -741 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ======> Parameters: 2(Integer)
[service] 2018-07-16 11:54:10,183 - dao.INewsLabelDao.selectParentByParentId -743 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ========> Preparing: select id,name,pid from newslabel where id=?
[service] 2018-07-16 11:54:10,183 - dao.INewsLabelDao.selectParentByParentId -743 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - ========> Parameters: 0(Integer)
[service] 2018-07-16 11:54:10,184 - dao.INewsLabelDao.selectParentByParentId -744 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - <======== Total: 0
[service] 2018-07-16 11:54:10,184 - dao.INewsLabelDao.selectParentByParentId -744 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - <====== Total: 1
[service] 2018-07-16 11:54:10,184 - dao.INewsLabelDao.selectParentByParentId -744 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - <==== Total: 1
[service] 2018-07-16 11:54:10,184 - dao.INewsLabelDao.selectParentByParentId -744 [main] DEBUG dao.INewsLabelDao.selectParentByParentId - <== Total: 1
NewsLabel [id=7, name=北京金瓯, parent=NewsLabel [id=4, name=CBA, parent=NewsLabel [id=2, name=体育新闻, parent=null]]]
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。求个 赞 和 在看 ,对我,是莫大的鼓励和认可,让我更有动力持续写出好文章。
Mybatis【18】-- Mybatis自关联多对一查询方式的更多相关文章
- myBatis系列之四:关联数据的查询
myBatis系列之三:增删改查是基于单表的查询,如果联表查询,返回的是复合对象,需要用association关键字来处理. 如User发表Article,每个用户可以发表多个Article,他们之间 ...
- mybatis 使用resultMap实现关联数据的查询(association 和collection )
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- mybatis实战教程二:多对一关联查询(一对多)
多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...
- MyBatis 高级查询之多对多查询(十一)
高级查询之多对多查询 查询条件:根据玩家名,查询游戏信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据玩家名查询游戏 * @param name ...
- mybatis实战教程(mybatis in action)之四:实现关联数据的查询
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表 ...
- MyBatis 实践 -动态SQL/关联查询
MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...
- mybatis(一、原理,一对多,多对一查询)
MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...
- SpringBoot使用Mybatis注解进行一对多和多对多查询(2)
SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...
- Mybatis表关联多对一
在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...
- 4. mybatis实战教程(mybatis in action)之四:实现关联数据的查询
转自:https://www.cnblogs.com/shanheyongmu/p/5653599.html 有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如 ...
随机推荐
- VS2022 17.12.0 Preview2版本对Copilot的功能增强
前提条件,使用最新版的17.12.0 Preview2,并且有有效的Copilot AI订阅,那么可以体验这个新鲜好用的功能 增强了Copilot AI对IEnumerable Visualizer的 ...
- JavaScript – Generator Function
参考 阮一峰 – Generator 函数的语法 介绍 Generator Function 是一种特别的函数, 它让函数有一种分阶段执行的能力. 一般的函数, 你调用它, 它执行所有函数内的代码, ...
- 【QT性能优化】QT性能优化之QT6框架高性能统计图框架快速展示百万个数据点曲线图
QT性能优化之QT6框架高性能统计图框架快速展示百万个数据点曲线图 文章目录 百万个数据点的QT统计图运行效果 百万个数据点的QT统计图程序的源代码 QT统计图功能和效果展示 QT统计图模块整体结构 ...
- 手搓大模型Task03:手搓一个最小的 Agent 系统
前言 训练一个大模型是一件高投入低回报的事情,况且训练的事情是由大的巨头公司来做的事情:通常我们是在已有的大模型基础之上做微调或Agent等:大模型的能力是毋庸置疑的,但大模型在一些实时的问题上, ...
- 完美转发(模板)--T&&
在C++模板编程中,完美转发(Perfect Forwarding)是一种技术,旨在保留函数参数的值类别,即在将参数传递到另一个函数时,无论参数是左值还是右值,都能够保持它的原始性质,而不会因为转发丢 ...
- excel江湖异闻录--◆K
网名◆K,按照群里同学的说法,K神和老大kluas,以及一个名为KKK的VBA强人,都是K字头家族的高手. 因为函数实力极强,时常碾压难题,被群里同学们冠以了"K神"的称号. 用笔 ...
- 称骨算命免费api接口_json数据接口示例_八字称骨测算程序php接口
称骨算命是算命方法的一种,和生辰八字算命.紫微斗数算命异曲同工,略有不同,虽然都是用出生的时间算命,但比较而言,称骨算命将命运分的比较粗略,只是把命运分为五十一种.故对命运的考察不细致,不太准确,可以 ...
- kmemleak 和kasan 的区别
kmemleak 和kasan 都是 Linux 内核中的一些工具和特性,用于帮助进行内存错误检测和修复.然而,它们之间有一些区别: 功能:kmemleak 用于检测内核中未释放的内存泄漏,它可以跟踪 ...
- 墨天轮最受DBA欢迎的数据库技术文档-SQL优化篇
[墨天轮最受欢迎的技术文档]系列文章得到了很多朋友的支持,大家也告诉了我们期待看到的主题这不!大家想看的优化系列-SQL优化篇来啦~原文文末送墨值中,欢迎大家参与! 数据库的调优被分成多个阶段,每个阶 ...
- prometheus+grafana配置流程
prometheus+grafana配置流程 首先,安装对应的exporter 查看prometheus支持的所有exporters https://prometheus.io/docs/instru ...