zoukankan      html  css  js  c++  java
  • 【转】mybatis 一对一与一对多collection和association的使用

    (有修改和补充,红色字体部分)
     
    在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当做与另一张表关联的参数,那时就可以通过用户查到文章,查到文章关联的另一张表了。

  • 相关阅读:
    开始学习设计模式
    <转载>CCeButtonST v1.2
    CRITICAL_SECTION 学习
    简单工厂模式
    《转》Owner Draw Button StepbyStep
    低调 平和
    MFC RTTI (DECLARE_DYNAMIC 及IMPLEMENT_DYNAMIC 宏)
    为程序集延迟签名.
    NBear3.7 在 Suse11 下 的 MonoDevelop2(Alpha2)改造成功。
    Mono开发。
  • 原文地址:https://www.cnblogs.com/wangjuns8/p/7841502.html
Copyright © 2011-2022 走看看