Mybatis中通过@ResultMap复用@Results

你提到的复用 @Results 注解,确实有一种复用查询结果映射的方式,叫做 @ResultMap@ResultMap 允许你定义一个可复用的结果映射,这样就可以在多个查询中复用相同的映射规则,而不需要每次重复编写 @Results 注解。

使用 @ResultMap 来复用结果映射

  1. 定义 @ResultMap:首先,我们在 Mapper 接口中定义一个 @Results 映射,并使用 @ResultMap 为这个映射命名。
  2. 复用 @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 &gt;= #{startTime} " +
            "</if>" +
            "<if test='endTime != null'>" +
            "AND create_time &lt;= #{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);
}

解释

  1. @Results(id = "alarmCdnBlockipMap"):我们使用 @Results 注解定义一个映射,并且给它指定了一个 id(如 alarmCdnBlockipMap),这个 id 就是映射的唯一标识符。
  2. @ResultMap("alarmCdnBlockipMap"):在其他查询方法中使用 @ResultMap 注解,并传入之前定义的 id,以复用同样的结果映射规则。
  3. 复用的优势:通过复用,避免了重复编写相同的映射规则,简化了代码的维护。

关键点

  • 复用映射:使用 @ResultMap 让映射规则复用,减少重复代码,特别是在多个查询中使用相同的映射时非常有用。
  • 代码简洁性:使用这种方式后,你只需要维护一个映射规则,降低了出错的风险。

总结

  • @ResultMap 复用:为结果映射命名后可以复用,减少重复代码。
  • 查询映射优化:这对于大型项目中重复使用相同映射的查询方法尤为有效。

a. 你是否需要为其他表或实体定义类似的复用映射?
b. 你是否需要进一步了解如何在MyBatis中处理更复杂的结果映射,例如嵌套查询或关联表映射?

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值