MyBatis的一对多和多对一关系的配置需要使用两个标签:<collection>
和<association>
。
一对多关系的配置步骤如下:
<collection>
标签配置一对多关系。在<collection>
标签中,指定property
属性为一的一方的集合属性,ofType
属性为多的一方的实体类,select
属性为查询多的一方数据的SQL语句。<collection>
标签的select
属性的值作为子查询,并将查询结果映射到一的一方的集合属性中。多对一关系的配置步骤如下:
<association>
标签配置多对一关系。在<association>
标签中,指定property
属性为多的一方的实体对象属性,javaType
属性为一的一方的实体类,column
属性为多的一方的外键列名。<association>
标签的select
属性的值作为子查询,并将查询结果映射到多的一方的实体对象属性中。配置示例:
一对多关系配置示例:
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="orders" ofType="Order" select="getOrdersByUserId" column="id"/>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="userMap">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getOrdersByUserId" parameterType="int" resultMap="orderMap">
SELECT * FROM orders WHERE user_id = #{userId}
</select>
多对一关系配置示例:
<resultMap id="orderMap" type="Order">
<id property="id" column="id"/>
<result property="name" column="name"/>
<association property="user" javaType="User" column="user_id" select="getUserById"/>
</resultMap>
<select id="getOrderById" parameterType="int" resultMap="orderMap">
SELECT * FROM orders WHERE id = #{id}
</select>
<select id="getUserById" parameterType="int" resultMap="userMap">
SELECT * FROM user WHERE id = #{id}
</select>
这些示例假设存在两个表:user
和orders
,其中orders
表中的外键列为user_id
。