查询方法设计:三个同名方法实现 5 种查询方式

查询方法设计:三个同名方法实现 5 种查询方式

简介

该技巧用于设计类的查询方法,对于「根据某种单一查询条件进行查询的单条或多条查询」的功能提供同名的三种查询方法。

接口设计

// 借助 JDK8 的 default 关键字,在接口层面提供默认的方法实现,可以大大减少子类的代码量。
public interface UserService {
    /**
     * <h2>根据 ID 查询唯一用户</h2>
     * 
     * @param id 用户 ID
     * 
     * @return 若用户存在,则返回该用户信息(User 对象);
     *         若用户不存在,则返回 null。
     */
    // 由于该方法只声明了一个 Long 类型的参数,所以在调用 queryUserById() 方法时,
    // 若只传递一个 Long 参数,则会调用该方法;
    // 若传递了多个 Long 参数,则会执行下面的接收可变参数的方法。
    default User queryUserById (Long id) {
        // 调用子类实现的 queryUserById(Collection) 方法,查询一组用户数据
        List<User> users = this.queryUserById(Arrays.asList(id));
        // 若查询结果为空,则返回 null
        if (users == null || users.isEmpty()) {
            return null;
        }
        // 若查询结果不为空,则返回唯一对象
        return users.get(0);
    }
    
    /**
     * <h2>根据一组 ID 查询多条用户数据</h2>
     * 
     * @param ids 用户 ID 数组,支持可变参数
     * 
     * @return 返回一组用户数据
     */
    // 在方法中声明 (T... ts) 这样的参数,代表该参数是可变参数,
    // 它允许接收一个 T[] 类型的参数,或多个 T 类型的参数进行调用
    // 如:
    //     queryUserById(1, 2, 3);
    //     queryUserById(new Long[]{1, 2, 3});
    default List<User> queryUserById(Long... ids) {
        // 调用子类实现的 queryUserById(Collection) 方法,查询并返回一组用户数据
        return this.queryUserById(Arrays.asList(id));
    }
    
    /**
     * <h2>根据一组 ID 查询多条用户数据</h2>
     * 
     * @param ids 用户 ID 构成的集合
     * 
     * @return 返回一组用户数据
     */
    // 此方法交由子类实现
    // 建议这里的方法参数建议使用 Collection 而不是 List,
    // 因为使用 Collection 作为参数的方法可以接受 Collection、List 和 Set 三种类型的参数,
    // 而使用 List 作为参数的方法只能接受 List 类型的参数,
    // 所以这里采用 Collection 集合类型就是为了能够具备更强的灵活性
    // (当然,这种技巧仅限于传入参数的顺序不影响程序执行的情况下,如果顺序很重要,那还是老老实实用 List 吧)
    List<User> queryUserById (Collection<Long> ids);
}

子类实现

public class UserServiceImpl implements UserService {
    // 因为接口中已经提供了 queryUserById(Long) 和 queryUserById(Long...) 的默认实现,所以子类可以不实现这两个方法;
    // 当然,如果子类想替换接口提供的默认方法,可以向覆盖父类的方法一样去覆盖接口提供的默认方法。
    @Override
    public List<User> queryUserById(Collection<Long> ids) {
        // 执行具体的实现逻辑
    }
}

调用效果

public class Test {
    // 使用 Spring 注入
    @Resource
    private UserService userService;

    public void test() {
        // 调用 queryUserById(Long) 方法,查询唯一用户
        User user = this.userService.queryUserById(1L);
        
        // 调用 queryUserById(Long...) 方法,查询一组用户
        List<User> users0 = this.userService.queryUserById(1L, 2L, 3L);
        List<User> users1 = this.userService.queryUserById(new Long[]{1L, 2L, 3L});
        
        List<Long> ids0 = new ArrayList<>();
        ids0.add(1L);
        ids0.add(2L);
        ids0.add(3L);
        Set<Long> ids1 = new HashSet<>(ids0);
        Collection<Long> ids2 = ids0;

        // 调用 queryUserById(Collection<Long>) 方法,查询一组用户        
        List<User> users2 = this.userService.queryUserById(ids0); // List
        List<User> users3 = this.userService.queryUserById(ids1); // Set
        List<User> users4 = this.userService.queryUserById(ids2); // Collection
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值