Mybatis中一对一和一对多的处理

简介: 这篇文章讲解了在Mybatis中如何处理一对一和一对多的关系映射,包括使用association和collection标签的具体方法。

上文讲了关于<select>标签的用法和例子,但是很多时候这些并不能完全满足需求,因为很多时候关系型数据库是存在表关联的情况,比如一个用户表中数据对应一条用户详细信息数据,这样就存在表关联的情况,用户表的其中一个字段是用户详细信息的数据类型,亦或者一个用户有多种角色,那么用户表中就存在roles这样一个对象集合的数据类型,这是一个简单的<select>标签实现不了的,因此要引入其他相关标签association和collection。

association标签用来实现一对一的映射,假设有用户表User和用户详细信息表UserDetail,一条用户表只对应一条用户详细信息表,那么映射关系可以写成这样,但是要注意的是如果存在user表中字段名和userDetail表中字段名一致的情况,其中一个要用别名来区分,映射关系的xml如下:

<resultMap id="user" type="User">
    <id property="id" column="id" />
    <result property="username" column="userName" />
    <association property="userDetail" javaType="UserDetail">
        <id property="id" column="did" />
        <result property="user_id" column="userId" />
        <result property="sex" column="sex" />
    </association>
</resultMap>

如果需要做关联查询,可以写成下面的形式,这里又引入一个新的标签<sql>,sql标签经常用于需要重复使用的sql片段中,可以将sql标签包裹,在需要使用的地方引入,下面的代码中就是将关联查询的sql用sql标签包裹,在下面需要使用地方引入去使用,需要加上查询条件的话就可以直接在下面写查询条件,而不需要重新再写一遍这段长的sql了。

<sql id="selectUserVo">
    SELECT 
        a.id as id, a.username as username,
        b.id as did,b.user_id as user_id,b.sex as sex
    FROM sys_user a
    LEFT JOIN sys_user_detail b ON a.id = b.user_id
</sql>

<select id="findAllUser" resultMap="User">
     <include refid="selectUserVo"/>
</select>

下面再说collection标签的用法,collection标签用法和association标签用法类似,只不过这个是可以映射多个对象,在java属性中是多以List<>形式存在,假设有用户表User和用户操作记录表,一条用户表只对应多条操作记录,那么映射关系可以写成这样,但是同样要注意的是如果存在user表中字段名和操作记录表中字段名一致的情况,其中一个要用别名来区分,映射关系的xml如下:

<resultMap id="user" type="User">
    <id property="id" column="user_id" />
    <result property="username" column="username" />
    <collection property="actionLog" ofType="ActionLog">
        <id property="id" column="aid" />
        <result property="action_time" column="actionTime" />
    </collection>
</resultMap>

如果需要做关联查询,可以写成下面的形式,这里同样引入<sql>标签,作用就不做赘述了。

<sql id="selectUserVo">
    SELECT 
        a.id as id, a.username as username,
        b.id as id,b.action_time as action_time
    FROM sys_user a
    LEFT JOIN sys_user_action b ON a.id = b.user_id
</sql>

<select id="findAllUser" resultMap="User">
     <include refid="selectUserVo"/>
</select>

这样查询出来的User对象的List<UserAction>属性就自动装配好了。

当然如果系统性能要求不高,而且数据量很小,也可以线查询出来user表,再用user表中对应的字段再去做一次查询,将关联表的数据查询出来赋值进去,不过性能和效果都会差一点,好处是实现简单快捷。

以上如有问题可以在评论区给我留言!

相关文章
|
SQL Java 数据库连接
MyBatis中一对一、一对多和多对多关联关系的配置详解
MyBatis中一对一、一对多和多对多关联关系的配置详解
529 1
|
SQL Java 数据库连接
33MyBatis - 关联查询(一对多查询)
33MyBatis - 关联查询(一对多查询)
65 0
|
Java 数据库连接 mybatis
【Mybatis用法】Mybatis框架中一对一,一对多association和collection的使用举例方法
【Mybatis用法】Mybatis框架中一对一,一对多association和collection的使用举例方法
90 0
|
3月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
7月前
|
SQL 缓存 Java
mybatis 一对多查询
mybatis 一对多查询
130 0
|
4月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
6月前
|
Java 数据库连接 mybatis
Mybatis基于注解的一对一和一对多查询
Mybatis基于注解的一对一和一对多查询
|
6月前
|
SQL Java 数据库连接
Mybatis中一对多mapper配置
Mybatis中一对多mapper配置
|
7月前
|
Java 数据库连接 mybatis
mybatis的一对多
mybatis的一对多
|
7月前
|
XML SQL Java
mybatis的一对多,多对一,以及多对对的配置和使用
mybatis的一对多,多对一,以及多对对的配置和使用
42 2