(有修改和补充,红色字体部分)
在mybatis如何进行一对一、一对多的多表查询呢?这里用一个简单的例子说明。
一、一对一
1、association
association通常用来映射一对一的关系,例如,有个类user,对应的实体类如下:(getter,setter方法省略)
private String id;//主键
private String userName;//用户姓名
有个类Article,对应的实体类如下:
private String id;//主键
private String articleTitle;//文章标题
private String articleContent;//文章内容
private String userId;//用户Id
如果我想查询一个用户的时候,也查到他写的一篇文章,可以怎样写呢?在类user加入一个属性article:
private String id;//主键
private String userName;//用户姓名
private Article article;//新增的文章属性
2、mapper.xml
我在user类的mapper.xml这样配置
<mapper namespace="User">
<resultMap id="userResultMap" type="test.mybatis.entity.User">
<id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="user_name" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
//这里把user的id传过去
//articleMapper为article对应的命名空间
<association property="article" column="id" select="articleMapper.selectArticleByUserId" />
</resultMap>
</mapper>
同时,我的article对应的xml这样写:
<mapper namespace="articleMapper">
<resultMap id="articleResultMap" type="test.mybatis.entity.Article">
<id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="article_title" property="articleTitle" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="article_content" property="articleContent" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="usr_id" property="usrId" jdbcType="VARCHAR" javaType="java.lang.String"/>
</resultMap>
……
<select id="selectArticleByUserId" parameterType="java.lang.String"
resultMap="ArticleResultMap" >
select * from tb_article where user_id=#{userId}
</select>
……
</mapper>
补充,多条件关联:
1)若联合关联查询的条件只有一个,如上面的<association>的column内容,可以省略对应selectArticleByUserId语句中的变量名
2)若多条件关联,则必须保持一致,如将<association>改为:
<association property="article" column="{userId=user_id,userName=user_name}" javaType="User" select="articleMapper.selectArticleByUserId"/>
article对应的xml改写为:
<select id="selectArticleByUserId" parameterType="User"
resultMap="ArticleResultMap" >
select * from tb_article where user_id=#{userId} and user_name=#{userName}
</select>
注意:<association>的column中的userId/userName分别对应selectArticleByUserId语句里的两个变量名,而不是column name。
javaType="User"可以写成javaType="map",当然,selectArticleByUserId也要相应修改为:parameterType="map"
二、一对多,collection,理解了一对一,一对多容易理解。
实体类增加对应属性:
private String id;//主键
private String userName;//用户姓名
private List<Article> articleList;
userMapper.xml这样配置
<resultMap id="userResultMap" type="test.mybatis.entity.User">
<id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
//这里把user的id传过去
<collection property="articleList" column="id" select="articleMapper.selectArticleListByUserId" />
</resultMap>
以下省略,类同,Mybatis会把结果封装成List类型。
三、如果我还想通过Article表另一张表,比如文章中有个fk_id,也可以像上面这样重复配置,把fk_id当做与另一张表关联的参数,那时就可以通过用户查到文章,查到文章关联的另一张表了。
- mybatis 一对一与一对多collection和association的使用
在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.association association通常用来映射一对一的关系,例如,有个类user,对应的实体 ...
- mybatis一对一 和 一对多 嵌套查询
实际项目中的,接口对外VO 会出现 一对一 和 一对多的情况,举例:小区 下面有 楼栋 ,楼栋 下面有 房屋 , 房屋里面又房间 小区Vo : districtVo { id: nam ...
- Mybatis一对一,一对多
一对一 假如有student表(学生表)和student_card表(学生证表). student表中有一个字段self_card用来查student_card,student_card表中有一个st ...
- Mybatis 一对一、一对多、多对多
一对一返回resultType <!-- 查询订单关联查询用户信息 resultType --> <select id="findOrderCustom" res ...
- Mybatis一对一和一对多配置
作者:夕下奕林 问题描述 现在有三张数据表,表名为orders,orderdetail,items,分别表示订单,订单详情,商品. 其中一个订单包含多个订单详情,表示订单中的不同个具体的商品,订单详情 ...
- Mybatis一对一、一对多、多对多查询。+MYSQL
场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...
- Mybatis一对一、一对多级联查询使用
在A对象的xml配置文件中 一对一<association property="shop" column="shop_id" select="c ...
- Mybatis 一对一、一对多、多对多关联之级联添加
示例项目:MIPO_CRM 一.一对一关联 示例:订单与销售机会 描述:在业务员与客户的联系人的联系记录中可以生成一条销售机会,而此条销售机会可生成一条订单,两者呈一对一关联. 1.表设计 oppor ...
- Mybatis 一对一,一对多,多对一,多对多的理解
First (一对一) 首先我来说下一对一的理解,就是一个班主任只属于一个班级,一个班级也只能有一个班主任.好吧这就是对于一对一的理解 怎么来实现呢? 这里我介绍了两种方式: 一种是:使用嵌套结果映射 ...
随机推荐
- POJ 1275 Cashier Employment 挺难的差分约束题
http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...
- OC学习篇之---类的定义
OC中类的相关知识 OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言 ...
- POS 60域用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 自定义域(Reserved Private) 1.变量属性 N...17(LLLVAR),3个字节的长度值+最大17个字节的数字字符域. 压缩时用 ...
- [Preact] Integrate react-router with Preact
React-router is the community favourite routing solution - it can handle all of your complex routing ...
- PL/SQL精明的调用栈分析
PL/SQL精明的调用栈分析 原文:http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html ...
- HDU 3791 二叉搜索树 (数据结构与算法实验题 10.2 小明) BST
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3791 中文题不说题意. 建立完二叉搜索树后进行前序遍历或者后序遍历判断是否一样就可以了. 跟这次的作业第 ...
- jboss-as-7.1.1.Final与jdk1.8不兼容解决方案
今天在安装1.8电脑上装了jboss7.1.1,配置好了运行的时候就是无法启动,最后得出答案是:jboss-as-7.1.1.Final与jdk1.8不兼容 1.如果你的电脑安装了jdk1.8,那么在 ...
- 安装Centos时“sda必须有一个GPT磁盘标签”
http://jingyan.baidu.com/article/c45ad29c272326051753e2d1.html
- php课程 5-19 php数据结构函数和常用函数有哪些
php课程 5-19 php数据结构函数和常用函数有哪些 一.总结 一句话总结: 1.php数据结构函数有哪些(四个)? • array_pop();从最后弹出一个值,返回弹出值• array_pus ...
- 【25.64%】【codeforces 570E】Pig and Palindromes
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...