0
点赞
收藏
分享

微信扫一扫

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

上文讲了关于<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表中对应的字段再去做一次查询,将关联表的数据查询出来赋值进去,不过性能和效果都会差一点,好处是实现简单快捷。

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

举报

相关推荐

0 条评论