官方文档
映射关系:一对一(映射方向:单向映射)
XXMapper.xml的方式配置映射:(推荐方式)
方法二:
<resultMap id="identify2" type="Person">
<!--关键是这儿的column,是DB中的外键(也可以不是),作为参数传给select的方法-->
<association property="idCard" column="card_id" select="com.stein.mapper.IDCardMapper.queryIDCardById">
<result property="card_num" column="card_num"/>
</association>
</resultMap>
<select id="queryPersonById2" parameterType="Integer" resultMap="identify2">
SELECT * FROM `person` where card_id=#{id}
</select>
这儿有个疑问:单表查询的,主表的property可以不用设置,mybatis自动添加;但是在多表联查里面,就需要手动设置property,否则为null。
方法一:
-
映射方式:通过多表联查,结合resultMap完成映射。(原始思路,易于理解,初学还是从方法一开始)
- 原理说明:使用sql的级联查询,获取到所有的返回信息,然后通过mqbatis封装javaBean的子类中去
- 关注重点:
- 使用<association>映射到嵌套的子类进行封装。称为 一个复杂类型的关联。
1. property=“card” 表示 Person对象的 card 属性
2. javaType=“IdenCard” 表示card 属性 的类型
3. column=“id” 是从我们的 下面这个语句查询后返回DB的字段 - 关于<id>的优化。
1.id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
2.property=“id” 表示person 属性 id ,通常是主键
3.column=“id” 表示对应表的字段 - 使用了association ,就需要把上一级的原本自动设置的属性手动设置上,否则会为空。感觉有点麻烦了,如果后期有方法再来改。
- 使用<association>映射到嵌套的子类进行封装。称为 一个复杂类型的关联。
<resultMap id="PersonResultMap" type="Person">//这个id自定义,随便填,给<select>中的resultMap引用;type相当于resultType,最终返回给javaBean的类型
<!--<result property="id" column="id"/>用下面id这句替代了这句-->
<id property="id" column="id"/>
<result property="name" column="name"/> //property这儿自定义的,与javabean里面一致
<association javaType="IdenCard" property="card" > //javaType是说明 property的类型的
<result property="id" column="id"/>
<result property="card_sn" column="card_sn"/>
</association>
</resultMap>
<select id="getPersonById" parameterType="Integer"
resultMap="PersonResultMap">
SELECT * FROM `person`,`idencard` WHERE `person`.id = #{id}
AND `person`.card_id = `idencard`.id
</select>
@注解的方式配置映射
用单表查询的方式(即上面的方法二),使用@注解的形式完成实现。本质上跟XXMapper.xml配置的方式差不多。
@One表示一个返回结果
@Select("SELECT * FROM `person` WHERE `id` = #{id}")
@Results({
@Result(id = true, property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "card", column = "card_id", //同XXMapper.xml一样,column是指要传参的列
one = @One(select = "com.hspedu.mapper.IdenCardMapper.getIdenCardById")) //注意这儿select指向的路径,要指向到方法名,而不仅仅是到类
})
public Person getPersonById(Integer id);