每日面经分享(Spring Boot: part2 DAO层)

1. Spring Boot DAO层的作用

a. 封装数据访问逻辑:DAO层的主要责任是封装与数据访问相关的逻辑。负责处理与数据库的交互,包括数据的增删改查等操作。通过将数据访问逻辑统一封装在DAO层中,可以提高代码的可维护性和可重用性。

b. 解耦业务逻辑和数据访问逻辑:通过将数据访问逻辑放在DAO层中,可以将业务逻辑与数据访问逻辑解耦。业务逻辑层可以通过调用DAO层提供的方法来获取和操作数据,而不需要关心具体的数据访问细节。实现业务逻辑与数据访问逻辑的独立开发和测试(松散耦合,面试常见问题)。

c. 提供数据持久化和查询的接口:DAO层包含一组接口,定义对数据进行持久化和查询的方法。提供对数据的CRUD操作,以及自定义查询方法的定义。通过这些接口,业务逻辑层可以方便地调用DAO层的方法进行数据的持久化和查询。

d. 提供事务管理支持:DAO层还负责管理数据访问操作的事务。通过在DAO层的方法上使用@Transactional注解,可以实现对数据库操作的事务性管理。优点:在多个数据库操作中,如果其中一个操作失败,整个事务可以回滚,确保数据的一致性。

2. Spring Boot DAO层的搭建过程

a. 创建实体类:根据数据库表的结构创建与之对应的实体类。使用注解来映射实体类和数据库表以及属性和字段的关系。

bash 复制代码
@Entity
@Table(name = "my_table")
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "column_name")
    private String columnName;

    // Getters and setters
}

b. 创建Repository接口:创建一个接口来定义对实体类进行持久化和查询的方法。可以使用Spring Data JPA提供的一组默认方法,也可以自定义查询方法(按需)。

bash 复制代码
@Repository
public interface MyRepository extends JpaRepository<MyEntity, Long> {
    // 自定义查询方法
    List<MyEntity> findByColumnName(String columnName);
}

c. 注入Repository:在需要使用数据访问的地方,使用依赖注入的方式注入Repository接口。

bash 复制代码
@Service
public class MyService {
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 使用myRepository执行数据访问操作
}

3. 搭建DAO层的注意事项

a. 定义数据访问接口:除了使用Spring Data JPA提供的默认方法外,可以在Repository接口中定义自己的数据访问方法。

b. 实现自定义查询方法:在Repository接口中定义自定义查询方法后,可以在实现类中提供相应的方法实现。实现类可以使用EntityManager或JdbcTemplate等来执行自定义查询,并将结果映射到实体类中,方便灵活地执行复杂的查询操作。

bash 复制代码
@Repository
public interface MyRepository extends JpaRepository<MyEntity, Long> {
    // 自定义查询方法
    List<MyEntity> findByColumnName(String columnName);
}

c. 关联关系处理:如果数据库中存在多个表,并且这些表之间存在关联关系,可以使用注解来处理关联关系。例如,使用@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等注解来定义实体类之间的关联关系,这有利于在查询数据时方便地处理关联数据。

d. 事务管理:在DAO层进行数据库操作时,需要使用事务管理来确保数据的一致性和完整性。在DAO层的方法上使用@Transactional注解来启用事务管理。在方法执行期间,如果发生异常或错误,事务会回滚,保证数据的原子性操作。

bash 复制代码
@Repository
@Transactional
public interface MyRepository extends JpaRepository<MyEntity, Long> {
    // ...
}

e. 单元测试:为确保DAO层的正确性和可靠性,研发需要养成编写单元测试的习惯。使用Spring Boot的测试框架,如JUnit和SpringBootTest,编写针对DAO层方法的测试用例,并验证其功能和预期结果。

互联网大厂测开经历,目前担任测试开发负责人,每天分享互联网面经,如果你有测试相关的问题,欢迎咨询,海鲜市场【简历优化】、【就业指导】、【模拟/辅导面试】,已辅导20位以上同学拿到心仪offer

相关推荐
沈管家AI数字员工6 小时前
对话式数据分析实操:从自然语言到可视化图表的全流程
数据库·人工智能·ai·oracle·数据分析
Moment6 小时前
为什么市面上的 coding agent 大多数都基于Nodejs?
前端·后端·面试
大模型搬砖人6 小时前
8. 向量化:用 Python 构建你的第一个向量库
后端
小卿噢6 小时前
两个线程改互不相关的变量,性能掉了 7 倍
后端
程序员清风7 小时前
为什么不推荐走Agent开发?
java·后端·面试
Rain的Java大神之路7 小时前
高并发场景下MySQL数据库性能优化实战
java·后端·mysql
明月_清风7 小时前
分治、贪心、回溯、动态规划:四种经典算法思想
后端·算法
Johnston_man7 小时前
golang 安装 protoc、protoc-gen-go、protoc-gen-go-grpc、protoc-gen-grpc-gateway
后端·golang
ttwuai7 小时前
Go 后台接入单点登录后,JWT、菜单权限和接口 403 怎么验?
开发语言·后端·golang
落木萧萧8257 小时前
MyBatis 启动的时候都在干什么:从 MappedStatement 说起
java·数据库·后端