Mybatis > dao层xml文件映射接口,一对一,一对多关系映射,开启懒加载及不开启懒加载

一个账户对应一个用户 设置结果映射 (未开启懒加载)

Mybatis.xml配置 : https://blog.csdn.net/weixin_43309893/article/details/119330742

需要用到的实体类

在这里插入图片描述

上方为需要映射的类(需求为查询账户及其账户所对应的用户)

** 例子类似于银行账户 与身份证之间的关系(一个银行账户,只能对应一张身份证)**
** 数据库中为一对一的表关系 **

	<!-- id对应下方select标签中的resultMap中的值 type则表示需要映射的是实体类中的哪个属性 -->
	<!-- account为已经配置好的别名 -->
	<resultMap id="accountUser_map" type="account">
		<!-- prooerty:此属性为实体类中的属性 column:此属性对应数据查询出来的字段值 -->
		<!-- 注意:如果select查询语句为某个字段设置了别名,请写为别名 -->
        <id property="id" column="aid"/><!-- 本字段在表中的属性为id,设置别名之后为aid -->
        <result property="uid" column="uid"/>
        <result property="money" column="money"/>
        <!-- 映射user 当存在一对一关系时 请首先判断主从关系,主要是查询谁 -->
        <!-- 本映射主要映射为account表,因此account表为主表 user表为从表 -->
        <!-- 从表映射也为user 因为一个账户只能对应一个用户,因此不需要用到Collection标签 -->
        <!-- 当映射的属性为一对一的关系时间 / 当映射的关系为一对一时 : 关键字为javaType -->
        <!-- 当映射的属性为一对多的关系时间 / 当映射的关系为一对多时 : 
        		关键字为ofType 同时映射从表的标签也设置为Collections -->
        <association property="user" javaType="user">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="birthday" column="birthday"/>
            <result property="gender" column="gender"/>
            <result property="address" column="address"/>
        </association>
    </resultMap>

	<!-- findAccountAll_plus : 为接口中的方法名称-->
	<!-- accountUser_map : 和上方id为accountUser_map的结果映射对应 -->
    <select id="findAccountAll_plus" resultMap="accountUser_map">
        select
            a.id as aid,
            a.uid,
            a.money,
            u.id,
            u.username,
            u.birthday,
            u.gender,
            u.address
        from
            account as a,user as u
        where
            a.uid = u.id
 	</select>

以上为一对一设置已完成==========================================================================

一个用户对应多个账户 设置结果映射 (未开启懒加载)

在这里插入图片描述

	<!-- 设置结果映射 设置一对多的结果映射 一个用户存在多个账户 -->
    <resultMap id="accountUser_map" type="user">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="birthday" column="birthday"/>
        <result property="gender" column="gender"/>
        <result property="address" column="address"/>
        <!-- 映射user中的集合 这里为全类名的写法 -->
        <!-- 当配置别名完成之后,另一种写法为 :  ofType="Account"-->
        <collection property="accounts" ofType="com.study.domain.Account">
            <id property="id" column="aid"/>
            <result property="uid" column="uid"/>
            <result property="money" column="money"/>
        </collection>

    </resultMap>

	<!-- sql语言根据自己的mysql表中的数据进行定制 -->
    <select id="findUserAccount" resultMap="accountUser_map">
        select
            u.* , a.id as aid , a.uid , a.money
        from
            user u left outer join account a
        on a.uid = u.id
    </select>

以上为一对多设置已完成==========================================================================

一个账户对应一个用户 (当开启懒加载和按需加载之后)

在这里插入图片描述

resultMap需要设置相应的select值

	<resultMap id="account_map" type="account">
        <id property="id" column="id"/>
        <result property="uid" column="uid"/>
        <result property="money" column="money"/>
        <!-- 一对一关系映射 uid为需要传递的值 javaType:为需要映射的类 select:需要延迟加载什么,需要用到的方法是什么? -->
        <association property="user" column="uid" javaType="User" select="com.xxxx.dao.IUserDao.findByIdUser">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="birthday" column="birthday"/>
            <result property="gender" column="gender"/>
            <result property="address" column="address"/>
        </association>
    </resultMap>

    <select id="findAll_01" resultMap="account_map">
        select * from account
    </select>

select语句所用到的方法 >>findAll_01() 《select标签那块》

在这里插入图片描述

懒加载需要用的方法,需要传递进去一个参数,这个参数与 column=“uid” 对应

只有传进去相应的值,才能查询到对应的用户,然后将对应的数据封装为User对象

.

findByIdUser (resultMap映射对应方法select属性那块)

select=“com.xxxx.dao.IUserDao.findByIdUser”
在这里插入图片描述

在这里插入图片描述
分割线==================================================================================================

一个用户对应多个账户 (当开启懒加载和按需加载之后)

<!-- 配置一对多 一个用户对应多个账户 -->
    <resultMap id="userAccount_map" type="user">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="birthday" column="birthday"/>
        <result property="gender" column="gender"/>
        <result property="address" column="address"/>
        <!-- 映射AccountDao中所返回的数据 因为一个用户对应多个账户,因此封装为账户集合 -->
        <collection property="accounts" column="id" ofType="account" select="com.xxxx.dao.IAccountDao.findAllByUID">
            <id property="id" column="id"/>
            <result property="uid" column="uid"/>
            <result property="money" column="money"/>
        </collection>
    </resultMap>

    <select id="findAll_UserAccount" resultMap="userAccount_map">
        select * from user
    </select>

findAllByUID方法(用户id对应)在这里插入图片描述

在这里插入图片描述

扫描二维码关注公众号,回复: 13163699 查看本文章

END================

猜你喜欢

转载自blog.csdn.net/weixin_43309893/article/details/119429497