每日面经分享(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. 创建实体类:根据数据库表的结构创建与之对应的实体类。使用注解来映射实体类和数据库表以及属性和字段的关系。

@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提供的一组默认方法,也可以自定义查询方法(按需)。

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

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

@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等来执行自定义查询,并将结果映射到实体类中,方便灵活地执行复杂的查询操作。

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

c. 关联关系处理:如果数据库中存在多个表,并且这些表之间存在关联关系,可以使用注解来处理关联关系。例如,使用@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等注解来定义实体类之间的关联关系,这有利于在查询数据时方便地处理关联数据。
d. 事务管理:在DAO层进行数据库操作时,需要使用事务管理来确保数据的一致性和完整性。在DAO层的方法上使用@Transactional注解来启用事务管理。在方法执行期间,如果发生异常或错误,事务会回滚,保证数据的原子性操作。

@Repository
@Transactional
public interface MyRepository extends JpaRepository<MyEntity, Long> {
    // ...
}

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

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

海鲜市场

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记】java项目—苍穹外卖day05

文章目录 苍穹外卖-day05课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍…

vsphere高可用实验

实验要求&#xff1a; 部署高可用集群&#xff0c;在2个EXSI主机上&#xff0c;将该虚拟机断电。这台虚拟机会在另一台主机上自动起来 实验环境要求&#xff1a; 2台EXSI&#xff0c;一台ISCSI&#xff0c;一台vcenter&#xff0c;在一台EXSI上安装一台虚拟机&#xff0c;要求…

武汉大学开设 “雷军班”:计算机专业、今年招收 15 名本科生。武汉大学已经联合小米成立了机器系

更多精彩内容在公众号。 3月25日&#xff0c;武汉大学官方网站发布了一则新闻&#xff0c;报道了校长张平文对计算机学院的调研活动。在报道中&#xff0c;张平文校长特别强调了关于“雷军班”及机器人系的发展规划。他表示&#xff0c;希望计算机学院能够立足于更高层次&#…

AI预测福彩3D第22弹【2024年3月31日预测--第5套算法开始计算第4次测试】

今天&#xff0c;咱们继续进行本套算法的测试&#xff0c;今天为第四次测试&#xff0c;仍旧是采用冷温热趋势结合AI模型进行预测。好了&#xff0c;废话不多说了。直接上结果~ 仍旧是分为两个方案&#xff0c;1大1小。 经过人工神经网络计算并进行权重赋值打分后&#xff0c;3…

MTMT:构建比特币生态平行世界 打造铭文生态繁荣

近年来&#xff0c;随着铭文市场的火爆以及比特币ETF成功通过&#xff0c;比特币生态正经历着一场复兴&#xff0c;尤其是铭文市场作为新一代Web3的叙事&#xff0c;带来了全新的生产方式&#xff0c;可以预见&#xff0c;铭文就像流动性挖矿对于上一轮DeFi Summer的推动一样会…

Mybatis-特殊SQL的执行

1. 模糊查询 在MyBatis中进行模糊查询时&#xff0c;有以下三种常见的实现方式&#xff1a; 1.1. 错误示范 先来个准备操作&#xff0c;并做一个错误示例 根据姓名&#xff0c;模糊查询用户&#xff0c;(x小x) 更新数据表 SQLMapper.java package com.sakurapaid.mybatis3…

python 进程、线程、协程基本使用

1、进程、线程以及协程【1】进程概念【2】线程的概念线程的生命周期进程与线程的区别 【3】协程(Coroutines) 2、多线程实现【1】threading模块【2】互斥锁【3】线程池【4】线程应用 3、多进程实现4、协程实现【1】yield与协程【2】asyncio模块【3】3.8版本【4】aiohttp 1. 并发…

《C++工程方向面试记录》

此系列&#xff0c;是本人免费提供的&#xff0c;大厂面试模拟&#xff0c;经本人同意后发出。如要申请&#xff0c;请查看《大厂面试模拟&#xff08;免费&#xff09;》 面试者画像&#xff1a; 本硕中部985&#xff0c;工作2-3年&#xff0c;本硕均非计算机专业。毕业后一直…

南京观海微电子---Vitis HLS设计流程介绍——Vitis HLS教程

1. 传统的FPGA设计流程 传统的RTL设计流程如下图所示&#xff1a; 传统的FPGA RTL设计流程主要是采用VHDL、VerilogHDL或System Verilog进行工程的开发&#xff0c;同时也是通过硬件描述语言来编写测试案例&#xff08;Test Bench&#xff09;对开发的工程进行仿真验证。 随后…

SpringBoot接收参数的方式

Get 请求 1.1 以方法的形参接收参数 1.这种方式一般适用参数比较少的情况 RestController RequestMapping("/user") Slf4j public class UserController {GetMapping("/detail")public Result<User> getUserDetail(String name,String phone) {log.…

二维码门楼牌管理应用平台建设:实现民主参与的新途径

文章目录 前言一、二维码门楼牌管理应用平台的兴起二、投票表决功能的实现三、居民参与度的提升四、面临的挑战与前景展望 前言 在数字化时代&#xff0c;二维码技术的应用已经渗透到我们生活的方方面面。近期&#xff0c;二维码门楼牌管理应用平台的建设成为了社区治理的一大…

leecode 331 |验证二叉树的前序序列化 | gdb 调试找bug

计算的本质是数据的计算 数据的计算需要采用格式化的存储&#xff0c; 规则的数据结果&#xff0c;可以快速的按照指定要求存储数据 这里就不得不说二叉树了&#xff0c;二叉树应用场景真的很多 本题讲的是&#xff0c;验证二叉树的前序序列化 换言之&#xff0c;不采用建立树的…

Kubernetes(K8S)学习(二):K8S常用组件

K8S常用组件 一、 Controllers1、ReplicationController(RC)2、ReplicaSet(RS)3、Deployment 二、Labels and Selectors三、Namespace&#xff08;命名空间&#xff09;1、简介2、测试2.1、创建namespace2.2、创建pod 四、Network1、集群内&#xff1a;同一个Pod中的容器通信2、…

数据挖掘|贝叶斯分类器及其Python实现

分类分析|贝叶斯分类器及其Python实现 0. 分类分析概述1. Logistics回归模型2. 贝叶斯分类器2.1 贝叶斯定理2.2 朴素贝叶斯分类器2.2.1 高斯朴素贝叶斯分类器2.2.2 多项式朴素贝叶斯分类器 2.3 朴素贝叶斯分类的主要优点2.4 朴素贝叶斯分类的主要缺点 3. 贝叶斯分类器在生产中的…

力扣刷题Days29-第二题-70.爬楼梯(js)

只有学习&#xff0c;没有自己的思路解题哈哈哈 1&#xff0c;题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 2&#xff0c;代码 这种解法的本质是斐波那契数列 /*** param {number} n* re…

关于积分敛散性的这道考研数二真题,好多辅导资料都没有讲清楚!

考研数学二 2024 年真题的第 7 题是关于积分敛散性判别的&#xff0c;但是&#xff0c;细心的同学会发现&#xff0c;对于这道题目&#xff0c;某些考研机构给出的解析资料其实并没有讲清楚具体解题方法&#xff0c;甚至还存在错误&#xff0c;有关这道题目的详细解析&#xff…

分布式数据库技术的演进和发展方向

前言 这些年大家都在谈分布式数据库&#xff0c;各大企业也纷纷开始做数据库的分布式改造。那么&#xff0c;所谓的分布式数据库到底是什么&#xff1f;采用什么架构&#xff1f;优势在哪&#xff1f;为什么越来越多企业选择它&#xff1f;分布式数据库技术会向什么方向发展&a…

区块链+AI,AG与Speedy联合Sui为收藏品打造数字身份

Speedy Comics&#xff08;PopCon Me的制片方&#xff09;和AGS&#xff08;一家由AI驱动的收藏品认证服务提供商&#xff09;将利用Sui来安全地托管证书&#xff0c;以证明验证过的流行文化收藏品的所有权和起源。从稀有的宝可梦卡到星球大战道具的收藏品&#xff0c;购买者可…

【分布式事务】Seata 简介

文章目录 1.分布式事务解决方案之两阶段提交协议2.Seata 简介&#xff08;两阶段提交协议的演变&#xff09;3.Seata 术语 1.分布式事务解决方案之两阶段提交协议 2PC&#xff0c;即两阶段提交协议&#xff08;Two-Phase Commit&#xff09;&#xff0c;是分布式系统中保证事务…

拦截器未生效的问题

记录一下自己出现的一个问题 配置好拦截器后 protected void addInterceptors(InterceptorRegistry registry) {log.info("开始注册自定义拦截器...");registry.addInterceptor(jwtTokenUserInterceptor).addPathPatterns("/**").excludePathPatterns(&q…