关联查询(一对一)

Exisi 2021-03-27 07:30:20
Categories: Tags:
  • 在实际的业务中,我们的用户一般都会有一个角色,也就是一个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_idrole_name字段属性

所以,我们要使用<association>role_idrole_name映射得到的结果关联到User实体类中的role属性上

 

<resultMap id="userMap" type="User">
        <id property="id" column="id"></id>
        <result property="user
Name" 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>

 

来自 <https://zhuanlan.zhihu.com/p/79153088>