SSM框架学习19-MyBatis多表操作

这里的多表操作的环境是基于订单环境 

1.模型提出

在这里,用户对订单时一对多的关系,而订单对用户是一对一的关系

2. 一对一模型的配置实现

首先这里有两个模型,一个是订单一个是用户,我们配置mapper文件都要配置双份,重温一下:

1. mapper接口

2. 实体类和别名

3. 核心配置文件mapper映射

4. 映射配置文件的namespace

配置好后开始实现一对一,这里的一对一是指查询订单时,每一条订单都有唯一的一个用户,我们order表的结构如下:

可以看到主键是id,外键是user_id对应的是user表里的id,所以这里产生了两个表间的联系,直接上代码:

<mapper namespace="com.dzy.dao.ordermapper">
<!--    语句里是from表-->
    <resultMap id="orderMap" type="order">
<!--手动指定字段与实体属性的映射关系,即这里order查表后的user_id对应User类里的id,
    然后order类的User属性可以通过User_id从另一个表中获取
    colum是字段名,prooerty是order实体的属性,第一个是主键,后面跟着的是其他字段-->
        <id column="oid" property="id"/>
        <result column="ordertime" property="ordertime"/>
        <result column="ototal" property="total"/>

<!--        然后在这个association标签内对查到的user表的字段封装到order的user属性里
            property这里是指当前实体order里面User类的user这个属性名称
            javatype指的是当前实体的user这个属性的类型(User):这里的user是别名-->
        <association property="user" javaType="user">
            <!--这里面的主键就是之前order的外键user_id,在此联系
                里面的column和property都是从user表来的和user内部的属性-->
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="password" property="password"/>
        </association>
    </resultMap>
<select id="findAll" resultMap="orderMap">
    SELECT * FROM tb_user,tb_orders WHERE tb_user.id=tb_orders.user_id
</select>
</mapper>

一样的编写sql语句,这个时候 我们定义的findAll的sql语句就不能用resultType来确定了,因为我们order的属性有:

 可以看到user属性和order数据表里的user_id并不对应,所以这里resultType没有用,只能自己来定义字段与实体属性的映射关系,方法就是上面代码的<resultMap>标签,然后用在sql语句区域用resultMap接收我们定义的resultMap的id,这样就可以完成一对一的连带查询,具体映射关系的配置见代码及注释。

3. 一对多模型的配置实现

和一对一比较相似,只不过这时是user可以对应好几个order,也就是user里会有一个List<order>的对象,一个集合的对象来接受,因此与上面对应到user类对象属性的接收(使用<association>)不同,我们使用<collection>标签:

    <resultMap id="userMap" type="user">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
<!--        配置集合信息,这里是一对多,接下来user里要存的是一个list的对象
            property是集合名称
            ofType是集合里对象的类型-->
        <collection property="orderList" ofType="order">
<!--            封装order的数据-->
            <id column="id" property="id"/>
            <result column="ordertime" property="ordertime"/>
            <result column="total" property="total"/>
        </collection>
    </resultMap>
<!--    查询操作-->
    <select id="findAll" resultMap="userMap">
        select * from tb_user,tb_orders where tb_user.id=tb_orders.user_id
    </select>

我们现在user的属性是这些:

 

可以对照着上面代码看看对应的位置 

4.多对多模型的实现

多对多的数据表通常是表示用户和角色的,即一个用户可以有多个角色同时一个角色可以被多个用户使用。

 多对多查询,user->role和role->user的方法和格式都一样,这里就列举user->role,

 根据示意图,我们需要有三个表,表中内容就按图所示,然后我们需要有一个role类,这个类里有id属性和rolename属性,user类里也需要加上role的集合属性,分别如图:

user的属性:

role的属性:

然后上代码:

<resultMap id="urmap" type="user">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <!--        配置集合信息,这里是一对多,接下来user里要存的是一个list的对象
                    property是集合名称
                    ofType是集合里对象的类型-->
        <collection property="roleList" ofType="role">
            <!--            封装role的数据-->
            <id column="id" property="id"/>
            <result column="rolename" property="rolename"/>
        </collection>
    </resultMap>
    <select id="findAllwithRole" resultMap="urmap">
        select * from tb_user,tb_role,tb_user_role where tb_user.id=tb_user_role.userid and tb_user_role.roleid=tb_role.id
    </select>

 其实这里多对多和之前的一对多方法一样的,只是在sql语句中有了变化可以注意一下,这里需要查找三个表联系起来,这段配置代码没有加入orderList属性,如果需要配置的话在加一对<collection>标签即可,然后将sql语句加上order的表,条件整合一下就可以同时找出user的订单和角色两个集合属性了。

注意:以上的均为配置代码,具体使用是可以参考前面的博文——dao层实现的方式,推荐使用接口代理方式来使用我们配置好的sql。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值