精华内容
下载资源
问答
  • MyBatis在映射文件中加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型; 嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。开发人员可以...

    ps.本文主要是对于上一篇博客的补充,主要是对于映射文件的拓展。

    MyBatis在映射文件中加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。
    嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型;
    嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。开发人员可以使用上述任意一种方式实现对关联关系的加载。

    那么这两者之间有什么联系?
    在这里插入图片描述

    如何理解这些区别呢?????

    咱们直接代码来说话。

    <?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="com.zsj.mapper.PersonMapper">
    	<!-- 嵌套查询:通过执行另外一条SQL映射语句来返回预期的特殊类型 -->
    	<select id="findPersonById" parameterType="Integer" 
                                          resultMap="IdCardWithPersonResult">
    		SELECT * from tb_person where id=#{id}
    	</select>
    	<resultMap type="Person" id="IdCardWithPersonResult">
    		<id property="id" column="id" />
    		<result property="name" column="name" />
    		<result property="age" column="age" />
    		<result property="sex" column="sex" />
    		<!-- 一对一:association使用select属性引入另外一条SQL语句 -->
    		<association property="card" column="card_id" javaType="IdCard"
    			select="com.zsj.mapper.IdCardMapper.findCodeById" />
    	</resultMap>
    	
    	<!-- 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 -->
    	<select id="findPersonById2" parameterType="Integer" 
    	                                   resultMap="IdCardWithPersonResult2">
    	    SELECT p.*,idcard.code
    	    from tb_person p,tb_idcard idcard
    	    where p.card_id=idcard.id 
    	    and p.id= #{id}
    	</select>
    	<resultMap type="Person" id="IdCardWithPersonResult2">
    	    <id property="id" column="id" />
    	    <result property="name" column="name" />
    	    <result property="age" column="age" />
    	    <result property="sex" column="sex" />
    	    <association property="card" javaType="IdCard">
    	        <id property="id" column="card_id" />
    	        <result property="code" column="code" />
    	    </association>
    	</resultMap>	
    </mapper>
    
    

    输出结果:

    嵌套查询:
    在这里插入图片描述
    嵌套结果:
    在这里插入图片描述
    从上面的调试日志可以看出,两者不同方式的查询SQL语句的难易程度和语句数。并且从代码中不难看出两者在编写SQL语句代码方面不同,嵌套查询相较于嵌套结果来说,编写较简单!!!

    希望可以帮到大家,有什么措辞不正确,希望得到指正。
    参考文献:
    MyBatis官方文档

    展开全文
  • mybatis 高级关联集合映射:嵌套查询和嵌套结果小案例,帮助更好的理解关联集合的使用

    三张表,通过班级 clsId=3001 查找班级和学生的信息

    1. 建表 表结构如下

    create table student
    (
        stuId number(4) primary key,
        stuName varchar2(20) not null,
        stuSex varchar2(4),
        stuBirthday date,
        classId number(4)
    );
    
    create table classes
    (
        clsId number(4) primary key,
        clsName varchar2(20) not null,
        teacherId number(4)
    );
    
    create table teacher
    (
        teacherId number(4) primary key,
        teacherName varchar2(20) not null,
        workYear number(2),
        professional varchar2(20)
    );

    插入一些测试数据

    2. entity包下新建三个实体类和三个 同名Mapper.xml

    3. mapper包内新建三个同名Mapper接口,现在不做任何处理

    4. mybatis.xml 中的配置

    • mappers的配置
    <mappers>
     <mapper resource="com/yc/mybitis/entity/ClassesMapper.xml"/>
     <mapper resource="com/yc/mybitis/entity/StudentMapper.xml"/>
     <mapper resource="com/yc/mybitis/entity/TeacherMapper.xml"/>
     </mappers> 
    • 定义别名
    <!-- 定义类型的别名 -->
        <typeAliases>
            <!--  只能为一种类型指定别名 -->
            <!--<typeAlias type="com.yc.mybitis.entity.User" alias="User"/>-->
    
            <!-- 给指定包的所有类定义别名, 别名就是与不带包的类名相同 -->
            <package name="com/yc/mybitis/entity"/>
    
        </typeAliases>
    

    5. mybatis工具类编写 MybatisUtil

    public class MybatisUtil {
        private static Logger log=LoggerFactory.getLogger(MybatisUtil.class);
        private static SqlSessionFactory factory;
        static{
            try {
                log.debug("加载mybatis.xml的配置文件");
                InputStream in =Resources.getResourceAsStream("mybatis.xml");
                log.debug("加载mybatis.xml的配置文件成功");
    
    
                log.debug("通过配置文件的数据构建sql session工厂");
                factory=new SqlSessionFactoryBuilder().build(in);
                log.debug("通过配置文件的数据构建sql session工厂 【成功】"  );
    
                log.debug("生产sqlsession 工厂对象");
            } catch (IOException e) {
                e.printStackTrace();
                log.debug("加载mybatis.xml的配置文件失败",e);
            }
    
        }
    
        public static SqlSession getSession(){
            //原来这么些
            //InputStream in=MybatisUtil.class.getClassLoader().getResourceAsStream("mybatis.xml");
    
            //mybatis这么写
            SqlSession session=null;
            session=factory.openSession();
            log.debug("生产sqlsession 工厂对象 成功");
            return session;
        }
    
        /**
         * 
         * @param isAutoCommit :true: 自动提交事务, false 手动事务
         * @return
         */
        public static SqlSession getSession(boolean isAutoCommit){
            SqlSession session=null;
            session=factory.openSession( isAutoCommit );
            log.debug("生产sqlsession 工厂对象 成功");
            return session;
        }
    
    
    }

    6. 查询要求:
    A、嵌套查询:
    通过班级 clsId=3001 查找班级和学生的信息
    select * from classes where clsId =3001
    select * from student where classId =3001

    ClassesMapper.xml中的配置

    <mapper namespace="com.yc.mybatis.mapper.ClassesMapper"> 
    
        <!-- 第一种 嵌套查询  记录多条,所以不能使用  association   必须选择 collection:表示多个结果-->
        <resultMap type="Classes" id="ClassesMap">
            <id column="clsId" property="clsId"/><!-- 指定取出字段值会取出多次,不指定就只会取出一次 -->
            <collection property="stus" column="clsId" select="getStudents"></collection>
        </resultMap>
    
        <select id="getClassesById" parameterType="int" resultMap="ClassesMap">
            select * from classes where clsId=#{clsId} 
        </select>
    
        <select id="getStudents" resultType="Student">
            select * from student where classId=#{clsId} 
        </select>
        </mapper>

    这一次的查询不需要用到 StudentMapper 和TeacherMapper,就不给出内容了

    7. 接口 ClassesMapper.java只有一个方法,注意方法名需要和 ClassesMapper.xml中select语句指定的 id 一致

    public interface ClassesMapper {
    
        public Classes getClassesById(int clsid);
    }

    8. Junit单元测试

    public class ClassesMapperTest {
        private ClassesMapper classesMapper;
    
        @Before
        public void setUp() throws Exception {
            classesMapper=MybatisUtil.getSession().getMapper(ClassesMapper.class);
        }
    
        @After
        public void tearDown() throws Exception {
            classesMapper=null;
        }
    
        @Test
        public void testGetClassesById() {
            Classes c=classesMapper.getClassesById(3001);
            System.out.println(c);
        }
    
    }

    9、运行测试类。成功。
    这里写图片描述

    6. 查询要求
    B、嵌套结果:
    select * from student s join classes c on c.clsId=3001 and s.classId=c.clsId

    ClassesMapper.xml中的配置 ,为了避免大家混淆了两种写法,建议新建一个ClassesMapper02.xml

    <mapper namespace="com.yc.mybatis.mapper.ClassesMapper02">
    
        <!--
            第二种 嵌套结果 记录多条,所以不能使用 association 必须选择 collection:表示多个结果 
            select * from student s join classes c on c.clsId=3001 and s.classId=c.clsId
        -->
        <resultMap type="Classes" id="ClassesMap03">
            <id column="clsId" property="clsId" /><!--指定取出字段值会取出多次,不指定就只会取出一次-->
            <result column="clsName" property="clsName" />
    
            <collection property="stus" ofType="Student" resultMap="StudentMap">
                <!--
                    ofType:指定 list集合中的数据类型
                -->
    
            </collection>
        </resultMap>
    
        <resultMap type="Student" id="StudentMap">
            <id column="stuId" property="stuId" />
            <result column="stuName" property="stuName" />
            <result column="stuSex" property="stuSex" />
            <result column="classId" property="classId" />
            <!--<result column="stuBirthday" property="stuBirthday"/>-->
        </resultMap>
    
    
        <select id="getClassesById" parameterType="int" resultMap="ClassesMap03">
            select * from student s join classes c on c.clsId=#{clsId} and
            s.classId=c.clsId 
        </select>
    
    
    </mapper>

    7. 与嵌套查询的步骤相同,同样建议新建一个接口和测试类
    8. 注意,要是新建了ClassesMapper.xml ,那么我们项目的主配置文件 mybatis.xml中的mappers也需要更改
    这里写图片描述

    <mappers>
    
     <!--<mapper resource="com/yc/mybitis/entity/ClassesMapper.xml"/>-->
    
     <mapper resource="com/yc/mybitis/entity/ClassesMapper02.xml"/>
    <mapper resource="com/yc/mybitis/entity/StudentMapper.xml"/>
     <mapper resource="com/yc/mybitis/entity/TeacherMapper.xml"/>
     </mappers>

    9. 测试成功。
    这里写图片描述

    案例中的错误修改

    上课走了个神,然后就错过了姜哥讲的小知识,然后就导致了项目出错,还好看懂了报错提示。不多说,我们看错误详解
    这里写图片描述

    数据类型不匹配导致反射出现异常,我们需要在collection 中使用 ofType属性指明集合中的数据类型,
    这里写图片描述

    好啦,大家动手试试。

    展开全文
  • 1.集合的嵌套查询
    1.集合的嵌套查询
    展开全文
  • mybatis嵌套结果和嵌套查询

    千次阅读 2020-04-25 22:41:11
    嵌套结果 是一次查询 然后映射到对应属性 嵌套查询是多次查询 有N+1问题 解决方法就是使用懒加载和嵌套结果 我们经常用的查询也就是嵌套结果查询 https://www.cnblogs.com/fly-book/p/10405222.html ...

    嵌套结果 是一次查询 然后映射到对应属性
    嵌套查询是多次查询 有N+1问题 解决方法就是使用懒加载和嵌套结果

    我们经常用的查询也就是嵌套结果的查询

    https://www.cnblogs.com/fly-book/p/10405222.html

    展开全文
  • 嵌套查询和集合查询

    2018-08-06 09:29:37
    数据库嵌套查询和集合查询,数据库嵌套查询和集合查询
  • 关联的嵌套查询显示得到一个结果集,然后根据这个结果集的每一条记录进行关联查询。 现在假设嵌套查询就一个(即resultMap 内部就一个association标签),现查询结果集返回条数为N,那么关联查询语句将会被执行N次...
  • 2.3.2.3.嵌套(关联)查询 / N+1 / 延迟加载 备注: 1.这里的N+1 主要是指的我们查询一张表的时候,有可能还会涉及到查询别的表数据; 2.查询员工表的时候,有可能需要查询员工所在的部门...嵌套结果 package com.gupao...
  • SQL子查询和嵌套查询

    2012-05-14 20:51:48
    SQL子查询和嵌套查询
  • ES的嵌套查询和嵌套聚合

    千次阅读 2019-04-29 11:17:59
    1.想要实现嵌套查询和嵌套聚合,首先需要在索引里面设置某个属性是嵌套类型(一般是List)-----type=nested 2.API的demo-嵌套查询---(使用场景:需要根据list中的两个字段以and的关系进行查询) // 构造布尔查询...
  • MySQL子查询 嵌套查询

    万次阅读 多人点赞 2018-09-27 20:18:58
    查询嵌套在其他查询中的查询。 有三张表分别如下: customers: 存储顾客信息 orderitems:只存储订单信息,无客户信息 orders:存储订单号顾客id     注意:一般在子查询中,程序先运行在嵌套在最内...
  • mybatis“集合嵌套查询“集合嵌套结果”两种方法实现数据库一对多关系
  • VB 嵌套查询

    2010-06-08 09:31:08
    VB 嵌套查询 VB 嵌套查询 VB 嵌套查询
  • 数据库嵌套查询

    2012-04-19 10:20:14
    数据库嵌套查询
  • 嵌套查询

    千次阅读 2018-04-02 21:39:54
    嵌套查询概述 一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询 例:选修了2号课程的学生名字 SELECT Sname /*外层查询/父查询*/ ...
  • 查询条件中有普通查询和嵌套查询同时存在时,出现了问题: 1.1 所有条件都为NestQueryBuilder时,设置的所有条件都会去Nested的path去查询符合条件的数据,当嵌套内容中没有对应的字段时,查询出...
  • SQL嵌套查询和链接查询

    千次阅读 2010-06-07 10:49:00
    SQL嵌套查询和链接查询
  • MySQL子查询嵌套查询

    万次阅读 多人点赞 2019-05-10 22:15:31
    一个查询语句嵌套在另一个查询语句内部的查询 常用操作符:ANY(SOME), ALL, IN, EXISTS 比较运算符:>, >=, <, <=, != 等 创建两个表,表明分别是tb1,tb2,并向其各插入了数据。 1.带ANY...
  • SQL数据库嵌套查询

    千次阅读 2017-10-31 08:37:51
    保存查询结果查询结果创建一个永久表: select 字段列表 into 新表名 from 原表名 where 查询条件嵌套查询 一个 select……from……where语句称为一个查询块。 将一个查询块嵌套在另一个查询块的where子句或having...
  • 主要介绍了MySQL嵌套查询的使用技巧,结合实例形式较为详细的分析了MySQL嵌套查询参数设置、使用方法与注意事项,需要的朋友可以参考下
  • 用的是window上面的画图板,没法以文字的方式展示出来,见谅 嵌套查询 嵌套结果

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 945,939
精华内容 378,375
关键字:

嵌套查询和嵌套结果