你提到的复用 @Results
注解,确实有一种复用查询结果映射的方式,叫做 @ResultMap
。@ResultMap
允许你定义一个可复用的结果映射,这样就可以在多个查询中复用相同的映射规则,而不需要每次重复编写 @Results
注解。
使用 @ResultMap
来复用结果映射
- 定义
@ResultMap
:首先,我们在Mapper
接口中定义一个@Results
映射,并使用@ResultMap
为这个映射命名。 - 复用
@ResultMap
:在其他需要相同映射的查询方法中,直接引用这个@ResultMap
。
修改后的代码示例
1. 定义通用的 @ResultMap
我们为 AlarmCdnBlockip
表定义一个 @ResultMap
,可以复用在多个查询中。
package com.example.demo.mapper;
import com.example.demo.entity.AlarmCdnBlockip;
import org.apache.ibatis.annotations.*;
import java.sql.Timestamp;
import java.util.List;
@Mapper
public interface AlarmCdnBlockipMapper {
@Results(id = "alarmCdnBlockipMap", value = {
@Result(property = "id", column = "id"),
@Result(property = "ip", column = "ip"),
@Result(property = "source", column = "source"),
@Result(property = "username", column = "username"),
@Result(property = "createTime", column = "create_time"),
@Result(property = "comment", column = "comment")
})
@Select("SELECT * FROM alarm_cdn_blockip WHERE id = #{id}")
AlarmCdnBlockip findById(Long id);
// 使用相同的映射
@Select("<script>" +
"SELECT * FROM alarm_cdn_blockip " +
"WHERE 1=1 " +
"<if test='ip != null and !ip.isEmpty()'>" +
"AND ip = #{ip} " +
"</if>" +
"<if test='source != null and !source.isEmpty()'>" +
"AND source = #{source} " +
"</if>" +
"<if test='username != null and !username.isEmpty()'>" +
"AND username = #{username} " +
"</if>" +
"<if test='startTime != null'>" +
"AND create_time >= #{startTime} " +
"</if>" +
"<if test='endTime != null'>" +
"AND create_time <= #{endTime} " +
"</if>" +
"ORDER BY create_time DESC" +
"</script>")
@ResultMap("alarmCdnBlockipMap") // 复用已经定义的映射
List<AlarmCdnBlockip> findByConditions(@Param("ip") String ip,
@Param("source") String source,
@Param("username") String username,
@Param("startTime") Timestamp startTime,
@Param("endTime") Timestamp endTime);
}
解释
@Results(id = "alarmCdnBlockipMap")
:我们使用@Results
注解定义一个映射,并且给它指定了一个id
(如alarmCdnBlockipMap
),这个id
就是映射的唯一标识符。@ResultMap("alarmCdnBlockipMap")
:在其他查询方法中使用@ResultMap
注解,并传入之前定义的id
,以复用同样的结果映射规则。- 复用的优势:通过复用,避免了重复编写相同的映射规则,简化了代码的维护。
关键点
- 复用映射:使用
@ResultMap
让映射规则复用,减少重复代码,特别是在多个查询中使用相同的映射时非常有用。 - 代码简洁性:使用这种方式后,你只需要维护一个映射规则,降低了出错的风险。
总结
@ResultMap
复用:为结果映射命名后可以复用,减少重复代码。- 查询映射优化:这对于大型项目中重复使用相同映射的查询方法尤为有效。
a. 你是否需要为其他表或实体定义类似的复用映射?
b. 你是否需要进一步了解如何在MyBatis中处理更复杂的结果映射,例如嵌套查询或关联表映射?