每日面经分享(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

相关推荐
深入云栈1 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
JackJiang1 小时前
IM踩坑:聊天消息ID怎么设计?一个UUID搞不定,我用双ID解决
后端·架构
Jackzhang1 小时前
[运维排障实录] 第一次遇到 502 别急着重启:按「一条线」把问题查清楚
spring boot
开心猴爷1 小时前
iOS 上架 App 流程
后端·ios
code_Bo2 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
用户8356290780512 小时前
使用 Python 控制 Excel 工作表的分页位置
后端·python
用户8356290780513 小时前
Python 如何在 Word 中添加和管理文档变量
后端·python
量化分析码农4 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
曲径海盗4 小时前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
程序员cxuan5 小时前
讲真,智能路由这事儿,还得看基元律动
人工智能·后端·程序员