Repository和Mapper的区别

一、Repository与Mapper的定义

        在使用Spring框架中,我们通常会使用Repository和Mapper来访问持久化数据,它们是DAO(Data Access Object)层的重要组成部分。

        Repository是Spring Data提供的一种访问持久化数据的方式,它对JPA、Hibernate、MongoDB等ORM和ODM框架进行了封装,让我们可以更便捷地进行数据库操作。

@Repository
public interface UserRepository extends JpaRepository {
    User findByUsername(String username);
}

        Mapper则是MyBatis框架提供的一种访问持久化数据的方式,它基于注解或XML配置,让我们可以更细粒度地控制SQL语句的生成和执行,提高可维护性和可扩展性。

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE username = #{username}")
    User findByUsername(@Param("username") String username);
}

二、Repository与Mapper的功能

1. Repository的功能

Repository主要有以下几个功能:

  • 封装了一些常用的CRUD(增删改查)操作,让我们可以更便捷地进行数据库操作;
  • 提供了一些常用的查询方法,如findByXXX、countByXXX、deleteByXXX等,避免我们编写重复的SQL语句;
  • 支持分页查询和排序;
  • 支持自定义查询方法,我们可以通过方法的命名规则定义查询方法,或者使用@Query注解编写JPQL或原生SQL查询语句。

例如,我们可以通过以下方式进行查询:

UserRepository userRepository = ...;
// 查询用户名为"张三"的用户
User user = userRepository.findByUsername("张三");

2. Mapper的功能

Mapper主要有以下几个功能:

  • 提供了更细粒度的SQL控制能力,可以根据业务需求编写复杂的SQL语句;
  • 支持动态SQL语句的生成,可以根据条件自动生成不同的SQL语句;
  • 支持自定义类型处理器,方便我们将数据库中的数据转换成Java对象;
  • 可与Spring集成,使用Spring的事务管理功能。

例如,我们可以通过以下方式进行查询:

UserMapper userMapper = ...;
// 查询用户名为"张三"的用户
User user = userMapper.findByUsername("张三");

三、Repository与Mapper的适用场景

1. Repository的适用场景

        Repository适合于使用ORM(Object-Relational Mapping)框架,如JPA、Hibernate等,进行持久化数据访问的场景。当我们需要进行简单的CRUD操作或基于一些基本查询条件进行查询时,使用Repository可以大大简化代码量,提高开发效率。此外,Repository还支持对查询结果进行分页和排序,方便我们处理大量数据。

// 根据用户id删除用户
userRepository.deleteById(1L);
// 查询所有用户并按照id降序排列
List users = userRepository.findAll(Sort.by(Sort.Direction.DESC, "id"));
// 分页查询用户
Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "id"));
Page usersPage = userRepository.findAll(pageable);

2. Mapper的适用场景

        Mapper适合于在需要编写复杂SQL语句或需要细粒度控制数据库访问的场景。当ORM框架无法满足我们的需求时,使用Mapper可以让我们更灵活地控制SQL语句的生成和执行,从而满足业务需求。

// 根据用户id删除用户
userMapper.delete(1L);
// 查询所有用户并按照id降序排列
List users = userMapper.findAll(Sort.by(Sort.Direction.DESC, "id"));
// 动态生成查询条件
UserQueryParams params = new UserQueryParams();
params.setUsername("张三");
if (StringUtils.isNotBlank(params.getUsername())) {
    sql.WHERE("username = #{username}");
}
if (params.getAge() != null) {
    sql.WHERE("age = #{age}");
}
List result = userMapper.findByParams(params);

四、Repository与Mapper的区别与联系

1. 区别

        Repository和Mapper的本质区别在于它们实现持久化数据访问的方式不同。Repository基于ORM框架封装了一些常用的CRUD操作和查询方法,使用方便;Mapper基于注解或XML配置,提供了更细粒度的SQL控制能力,更加灵活。

        此外,Repository和Mapper的接口定义和实现方式也不同。Repository是一个接口,继承JpaRepository或其他Repository接口,Spring Data会动态生成它的实现类;Mapper则是一个Java类,使用@Mapper注解后,MyBatis会基于注解或XML配置生成和维护它的实现类。

2. 联系

        Repository和Mapper的联系在于它们都实现了Java的DAO模式,用于进行持久化数据访问。它们都可以与Spring集成,使用Spring的事务管理功能。同时,它们的接口定义和方法的命名规则也很相似,如findByXXX等。

        在实际开发中,我们可以根据具体的业务需求和框架特点选择适合的方式来进行持久化数据访问。

你可能感兴趣的:(Springboot多模块集成,Repository,Mapper)