Ibatis组合键关联查询
在使用Ibatis时,会经常遇到关联查询,一般有两种解决方案:
- 使用代码进行关联查询
- 使用Ibatis配置文件进行关联查询
使用代码进行关联查询不作解释,本次主要是针对Ibatis配置文件进行关联查询进行探究,如发现有问题或不当之处还请不吝赐教!
对于Ibatis配置文件进行关联查询,下面举一个例子进行辅助描述:
假设有这样一个需求:某一网站页面需要展示文章,文在每篇文章后都会跟随一些相关的商品,同一商品可关联任意类别文章。
分析该需求可得知,文章一张表,相关商品一张表,相关商品和文章的关联在一张关联表中,因此当文章去查找相关商品时,就无法单单根据文章的主键id去查询,而是要根据关联表中文章的id和相关商品id来进行判断。
相关代码如下:
文章DO:
class Article{
/**
* 主键id
*/
private Long id;
/**
* 文章标题
*/
private String title;
/**
* 文章类别
*/
private Integer type;
/**
* 文章商品关联集合
*/
private List<articleCommodityRel> articleCommmodityRels;
}
文章商品关联DO:
class articleCommodityRel{
/**
* 主键id
*/
private Long id;
/**
* 商品id
*/
private Long commodityId;
/**
* 文章类别
*/
private Integer articleType;
}
为简单起见,省略相关商品DO以及文章商品关联sqlmapping,其中文章商品关联sqlmapping中根据商品id关联查询相关商品,即查询到一条关联记录,该条记录就会携带一条相关商品记录,具体不再赘述。
我们知道,如果是只有一种文章对应多种商品,只需要根据文章主键id即可查询,对应sqlmapping如下:
<resultMap class="Article" id="baseResult">
<result property="id" column="id" />
<result property="articleCommmodityRels" column="id" select="commdityAss.findById"/>
</resultMap>
那么遇到上述情况时:需要传递多个参数进行关联查询。又该如何书写呢?
在Ibatis中,有一个组合键的概念,利用它即可达到我们的目的,假设需要用文章id和类别联合查询,首先将结果放出来:
<resultMap class="Article" id="baseResult">
<result property="id" column="id" />
<result property="type" column="type" />
<result property="articleCommodityRels" column="{id=id,type=type}" select="commodityAss.findByIdAndType"/>
</resultMap>
没错,只是将result的column属性由column="id"改为column="{id=id,type=type}"即可,这样Ibatis就会将这两个字段对应的值传递给commodityAss.findByIdAndType对应的sql语句,从而实现了组合键查询,其具体形式为:{param1=column1,param2=column2,…,paramN=columnN}。
其中需要注意的是,param1..N是可以不用写的,只要对应查询语句的变量即可,但建议写上,因为这样即保证了可读性又保证了对应的参数值的匹配正确性,另外使用{}表示传递过去的是个Map类型,这一点很重要,column="id"和column="{id=id}"是完全不同的。
当然,并不建议都使用Ibatis配置进行关联查询,如上案例,假如只是查询一篇文章,那影响还不大,但是一旦是大量文章查询(如100),那么一次sql查询是查询100篇文章,获得每一篇文章后又会根据文章的主键id和类别进行关联查询,1+N问题(101次查询,1:查询100篇文章,100:查询相关商品)由此产生,所以这种查询的使用要根据实际使用场景来确定是否使用。
Ibatis组合键关联查询的更多相关文章
- 基于EF的数据外键关联查询
现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦.而我现在要做的就是基于EF的外键关联查询.很方便的. 首先,创建基础查询的BaseS ...
- pythonのsqlalchemy外键关联查询
#!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...
- ofbiz多表外键关联查询
实现一:Screem.xml 中的 section 里,加 <action>, 加 get-related 实现二:在代码中使用 DynamicViewEntity对象,加入addMemb ...
- .netcore2.1 ef 使用外键关联查询
//实体类 [Table("invoiceinfo", Schema = "obs")] public class invoice { [Key] public ...
- Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6923464.html 前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)--动 ...
- mybatis一对一关联查询——(八)
1.需求 查询所有订单信息,关联查询下单用户信息. 注意: 因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则为一对多查 ...
- mariadb索引、视图、关联查询、备份恢复、外键
连接查询(两张表关联查询) 在sql语句中,- - 代表注释 内关联查询(查询两张表的交集) select * from 表1 inner join 表2 on 表1.id=表2.id(此处id是表1 ...
- Mybatis高级查询之关联查询
learn from:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps 关联查询 准备 关联结果查询(一对一) resul ...
- Mybatis之关联查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
随机推荐
- ubuntu下升级网卡驱动
ubuntu下升级网卡驱动 无线局域网环境下,有个笔记本儿的无线经常断,而其它的终端都好好的,唯独它不行.所以想到检查和更新下无线网卡的驱动看看.以下是操作流程,记录一下. 阅读说明:##为标签, / ...
- [COGS 0011] 运输问题1
11. 运输问题1 ★★☆ 输入文件:maxflowa.in 输出文件:maxflowa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 一个工厂每天生 ...
- 使用Modelsim进行简单仿真
这里记载一下使用modelsim进行简单的仿真,方便以后使用的时候进行查看.所谓的简单的仿真,就是没有IP核.只用图形界面不用tcl脚本进行的仿真.简单的仿真步骤为: 1.改变路径到工作环境下的路径下 ...
- mybatis中的mapper接口文件以及example类的实例函数以及详解
##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列 ...
- STextComboBox & SComboBox
//简单智能 SNew(STextComboBox).ContentPadding(5).OptionsSource(&Options).InitiallySelectedItem(Optio ...
- Bat脚本自动卸载软件-静默执行
通过Bat脚本卸载软件,原理是得到某软件的ProductCode,然后通过MsiExec.exe命令卸载软件,下面是卸载一个产品的基本代码示例: set ML4.0HF4Name=Product4.0 ...
- H5滚动轮播插件
概述 JRedu 随着前端技术的发展,越来越多的H5技术被应用到实际开发中,尤其是js插件更是无处不用,本章节我们主要分享下如何去自己封装一个滚动轮播插件. 1效果图如下: 2主要功能 支持超 ...
- Spring思维导图(一)
关于Spring Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架 ...
- 如何两周达到150行Java程序的能力--part 1
面向对象程序先导课是体系化面向对象课程的重要组成部分,其目标是帮助那些有一定C语言基础,但对面向对象概念陌生,基本没碰过Java编程的同学.该课程设计为暑期选修课,因为没有其他课程,我们设计为现场训练 ...
- macOS Sierra Version 10.12.6 环境下Tomcat的下载与安装以及InterlliJ IDEA 2017.2 环境下配置Tomcat 与创建Web项目
一.Tomcat的下载与安装 1.官网(http://tomcat.apache.org/)下载Tomcat 9.0 Core:zip包: 2.解压到指定的文件夹即可安装完成: 3.测试是否安装成功 ...