mybaits的一对多多对多表关联映射

9 篇文章 0 订阅
4 篇文章 0 订阅

在映射区配置关联关系,然后指定一个id,下面sql指定结果封装方式的时候使用resultMap 并指定id,到这个设定好的映射关系就可以了

  <resultMap id="userMap" type="com.akveo.bundlejava.user.User">
        <id property="id" column="id" jdbcType="BIGINT"/>  //主对象的id
        <result property="firstName" column="first_name" jdbcType="VARCHAR"/>
        <result property="lastName" column="last_name" jdbcType="VARCHAR"/>
        <result property="login" column="login" jdbcType="VARCHAR"/>
        <result property="email" column="email" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <result property="passwordHash" column="password_hash" jdbcType="VARCHAR"/>
        <result property="isDeleted" column="is_deleted" jdbcType="BOOLEAN"/>
        <result property="addressStreet" column="address_street" jdbcType="VARCHAR"/>
        <result property="addressCity" column="address_city" jdbcType="VARCHAR"/>
        <result property="addressZipCode" column="address_zip_code" jdbcType="VARCHAR"/>
        <result property="addressLat" column="address_lat" jdbcType="DOUBLE"/>
        <result property="addressLng" column="address_lng" jdbcType="DOUBLE"/>
        <result property="createdAt" column="create_at" jdbcType="TIMESTAMP"/>
        <result property="updatedAt" column="update_at" jdbcType="TIMESTAMP"/>
        // 这里是实体中封装的另一个实体
        <association property="image" javaType="com.akveo.bundlejava.image.Image"> 
            <id column="id" property="id"/>  // 另一个实体的id
            <result column="user_id" property="userId"/>
            <result column="image" property="image"/>
        </association>
        <association property="settings" javaType="com.akveo.bundlejava.settings.Settings">
            <id column="id" property="id"/>
            <result column="theme_name" property="themeName"/>
        </association>
        // 当实体种封装了另一个实体的集合时使用这个,千万注意这里是ofYType
        <collection property="roles" ofType="com.akveo.bundlejava.role.Role">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="id_default" property="isDefault"/>
        </collection>
    </resultMap>

SQL种使用这个映射关系

 <select id="queryUserDetailByEmail" resultMap="userMap" parameterType="java.lang.String">
        SELECT *
        FROM ad_sys_user AS asu
                 LEFT JOIN ad_sys_user_role asur ON asu.id = asur.user_id
                 LEFT JOIN ad_sys_role AS asr ON asr.id = asur.role_id
                 LEFT JOIN ad_sys_image AS asi ON asu.id = asi.user_id
                 LEFT JOIN ad_sys_setting AS ass ON ass.user_id = asu.id
        WHERE asu.email = #{email}
    </select>

遇到一个坑,。。。我用一个实体封装了三个实体和一个实体集合,但是实体本身没有主键,所以造成了每次查出来都是4个报错。。。需要一个但是查出来4个,,,,这里需要拆掉一个实体把其他的套进来

一般出现这种找到多个。封装失败的,一般都是主体没有正确的主键id导致的。仔细确认


`如果不想配置扫包范围,千万要注意一定要把mapper接口和映射文件的名称进行对应。否则你i配置了名称空间和id都不行,会提示找不到方法not find`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值