(有修改和补充,红色字体部分)
 
在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的使用的更多相关文章

  1. mybatis 一对一与一对多collection和association的使用

    在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.association association通常用来映射一对一的关系,例如,有个类user,对应的实体 ...

  2. mybatis一对一 和 一对多 嵌套查询

    实际项目中的,接口对外VO  会出现 一对一 和 一对多的情况,举例:小区 下面有 楼栋  ,楼栋 下面有 房屋    ,   房屋里面又房间 小区Vo  : districtVo { id: nam ...

  3. Mybatis一对一,一对多

    一对一 假如有student表(学生表)和student_card表(学生证表). student表中有一个字段self_card用来查student_card,student_card表中有一个st ...

  4. Mybatis 一对一、一对多、多对多

    一对一返回resultType <!-- 查询订单关联查询用户信息 resultType --> <select id="findOrderCustom" res ...

  5. Mybatis一对一和一对多配置

    作者:夕下奕林 问题描述 现在有三张数据表,表名为orders,orderdetail,items,分别表示订单,订单详情,商品. 其中一个订单包含多个订单详情,表示订单中的不同个具体的商品,订单详情 ...

  6. Mybatis一对一、一对多、多对多查询。+MYSQL

    场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...

  7. Mybatis一对一、一对多级联查询使用

    在A对象的xml配置文件中 一对一<association property="shop" column="shop_id" select="c ...

  8. Mybatis 一对一、一对多、多对多关联之级联添加

    示例项目:MIPO_CRM 一.一对一关联 示例:订单与销售机会 描述:在业务员与客户的联系人的联系记录中可以生成一条销售机会,而此条销售机会可生成一条订单,两者呈一对一关联. 1.表设计 oppor ...

  9. Mybatis 一对一,一对多,多对一,多对多的理解

    First (一对一) 首先我来说下一对一的理解,就是一个班主任只属于一个班级,一个班级也只能有一个班主任.好吧这就是对于一对一的理解 怎么来实现呢? 这里我介绍了两种方式: 一种是:使用嵌套结果映射 ...

随机推荐

  1. ios sqlite数据库操作

    @interface MyViewController () { // 数据库实例,代表着整个数据库 sqlite3 *_db; } @end @implementation MyViewContro ...

  2. 【转载】zookeeper数据模型

    [转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ] ZooKeeper的数据结构, 与普通的文件系统极为类似. 见下图: 图片引用自developerworks 图中的每个节点称为一个 ...

  3. [慕课笔记]Node入口文件分析和目录初始化

    1:我们要在根目录下安装这些模块 2:然后来编写这些入口文件,这几行代码的大概意思是说,我引入一个express的模块,然后生成一个webview 的实例,将这个实例的监听端口设置成3000,然后就可 ...

  4. 《编程导论(Java)&#183;4.1数据抽象的含义》

    You have no choice about the necessity to integrateyour observations, your experiences, your knowled ...

  5. 【u118】日志分析

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况 ...

  6. 事件处理之一:两种方式:监听器与回调 分类: H1_ANDROID 2013-10-31 10:26 3250人阅读 评论(0) 收藏

    Android组件的事件处理有2种方式: 1.基于监听器的事件处理方式:先定义组件,然后为组件设定监听器. 详见http://blog.csdn.net/jediael_lu/article/deta ...

  7. VMware虚拟机12安装linux系统详细教程

    亲测有效,附图: 工具/原料 VM ware workstation12虚拟机(百度下载) 深度linux镜像ios系统文件 链接:https://pan.baidu.com/s/1RY1Plgru4 ...

  8. net的微服务架构

    net的微服务架构 眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两 ...

  9. FullPage.js全屏滚动插件解说

    1.主要功能 1).支持鼠标滚动 2).多个回调函数 3).支持手机.平板触屏事件 4).支持css3动画 5).支持窗口缩放 6).窗口缩放时自动调整 7).可设置滚动宽度.背景颜色.滚动速度.循环 ...

  10. ZOJ 3209 Treasure Map DLX

    用最少的矩阵覆盖n*m的地图.注意矩阵不能互相覆盖. 这里显然是一个精确覆盖,但因为矩阵拼接过程中,有公共的边,这里须要的技巧就是把矩阵的左边和以下截去一个单位. #include <stdio ...