- 在实际的业务中,我们的用户一般都会有一个角色,也就是一个User对应一个Role。那么在User类里面一般也是以一个实体类来表示
下面是一个User的实体类
public class Users {
private String userName;
private String password;
private String address;
private String email;
private Role role;
}
- 我们在查询用户的时候,如果也希望看到他的其他信息,我们会这样来写查询语句
<select id="getUserById" resultType="User">
SELECT
u.userName,
u.password,
u.address,
u.email,
r.id as 'role_id',
r.name as 'role_name'
FROM
user as u, user_roles as ur
WHERE
u.id = ur.user_id
AND
u.id=#{id}
</select>
使用<association>关联表数据
- 因为User类中只有一个Role对象,并没有role_id和role_name字段属性
所以,我们要使用<association>把role_id和role_name映射得到的结果关联到User实体类中的role属性上
<resultMap id="userMap"
type="User">
<id property="id"
column="id"></id>
<result property="userName" column="userName"></result>
<result
property="password"
column="password"></result>
<result property="address"
column="address"></result>
<result
property="email"
column="email"></result>
<association property="role" javaType="Role">
<id
property="id" column="role_id"></id>
<result
property="name" column="role_name"></result>
</association>
</resultMap>
最后我们就可以将角色信息一块显示出来:
{
"id": "1001",
"username": "后羿",
"password": "123456",
"address": "北京市海淀区",
"email": "3553154544@qq.com",
"role": {
"id": "3",
"name": "射手"
}
}
<association>结果映射方式
下面这个是一个非常简单的示例 来说明它如何工作。代替了执行一个分离的语句,我们联合博客表和作者表在一起
- 外部的结果映射
如果你需要重用resultMap的话,你需要将结果映射合到另一个描述的resultMap结果映射中
<resultMap id="blogResult" type="Blog">
<id property="id" column="id" />
<result property="title" column="title"/>
<association property="author" column="author_id" javaType="Author" resultMap="AResult"/>
</resultMap>
<resultMap id="AResult" type="Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
<result property="password" column="author_password"/>
</resultMap>
<select id="selectBlog" resultMap="blogResult">
select
B.id, B.title,
A.author_id, A.author_username, A.author_password
from Blog B
left outer join Author A
on B.author_id = A.id
where B.id = #{id}
</select>
在上面的示例中你可以看到博客的作者关联代表着“authorResult”结果映射来加载作者实例
现在,上面的示例用了外部的结果映射元素来映射关联。这使得 Author 结果映射可以重用
- 内部嵌套结果映射
如果你不需要重用resultMap的话,或者你仅仅引用你所有的结果映射合到一个单独描述的结果映射中
<resultMap id="blogResult" type="Blog">
<id property="id" column="blog_id" />
<result property="title" column="blog_title"/>
<association property="author" javaType="Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
<result property="password" column="author_password"/>
</association>
</resultMap>
<select id="selectBlog" resultMap="blogResult">
select
B.id, B.title,
A.author_id, A.author_username, A.author_password
from Blog B
left outer join Author A
on B.author_id = A.id
where B.id = #{id}
</select>
- 查询嵌套映射
该方法相比连接查询而言效率更高,同时由于可以自定义select查询,比起连接查询也要更灵活一些
<resultMap id="SelectBlogResult" type="Blog">
<result column="id" property="id"></result>
<result column="name" property="name"></result>
<association property="author" javaType="Author" select="getAuthor" column="tid"/>
</resultMap>
<select id="getAuthor" parameterType="int" resultType="Blog">
select *from Author where author_id=#{author_id}
</select>
<select id="getBlog" parameterType="int" resultType="SelectBlogResult">
select *from Blog
</select>