mybatis学习六

2020/04/22
最近在搞毕业论文、复试、spring,mybatis这两天没学。今天补更。。。
接上继续mybatis的级联查询。
2)一对多

所谓一对多,举个栗子来说,就是一个人只有一种id,但是可以有很多衣服、订单。同时这个订单表中都有一个属性项对应于唯一识别user的uid属性。
和一对一查询不一样,一对一中很大部分是通过外键来构成级联关系;一对多则不需要查询的表与表之间有这种外键约束(当然也可以有),直接通过某个唯一属性查询即可。
在mybatis中,一对多的关系通过<resultMap>标签中的<collection>标签来映射。
这种级联查询也分为三种方式:

<resultMap type="com.po.MyUser" id="userAndOrders1">
        <id property="uid" column="uid" />
        <result property="uname" column="uname" />
        <result property="usex" column="usex" />
        <!-- 一对多级联查询,ofType表示集合中的元素类型,将uid传递给selectOrdersByld -->
        <collection property="orders" ofType="com.po.Orders"
            column="uid" select="com.dao.OrdersDao.selectOrdersById" />
    </resultMap>
    <select id="selectUserOrdersById1" parameterType="Integer"
        resultMap="userAndOrders1">
        select * from user where uid = #{id}
    </select>
---
从xml代码中可以看出,这种方式首先通过<select>标签中sql语句的执行,可以获得一个<resultMap>类型的返回对象,同时,在这个<resultMap>对象中以原参数(id)再进行一次查询(对应<collection>标签中的select属性,和一对一查询中的第一种方式类型),最后将两次查询拼凑起来形成一个以MyUser类型为元素的List对象。
需要注意的是,在<resultMap>标签中各种属性的定义必须和持久化的java对象属性一致,不然将报错。
可以看出这是一种内外嵌套查询方式。

<resultMap type="com.po.MyUser" id="userAndOrders2">
        <id property="uid" column="uid" />
        <result property="uname" column="uname" />
        <result property="usex" column="usex" />
        <!-- 对多级联查询,ofType表示集合中的元素类型 -->
        <collection property="orders" ofType="com.po.Orders">
            <id property="id" column="id" />
            <result property="ordersn" column="ordersn" />
        </collection>
    </resultMap>
    <select id="selectUserOrdersById2" parameterType="Integer"
        resultMap="userAndOrders2">
        select u.*,o.id, o.ordersn from user u, orders o where u.uid
        = o.user_id and
        u.uid=#{id}
    </select>
---
这种方式与方式①异曲同工,而差别就在于<collection>标签的配置以及<select>标签中sql语句的不同。
首先,<collection>标签中与方法①中实际上是一样的,都是传递参数形成一个Orders持久化对象,只是在这里没有select属性来再进行内查询而已(因为下面的<select>标签中做了)。
接下来剖析<select>标签。这里的<select>标签中是自然连接查询(①中是内外嵌套查询),查询后直接形成了两个表的笛卡尔积的形式,因此在<resultMap>标签中可以直接配置属性传递。

<!-- 一对多 根据uid查询用户及其关联的订单信息:连接查询(使用POJO存储结果) -->
    <select id="selectUserOrdersById3" parameterType="Integer"
        resultType="com.po.SelectUserOrdersById">
        select u.*, o.id, o.ordersn from user u, orders o where
        u.uid = o.user_id
        and u.uid=#{id}
    </select>
---
方式③直接对两个表进行自然连接再查询,并且使用POJO来存储查询结果。这种方式与上面两种的不同之处在于,这种方式需要重新定义一个持久化对象(如本例的SelectUserOrdersById。class)。
而在上面两种方法中,由于是使用MyUser类型存储查询结果,因此只需要在一对一查询的基础在MyUser类添加一个Orders属性即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以帮助开发人员简化数据库操作。如果你想学习MyBatis,下面是一个学习路线的建议: 1. 数据库基础:在学习MyBatis之前,建议先掌握数据库的基本概念和SQL语言。了解关系型数据库的原理、表设计和常用的SQL语句会对学习MyBatis有很大帮助。 2. MyBatis入门:开始学习MyBatis之前,可以先了解一下MyBatis的基本概念和核心特性。阅读官方文档或者参考一些入门教程可以帮助你快速上手。 3. 配置文件:学习如何配置MyBatis的核心配置文件,包括数据源、映射文件、类型处理器等。了解不同配置项的作用和常用配置方式。 4. 映射文件:深入学习MyBatis的映射文件,了解如何使用SQL语句进行数据库操作,并学习动态SQL的使用技巧。掌握映射文件各种标签的含义和用法。 5. 注解方式:学习使用注解方式来配置和使用MyBatis。了解常用的注解和使用方式,与映射文件相比,注解方式更加简洁和灵活。 6. 缓存机制:了解MyBatis的缓存机制,包括一级缓存和二级缓存的原理和使用方式。了解如何配置和优化缓存,提高系统的性能。 7. 整合框架:学习如何将MyBatis与其他框架进行整合,如Spring和Spring Boot。掌握整合的配置方式和常见问题的解决方法。 8. 实践项目:通过实践项目来巩固所学的知识,可以自己动手搭建一个简单的Web应用或者实现一些常见的数据库操作。在实践不断提升自己的技能。 以上是一个大致的学习路线,你可以根据自己的实际情况和学习进度进行调整。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值