一对多是 MyBatis 中常用的关联关系之一,可以用于处理一张表与另外一张表之间的关联,比如客户与订单之间的关联。MyBatis 中支持两种配置方式,一种是嵌套查询,一种是嵌套结果。
接下来,详细讲解一下这两种配置方式的具体实现方法。
嵌套查询
嵌套查询的实现方式是先查询主表,再根据主表中的字段去另外的表中查询相关记录。如下是一对多的示例。
数据库表结构
我们使用两张表来演示一对多的功能,表结构如下:
- tbl_user:用户表,包含用户编号和用户名两个字段。
- tbl_order:订单表,包含订单编号、用户编号和订单金额三个字段。
CREATE TABLE `tbl_user` (
`id` int(11) NOT NULL,
`username` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tbl_order` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`price` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MyBatis XML 配置
首先,我们需要定义两个 mapper 文件,一个是 UserMapper.xml,另一个是 OrderMapper.xml。在 OrderMapper.xml 中,我们以嵌套查询的方式查询用户信息和订单信息。具体配置如下所示:
<!-- OrderMapper.xml -->
<mapper namespace="com.example.mapper.OrderMapper">
<resultMap id="orderMap" type="com.example.pojo.Order">
<id property="id" column="id"/>
<result property="price" column="price"/>
<association property="user" column="user_id" select="com.example.mapper.UserMapper.selectUserById"/>
</resultMap>
<select id="selectOrderById" resultMap="orderMap" parameterType="int">
SELECT * FROM tbl_order WHERE id = #{id}
</select>
</mapper>
在以上配置中,我们先定义了一个 resultMap,包含了主表 tbl_order 中的所有字段,并使用 association 元素来映射对应的从表 tbl_user 中的字段。association 元素中的 select 属性指定了查询从表的 SQL 语句,这里我们采用了另一个 mapper 文件 UserMapper.xml 中定义的 selectUserById 语句。在查询时,MyBatis 会先执行 selectOrderById,查询出 tbl_order 中的记录,随后再执行 selectUserById,查询出 tbl_user 中对应的记录。
Java 代码实现
在 Java 代码中,我们需要分别定义两个 mapper 接口,UserMapper 和 OrderMapper,并在 OrderMapper 中声明 selectOrderById 方法,以供其他模块调用。
public interface UserMapper {
User selectUserById(int id);
}
public interface OrderMapper {
Order selectOrderById(int id);
}
嵌套结果
嵌套结果的实现方式是先查询主表,再根据主表中的字段去另外的表中查询相关记录,并将两种记录的结果分别映射到不同的 Java 对象实例中。如下是一对多的示例。
数据库表结构
与前文相同,我们使用两张表来演示一对多的功能,表结构如下:
- tbl_user:用户表,包含用户编号和用户名两个字段。
- tbl_order:订单表,包含订单编号、用户编号和订单金额三个字段。
MyBatis XML 配置
在 OrderMapper.xml 中,我们以嵌套结果的方式查询用户信息和订单信息。具体配置如下所示:
<!-- OrderMapper.xml -->
<mapper namespace="com.example.mapper.OrderMapper">
<resultMap id="orderMap" type="com.example.pojo.Order">
<id property="id" column="id"/>
<result property="price" column="price"/>
</resultMap>
<resultMap id="userMap" type="com.example.pojo.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
</resultMap>
<select id="selectOrderById" resultMap="orderMap" parameterType="int">
SELECT o.id, o.price, u.id as user_id, u.username
FROM tbl_order o
JOIN tbl_user u ON o.user_id = u.id
WHERE o.id = #{id}
</select>
</mapper>
在以上配置中,我们分别定义了 orderMap 和 userMap 两个 resultMap。在 selectOrderById 中,我们使用了嵌套查询的方式将两个 resultMap 映射到两个不同的对象实例中。
Java 代码实现
在 Java 代码中,我们同样需要定义两个 mapper 接口,UserMapper 和 OrderMapper,并在 OrderMapper 中声明 selectOrderById 方法,以供其他模块调用。
public interface UserMapper {
// 略
}
public interface OrderMapper {
Order selectOrderById(int id);
}
以上是一对多的 xml 配置方式的完整攻略,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果) - Python技术站