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