在映射区配置关联关系,然后指定一个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`