mybatis之resultMap的关联查询

mybatis支持关联查询,即多个表之间的查询。这里介绍三种关联查询——联合查询,构造查询,子查询

联合查询要用到resultMap映射标记,在map配置文件中要用到<association>子节点(即复杂类型的关联)。下面依旧通过一个例子来说明:

由于可能小伙伴们没耐性看之前的案例,此处我会将所有代码一起贴上来

  1. 首先在数据库中创建如下两个表这里写图片描述这里写图片描述
  2. 创建如下目录(仅创建框起来的文件),请自行添加mybatis所需的jar包这里写图片描述
  3. MyBatisConfig.xml基础配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
PUBLIC "-//iBATIS.com//DTD SQL Map Config 3.0//EN" 
"mybatis-3-config.dtd" >
<configuration>

    <!-- 定义别名,这样在map.xml中不用写全类名了 -->
    <typeAliases>
        <typeAlias type="jike.book.pojo.JikeUser" alias="JikeUser" />
        <typeAlias type="jike.book.pojo.Author" alias="Author" />
    </typeAliases>

    <!-- 定义数据库信息,默认使用development数据库构造环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 采用jdbc事物管理 -->
            <transactionManager type="JDBC" />
            <!-- 配置数据库链接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="zyf1998don" />
            </dataSource>
        </environment>
    </environments>
    <!-- 定义映射器,即引用上面的那个SQL语句文件 -->
    <mappers>
        <mapper resource="jike/book/map/jikeUser.xml" />
        <mapper class="jike.book.map.InterfaceJikeUserMap" />
        <mapper resource="jike/book/map/author.xml" />
    </mappers>
</configuration>

4 . jikeUser.xml

<?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>
    <select id="findById" parameterType="int" resultType="jike.book.pojo.JikeUser">
        select *
        from jikeUser where id=#{id}
    </select>
</mapper>  

5 . author.xml

<?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="domain.blog.mappers.AuthorMapper">
    <insert id="insertAuthor" parameterType="Author" statementType="PREPARED">
        insert into Author(userID,realName,IDCard)
        values(#{jikeUser.id},#{realName},#{IDCard})
    </insert>

    <!-- 联合查询 -->
    <resultMap type="Author" id="JikeAuthorMap">
        <id property="id" column="author.id" />
        <result property="realName" column="realName" />
        <result property="IDCard" column="IDCard" />
        <!-- 会在userID中引用jikeUser表。用jileUser属性 -->
        <association property="jikeUser" column="userID" javaType="JikeUser">
            <id property="id" column="jikeUser.id" />
            <result property="userName" column="username" />
            <result property="passWord" column="password" />
        </association>
    </resultMap>

    <select id="selectAuthorJoin" resultMap="JikeAuthorMap">
        select * from author
        inner join jikeUser
        on jikeuser.id=author.userID
    </select>
</mapper>   

说明:联合查询需要用到resultMap元素。接下里一一说明其代表含义:
第一行:type代表引用了Author.java,此处用了别名机制,id不多解释
第二行:id子节点表示Author.java中的id属性是主键,所对应的列是author数据表中的id列。
第三行:Author.java中有个realName属性,对应着author数据表中的realName列。
第四行:如第三行,不多说
第五行:<association> 标签表示要用到复杂映射了。此处的column表示使用userID列来关联”jikeUser.java”(即property中的内容,此处用了别名机制)。javaType表示返回个JikeUser类的实例。
第六行:如第二行,只不过此处的id是jikeUser.java中的id属性。后面两行一样。
到此为止,两个表关联起来了
6 .Author.java

package jike.book.pojo;

public class Author {

    private Integer id;
    private JikeUser jikeUser;
    private String realName;
    private String IDCard;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public JikeUser getJikeUser() {
        return jikeUser;
    }
    public void setJikeUser(JikeUser jikeUser) {
        this.jikeUser = jikeUser;
    }
    public String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public String getIDCard() {
        return IDCard;
    }
    public void setIDCard(String IDCard) {
        this.IDCard = IDCard;
    }

}

7 .JikeUser.java

package jike.book.pojo;

public class JikeUser {

    private int id;
    private String userName;
    private String passWord;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public JikeUser() {
        super();
    }
    //用于构造关联
    public JikeUser(String userName, String passWord) {
        super();
        this.userName = userName;
        this.passWord = passWord;
    }

}

8 . TestAssociation.java

package jike.book.test;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import jike.book.pojo.Author;
import jike.book.pojo.JikeUser;

public class TestAssociation {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String resource="jike/book/map/MybatisConfig.xml";
        Reader reader=null;
        SqlSession sqlSession;
        try{
            reader=Resources.getResourceAsReader(resource);
        }catch(Exception e){
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
        sqlSession=sqlSessionFactory.openSession();
        try{
            List<Author> ap=sqlSession.selectList("selectAuthorJoin");
            for(Author temp:ap){
                System.out.println("作者真实姓名="+temp.getRealName()+" 对应的用户名="+temp.getJikeUser().getUserName());
            }
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally{
            sqlSession.close();
        }
    }

}

运行结果:这里写图片描述

构造关联仅仅是在JikeUser.java类中使用了构造器public JikeUser(String userName, String passWord){...} 然后在author.xml中改动了下:

<!-- 构造器查询 -->
    <resultMap type="Author" id="JikeAuthorMapByCon">
        <id property="id" column="author.id" />
        <result property="realName" column="realName" />
        <result property="IDCard" column="IDCard" />
        <!-- 会在userID中引用jikeUser表。用jileUser属性 -->
        <association property="jikeUser" column="userID" javaType="JikeUser">
            <constructor>
                <arg column="userName" javaType="String" />
                <arg column="password" javaType="String" />
            </constructor>
        </association>
    </resultMap>
    <select id="selectAuthorJoin" resultMap="JikeAuthorMapByCon">
        select * from author
        inner join jikeUser
        on jikeuser.id=author.userID
    </select>

子查询则将author.xml改动如下,其他地方不用改动。:

<!-- 子查询 -->
    <resultMap type="Author" id="JikeAuthorMapSubMap">
        <id property="id" column="author.id" />
        <result property="realName" column="realName" />
        <result property="IDCard" column="IDCard" />
        <!-- 子查询就是多了个select属性,该属性使用jikeUser.xml中的findById,将属性赋值给userID -->
        <association property="jikeUser" column="userID" javaType="JikeUSer"
            select="findById">
        </association>
    </resultMap>
    <select id="selectAuthorJoin" resultMap="JikeAuthorMapSubMap">
        select * from author
    </select>

可以看到 子查询是引用了jikeUser.xml中的SQL,说明它查询了两次。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
resultMapMyBatis 中用于自定义查询结果的映射方式。通过 resultMap,我们可以定义字段名和属性名的对应关系,并且可以选择性地指定要显示的列,使结果映射更加灵活和方便。使用 resultMap 可以实现字段名与属性名不一致的映射,以及关联查询时的结果处理。 需要注意的是,resultType 和 resultMap 在 select 元素中是互斥的,即不能同时存在,只能选择其中一个来定义返回类型。resultType 直接表示返回的类型,而 resultMap 则是对外部 resultMap 的引用。 使用 resultMap 的场景多种多样,可以根据实际需求灵活选择。推荐使用 resultMap,因为它更加灵活,并且在自定义结果映射方面功能更强大。 总结来说,resultMapMyBatis 中用于自定义查询结果的映射方式,可以实现字段名与属性名的对应关系,并且可以选择性地指定要显示的列,使结果映射更加灵活和方便。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MyBatisresultMap详解](https://blog.csdn.net/weixin_49707895/article/details/109564527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值