Mybatis中的标签用于映射一对多或多对多的关系,它可以将查询结果中的多个子对象映射到一个集合属性中。
标签的属性说明如下:
- property:集合属性的名称。
- column:关联查询中子对象的外键列名。
- javaType:集合属性的类型,可以是List、Set、Map等。
- ofType:集合元素的类型,可以是任意Java类型。
- select:关联查询子对象的SQL语句。
下面是一个使用标签的示例:
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="orders" ofType="Order" select="selectOrdersByUserId">
<id property="id" column="id"/>
<result property="name" column="name"/>
</collection>
</resultMap>
<select id="selectUserById" resultMap="userMap">
select * from user where id = #{id}
</select>
<select id="selectOrdersByUserId" resultType="Order">
select * from order where user_id = #{id}
</select>
以上示例中,我们定义了一个User对象和一个Order对象,它们之间是一对多的关系,即一个用户可以拥有多个订单。在User对象的映射中,我们使用了标签来映射用户的订单集合,其中:
- property属性为orders,表示User对象中的订单集合属性名为orders。
- ofType属性为Order,表示订单集合中的元素类型为Order。
- select属性为selectOrdersByUserId,表示查询用户的订单集合的SQL语句为selectOrdersByUserId。
在查询用户信息时,Mybatis会自动执行selectUserById查询语句,并将查询结果映射到User对象中。同时,Mybatis会根据标签中定义的select属性,自动执行selectOrdersByUserId查询语句,将查询结果映射为一个Order对象的集合,并设置到User对象的orders属性中。
示例SQL如下:
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE order (
id INT PRIMARY KEY,
name VARCHAR(20),
user_id INT,
FOREIGN KEY (user_id) REFERENCES user(id)
);
INSERT INTO user VALUES (1, '张三');
INSERT INTO user VALUES (2, '李四');
INSERT INTO order VALUES (1, '订单1', 1);
INSERT INTO order VALUES (2, '订单2', 1);
INSERT INTO order VALUES (3, '订单3', 2);