MyBatis处理关联关系-多表连接

  • OneToOne:一对一关系(Passenger— Passport)

  • OneToMany:一对多关系(Employee — Department)

  • ManyToMany:多对多关系(Student — Subject)

*** 注意:设计数据库时,表与表的主外键关系知道就行了不要写出来,但是pojo里要在加外键的id用以get、set**

MyBatis的总结:
1,,每添加一个mapper.xm文件就要遭config.xml里面注册,同时在mapper里面进行关联。
2,一对一查询时新的结果集使用 <association property=“passport” select=“com.qf.dao.PassportDao.selectPassportById” column=“pid” javaType=“passport”>====结果是一个对象用association
一对多和多对多都是用<collection property=“addresses” select=“com.qf.dao.AddressDao.selectAddressesByUid” column=“id” ofType=“address”>
3,多对多查询只有连接查询没有分布查询。====结果是一个集合用collection

在这里插入图片描述

一对一:
1.分步查询:先查出user在由user的pid查

在这里插入图片描述`
方法一:分布查

/select * from t_users where id=?;===user(pid)
select * from t_passport where id=user.getPid();===Passport
user.setPassport(Passport);
/
select * from t_users where id=#{id};

</select>
<resultMap id="resultNewMap" type="user">
    <id column="id" property="id"></id>
    <result column="name" property="name"></result>
    <result column="password" property="password"></result>
    <result column="sex" property="sex"></result>
    <result column="pid" property="pid"></result>
    <association property="passport" select="com.qf.dao.PassportDao.selectPassportById" column="pid" javaType="passport">
        <id column="pid" property="id"></id>
        <result column="nationality" property="nationality"></result>
    </association>
</resultMap>`
<!--mapper就是映射文件的根目录 namespace:命名空间,是映射的dao接口的全限路劲-->
<mapper namespace="com.qf.dao.PassportDao">

    <select id="selectPassportById" parameterType="int" resultType="passport">
        select * from t_passport where id=#{id}
    </select>

2.连接查询:

在这里插入图片描述`

SELECT
*
FROM
t_users u
LEFT JOIN t_passport p ON u.pid = p.id1
WHERE
u.id = #{id}






    <result column="birthday" property="birthday"></result>

    <result column="registTime" property="registTime"></result>
    <!--        因为是连接查询,一次查询得到的结果集已经有我想要的数据了,所以不需要新的查询了-->
    <association property="passport" javaType="passport">
        <id column="id1" property="id"></id>
        <result column="nationality" property="nationality"></result>

    </association>
</resultMap>`

一对多:

在这里插入图片描述
1.分布查询
在这里插入图片描述`

/select * from t_users where id=?;===user(pid)
select * from t_passport where id=user.getPid();===Passport
user.setPassport(Passport);
/
select * from t_users where id=#{id};

</select>
<resultMap id="resultNewMap" type="user">
    <id column="id" property="id"></id>
    <result column="name" property="name"></result>
    <result column="password" property="password"></result>
    <result column="sex" property="sex"></result>
    <result column="pid" property="pid"></result>
    <association property="passport" select="com.qf.dao.PassportDao.selectPassportById" column="pid" javaType="passport">
        <id column="pid" property="id"></id>
        <result column="nationality" property="nationality"></result>
    </association>
</resultMap>

`

<!--mapper就是映射文件的根目录 namespace:命名空间,是映射的dao接口的全限路劲-->
<mapper namespace="com.qf.dao.AddressDao">

    <select id="selectAddressesByUid" parameterType="int" resultType="address">
        select * from address where uid=#{id}
    </select>

2.连接查询;
在这里插入图片描述`

SELECT
*
FROM
t_users u
LEFT JOIN t_passport p ON u.pid = p.id1
WHERE
u.id = #{id}






    <result column="birthday" property="birthday"></result>

    <result column="registTime" property="registTime"></result>
    <!--        因为是连接查询,一次查询得到的结果集已经有我想要的数据了,所以不需要新的查询了-->
    <association property="passport" javaType="passport">
        <id column="id1" property="id"></id>
        <result column="nationality" property="nationality"></result>

    </association>
</resultMap>

`

多对多

<!--    多对多查询:只有连接查询没有分布查询-->
<select id="selectUserByName" parameterType="String" resultMap="ManyToManyResult">
SELECT u.id,u.`name`,u.`password`,u.sex,u.birthday,u.registTime,u.pid,r.id rid,r.rname from t_users u
    LEFT JOIN user_role ur
on u.id=ur.uid
    LEFT JOIN role r
on ur.rid=r.id
    where u.name=#{name}
</select>
    <resultMap id="ManyToManyResult" type="user">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="password" property="password"></result>
        <result column="sex" property="sex"></result>
        <result column="pid" property="pid"></result>
<collection property="roles" ofType="role">
    <id  column="rid" property="id"></id>
    <result column="rname" property="rname"></result>
</collection>

    </resultMap>

懒加载:只和分布查询有关系
首先:mabatis.config.xml配置文件中增加一个setting;
然后写分布查询语句;
最后写测试方法。

lazyLoadingEnabled:懒加载:当用户用不到第二步sql语句相关的属性值就不会执行第二条语句,当用户用到了第二条sql语句有关的属性时,才会去执行第二条sql。
aggressiveLazyLoading:积极的懒加载;当用户暂时没用到第二条sql语句相关的属性值时,那么此时不会走运行第二条语句,只有在不忙的时候,他才会执行。

<!--    懒加载的配置-->
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
</settings>

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值