MyBatis 结果映射实践汇总:灵活操作数据,写出高效SQL
2023-11-07 07:28:14
MyBatis 是一款优秀的持久层框架,它可以将 POJO 对象和数据库表进行映射,从而简化数据访问的操作。结果映射是 MyBatis 中一个非常重要的概念,它用于将数据库中的数据映射到 POJO 对象中。MyBatis 提供了多种不同的结果映射方法,可以满足不同的应用场景。本文将结合一些常见的应用场景,并通过简单的示例来介绍 MyBatis 中不同的结果映射方法,既为刚入门的同学提供一个参考,也方便自己以后查阅。如有理解错误,还请大家批评指正!
1. 一对一关联查询
一对一关联查询是指一个表中的一个字段对应另一个表中的一个字段的情况。在 MyBatis 中,可以使用 association 元素来实现一对一关联查询。例如,假设我们有一个 User 表和一个 Address 表,User 表中有一个 address_id 字段对应 Address 表中的 id 字段,则我们可以使用如下 XML 配置来实现一对一关联查询:
<resultMap id="UserResultMap" type="com.example.User">
<id column="id" property="id" />
<result column="name" property="name" />
<association property="address" column="address_id" javaType="com.example.Address">
<id column="id" property="id" />
<result column="city" property="city" />
</association>
</resultMap>
使用上述 XML 配置后,我们可以通过以下代码来查询 User 表中的数据:
User user = sqlSession.selectOne("com.example.UserMapper.selectById", 1);
System.out.println(user.getName() + " lives in " + user.getAddress().getCity());
2. 一对多关联查询
一对多关联查询是指一个表中的一个字段对应另一个表中的多个字段的情况。在 MyBatis 中,可以使用 collection 元素来实现一对多关联查询。例如,假设我们有一个 Order 表和一个 OrderItem 表,Order 表中有一个 id 字段对应 OrderItem 表中的 order_id 字段,则我们可以使用如下 XML 配置来实现一对多关联查询:
<resultMap id="OrderResultMap" type="com.example.Order">
<id column="id" property="id" />
<result column="customer_id" property="customerId" />
<collection property="orderItems" column="order_id" javaType="java.util.List">
<id column="id" property="id" />
<result column="product_id" property="productId" />
<result column="quantity" property="quantity" />
</collection>
</resultMap>
使用上述 XML 配置后,我们可以通过以下代码来查询 Order 表中的数据:
Order order = sqlSession.selectOne("com.example.OrderMapper.selectById", 1);
for (OrderItem orderItem : order.getOrderItems()) {
System.out.println(orderItem.getProductId() + " x " + orderItem.getQuantity());
}
3. 嵌套查询
嵌套查询是指在一个查询中包含另一个查询的情况。在 MyBatis 中,可以使用 nestedSelect 元素来实现嵌套查询。例如,假设我们有一个 User 表和一个 Address 表,User 表中有一个 address_id 字段对应 Address 表中的 id 字段,则我们可以使用如下 XML 配置来实现嵌套查询:
<resultMap id="UserResultMap" type="com.example.User">
<id column="id" property="id" />
<result column="name" property="name" />
<nestedSelect property="address" column="address_id">
<select>
SELECT * FROM address WHERE id = #{address_id}
</select>
</nestedSelect>
</resultMap>
使用上述 XML 配置后,我们可以通过以下代码来查询 User 表中的数据:
User user = sqlSession.selectOne("com.example.UserMapper.selectById", 1);
System.out.println(user.getName() + " lives in " + user.getAddress().getCity());
4. 动态映射
动态映射是指根据不同的条件来选择不同的结果映射方法的情况。在 MyBatis 中,可以使用动态 SQL 来实现动态映射。例如,假设我们有一个 User 表,其中有一个 gender 字段,我们可以使用如下 XML 配置来实现动态映射:
<resultMap id="UserResultMap" type="com.example.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="gender" property="gender" />
<constructor>
<arg column="id" javaType="int" />
<arg column="name" javaType="String" />
<arg column="gender" javaType="String" select="com.example.UserMapper.selectGenderLabel" />
</constructor>
</resultMap>
使用上述 XML 配置后,我们可以通过以下代码来查询 User 表中的数据:
User user = sqlSession.selectOne("com.example.UserMapper.selectById", 1);
System.out.println(user.getName() + " is a " + user.getGenderLabel());
5. 列别名
列别名是指为表中的列起一个别名。在 MyBatis 中,可以使用 column 元素的 alias 属性来指定列别名。例如,假设我们有一个 User 表,其中有一个 name 字段,我们可以使用如下 XML 配置来为 name 字段起一个别名:
<resultMap id="UserResultMap" type="com.example.User">
<id column="id" property="id" />
<result column="name" property="userName" alias="name" />
</resultMap>
使用上述 XML 配置后,我们可以通过以下代码来查询 User 表中的数据:
User user = sqlSession.selectOne("com.example.UserMapper.selectById", 1);
System.out.println(user.getUserName());
6. 自定义映射
自定义映射是指使用自己的代码来将数据库中的数据映射到 POJO 对象中。在 MyBatis 中,可以使用 typeHandler 元素来实现自定义映射。例如,假设我们有一个 User 表,其中有一个 gender 字段,我们可以使用如下 XML 配置来实现自定义映射:
<resultMap id="UserResultMap" type="com.example.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="gender" property="gender" typeHandler="com.example.GenderTypeHandler" />
</resultMap>
使用上述 XML 配置后,我们可以通过以下代码来查询 User 表中的数据:
User user = sqlSession.selectOne("com.example.UserMapper.selectById", 1);
System.out.println(user.getName() + " is a " + user.getGender().getLabel());
结语
MyBatis 的结果映射非常灵活,可以满足不同的应用场景。本文介绍了 MyBatis 中一些常见的结果映射方法,包括一对一关联查询、一对多关联查询、嵌套查询、动态映射、列别名和自定义映射。希望这些内容能够帮助大家更好地使用 MyBatis。