,DDD 是一种领域驱动的设计方法,旨在通过建立对领域模型的清晰理解来解决业务问题。和事务脚本不同,DDD 使用面向对象设计来应对复杂的业务场景。,简单来说,DDD 是由领域对象承载业务逻辑,所有的业务操作均在模型对象上完成,同一对象上不同的业务操作构成了对象的生命周期。,我们以订单为例,如下图所示:,,从图上可见,在 DDD 设计中,所有的业务逻辑均由业务对象完成,所以面向对象是 DDD 设计的核心。,假设,有一台非常牛逼的计算机,计算资源无限、内存大小无限、永不掉电、永不宕机,那最简单高效的方式便是将模型对象全部放在内存中。,但,现实不存在这样的机器,我们不得不将内存对象写入磁盘,下次使用时,在将其从磁盘读入到内存。,整体结构如下图所示:,,和上图相比,具有如下特点:,相对全内存版本确实增加了不小的复杂性,为了更好的对这些复杂性进行管理,引入 Repository 模式。,好的 Repository 应该在满足业务需求的前提下,具备以下特性:,说的太官方了,用人话就是:,Spring Data 通过提供简单的、通用的数据访问接口(如Repository)和自动生成实现代码,使得开发人员不必编写重复的数据访问代码。这样,开发人员可以专注于业务逻辑,而无需关注数据存储和访问的细节。,总的来说,Spring Data的主要解决的问题是:简化数据访问层的开发,提高代码复用性,降低开发复杂度。,Spring Data 对多种数据存储提供了支持,本文以 Spring Data Jpa 为例,快速实现应用程序与关系数据库的交互。,首先,需要在pom中 引入 spring-data-jpa-starter,具体如下:,其次,引入 MySQL 驱动,具体如下:,在 application.yml 增加 DB 和 Jpa 相关配置,具体如下:,在启动类上启用 Spring Data Jpa。,一切就绪,接下来就可以为模型创建专属 Repository,具体如下:,至此,Order 的专属 Repository 就开发完成。,不知道你是否存在疑问:,一般情况下,JpaRepository 接口中的方法就能满足大部分需求,典型方法包括:,为了体现 Spring Data Jpa的强大功能,以最常见的订单为例,业务模型如下图所示:,,对应到领域模型如下:,,核心代码如下:,先简单看下生单的核心代码,具体如下:,单元测试,具体如下:,运行单元测试,打印以下 SQL:,是否发现 Spring Data Jpa 的强大之处:核心逻辑全部内聚在 Order 类,在没有写任何数据层访问代码的前提下,一个 save 方法便可以将这组高内聚的对象保存到 DB。,修改地址核心代码如下:,首先,看一个添加地址的场景,生单时没有提供收货地址,生单后修改地址:,运行单测可,控制台输出以下信息:,看一个更新地址的场景,生单时设置收货地址,然后操作修改地址:,运行测试用例,输出如下信息:,从该用例可看出,Jpa 具有:,修改地址是简单的一对一,那对于较复杂的一对多,Jpa 是否也具有 懒加载 和 自动同步能力呢?,支付核心代码如下:,单元测试如下:,运行单元测试,控制台出现信息如下:,从 SQL 中可见,在复杂的 一对多 场景,懒加载 和 自动同步能力 仍旧有效。,DDD 和 Jpa 都是面向对象设计的巅峰之作,两者结合威力巨大。,结合使用 DDD 和 JPA 可以有效地将领域模型与数据库持久化技术相结合。开发人员可以使用领域驱动的方法管理数据,并通过 JPA 将数据存储在数据库中,从而避免冗长的数据持久化代码。,此外,使用 DDD 和 JPA 还有其他优势:,提高代码可读性:领域驱动的设计方法可以帮助开发人员更清晰地了解领域模型,使代码更易于阅读和维护。,减少代码量:使用 JPA 可以减少代码量,因为开发人员不需要编写手动的数据持久化代码。,提高代码的可重用性:通过使用领域模型,开发人员可以创建一组可重用的实体,并在多个地方使用它们。,提高代码的可扩展性:使用 DDD 和 JPA 可以使代码更易于扩展,因为它们遵循领域驱动的设计方法。,总之,使用 DDD 和 JPA 可以帮助开发人员更有效地解决业务问题,提高代码的可读性,可重用性和可扩展性,并减少代码量。
文章版权声明
1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/20343.html
2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈
3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)
4 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别