[图解]企业应用架构模式2024新译本讲解20-数据映射器2

1

00:00:01,860 --> 00:00:06,180

那么这个数据映射器因为它有这样的特点

2

00:00:07,310 --> 00:00:12,630

你想想,它负责同步这两边

3

00:00:13,010 --> 00:00:14,930

对象、数据库是独立的

4

00:00:15,990 --> 00:00:18,690

然后

5

00:00:18,700 --> 00:00:20,610

数据库里面的数据拿出来

6

00:00:20,620 --> 00:00:22,360

变成内存里面的

7

00:00:22,370 --> 00:00:25,360

一个对象的映像

8

00:00:26,410 --> 00:00:28,650

然后内存里对象被修改了

9

00:00:28,940 --> 00:00:30,910

或者新增一条或者删除一个

10

00:00:31,540 --> 00:00:35,300

那么这种变化要同步到数据库里面去

11

00:00:36,860 --> 00:00:38,850

现在领域层你也不管

12

00:00:38,860 --> 00:00:40,780

数据库这边也不管

13

00:00:40,790 --> 00:00:42,530

所有的压力

14

00:00:42,540 --> 00:00:43,690

都是由这个框架

15

00:00:44,570 --> 00:00:47,450

由映射器本身来管的

16

00:00:49,640 --> 00:00:53,950

显然映射器肯定要比较复杂的

17

00:00:54,160 --> 00:00:56,930

因为所有的压力都在它那边

18

00:01:01,260 --> 00:01:02,330

既然复杂

19

00:01:02,340 --> 00:01:07,010

而且我们前面讲,它是可以独立的

20

00:01:07,260 --> 00:01:08,290

相对比较独立的

21

00:01:08,300 --> 00:01:09,530

可以随便更换的

22

00:01:12,520 --> 00:01:15,720

还有领域层根本就不知道它的存在

23

00:01:15,730 --> 00:01:16,000

24

00:01:16,010 --> 00:01:17,320

不需要知道它的存在

25

00:01:19,020 --> 00:01:21,050

显然用现成的这种

26

00:01:21,350 --> 00:01:24,390

已有的比较成熟的产品

27

00:01:24,520 --> 00:01:25,790

是更合适的

28

00:01:26,860 --> 00:01:28,010

不用自己来做

29

00:01:30,530 --> 00:01:31,560

比较有名的

30

00:01:31,570 --> 00:01:33,360

基于这种映射器的

31

00:01:33,690 --> 00:01:36,410

数据映射器的模式的产品

32

00:01:36,420 --> 00:01:38,130

比如说Hibernate

33

00:01:38,550 --> 00:01:41,150

还有MyBatis

34

00:01:42,900 --> 00:01:44,210

还有Entity Framework

35

00:01:44,340 --> 00:01:47,480

就是那个.net下面的

36

00:01:49,240 --> 00:01:50,960

当然还有更多

37

00:01:51,410 --> 00:01:55,550

但是我对这方面并不是很了解

38

00:01:55,880 --> 00:02:00,840

到底哪个在别的平台上更流行

39

00:02:01,010 --> 00:02:03,250

我用的最多的就是Entity Framework

40

00:02:03,260 --> 00:02:05,170

之前也用过NHibernate

41

00:02:07,450 --> 00:02:09,560

就是Hibernate的.net版本

42

00:02:12,690 --> 00:02:15,330

当然这个MyBatis好像也是有.net的

43

00:02:15,340 --> 00:02:17,570

但是没有用过

44

00:02:27,070 --> 00:02:27,900

45

00:02:29,670 --> 00:02:32,950

那么映射器这个模式

46

00:02:33,160 --> 00:02:34,430

数据映射器这个模式

47

00:02:34,440 --> 00:02:36,990

它是比较复杂的一个模式

48

00:02:40,060 --> 00:02:43,060

一会我们在演示案例代码的时候

49

00:02:44,340 --> 00:02:45,500

我们会发现它里面

50

00:02:45,510 --> 00:02:48,920

涉及到了很多相关的模式

51

00:02:50,300 --> 00:02:53,190

因为它要实现这样一个映射器

52

00:02:53,200 --> 00:02:54,950

也就是两边同步

53

00:02:54,960 --> 00:02:58,430

它就要考虑很多问题

54

00:02:59,200 --> 00:03:00,510

考虑的这些问题

55

00:03:01,300 --> 00:03:04,000

在书里面它就归纳成了一些模式

56

00:03:06,730 --> 00:03:10,090

包括但不限于,层超类型

57

00:03:10,450 --> 00:03:12,500

标识映射,分离接口、工作单元

58

00:03:12,510 --> 00:03:15,240

元数据映射、延迟加载等等

59

00:03:16,220 --> 00:03:20,370

一会我们在演示和解析案例代码的时候

60

00:03:21,060 --> 00:03:24,960

我们碰到相应的模式在应用的时候

61

00:03:25,460 --> 00:03:30,020

我们就会转到,顺便讲解一下这个模式

62

00:03:31,150 --> 00:03:32,630

当然,我也不会都讲解

63

00:03:32,640 --> 00:03:35,310

因为它涉及到很多的模式

64

00:03:35,840 --> 00:03:38,280

我们说代码里面碰到的,值得一讲的

65

00:03:38,450 --> 00:03:39,960

就会专门来讲

66

00:03:41,360 --> 00:03:43,990

也是书里面的,另外章节的模式了

67

00:03:47,570 --> 00:03:49,850

那么有一些可能代码没涉及

68

00:03:49,860 --> 00:03:53,120

或者觉得限于篇幅的考虑

69

00:03:53,130 --> 00:03:55,280

没有必要讲的,我们就跳过去

70

00:04:01,650 --> 00:04:03,430

接下来,我们来看案例

71

00:04:04,940 --> 00:04:07,980

案例还是跟前面的活动记录

72

00:04:08,290 --> 00:04:12,050

还有入口,行数据入口一样的

73

00:04:12,060 --> 00:04:15,790

都是一个人员的表而已

74

00:04:21,300 --> 00:04:25,030

这个案例项目也是用C#写的

75

00:04:25,040 --> 00:04:27,910

来源跟之前的来源是一样的

76

00:04:29,500 --> 00:04:32,380

就是书上的代码片段

77

00:04:33,030 --> 00:04:35,440

复刻出来的一个案例

78

00:04:38,630 --> 00:04:40,920

和之前的活动记录

79

00:04:40,930 --> 00:04:45,750

还有入口不一样的是,这里分了几个包

80

00:04:46,910 --> 00:04:49,070

分了几个包,有领域包

81

00:04:49,080 --> 00:04:50,150

映射器包

82

00:04:50,160 --> 00:04:51,230

数据库包

83

00:04:53,270 --> 00:04:55,100

不像以前一样都放一个包里面

84

00:04:55,110 --> 00:04:59,150

因为它要涉及到分离接口

85

00:05:00,470 --> 00:05:01,680

映射器本身

86

00:05:01,690 --> 00:05:05,590

还要有一个单独独立的包等等

87

00:05:06,190 --> 00:05:10,220

所以这里面就会分几个包

88

00:05:10,470 --> 00:05:17,060

我们这个类已经比较多了

89

00:05:17,270 --> 00:05:18,780

把它分到几个包里面去

90

00:05:22,370 --> 00:05:27,390

总的类有这么一些

91

00:05:27,770 --> 00:05:30,080

我们来看,你看,这个图

92

00:05:30,090 --> 00:05:33,150

应该还可以看得清楚

93

00:05:35,990 --> 00:05:37,680

这是映射器,具体映射器

94

00:05:37,770 --> 00:05:39,280

这有个抽象的映射器

95

00:05:42,750 --> 00:05:48,510

然后这里还实现了一个接口,查找器的接口

96

00:05:51,670 --> 00:05:55,600

也就是说

97

00:05:55,610 --> 00:05:58,920

它单独把查找的这些方法

98

00:05:58,930 --> 00:06:01,940

把它分离到这样一个

99

00:06:01,950 --> 00:06:05,290

查找器的里面去

100

00:06:05,460 --> 00:06:06,890

作为一个接口在这里

101

00:06:10,740 --> 00:06:13,970

这是我们一会会讲到的分离接口

102

00:06:21,200 --> 00:06:25,270

你看,这里,这是Person领域对象

103

00:06:25,280 --> 00:06:27,230

这是PersonMapper

104

00:06:27,860 --> 00:06:32,170

这是映射器,就是Person的实体类

105

00:06:33,180 --> 00:06:37,150

你看,它们都有一个共同的超类

106

00:06:37,810 --> 00:06:39,520

因为我们这里只有一个类

107

00:06:39,650 --> 00:06:41,200

但是如果说我们这里有很多

108

00:06:41,210 --> 00:06:42,080

有Person

109

00:06:42,740 --> 00:06:43,290

有Customer

110

00:06:44,300 --> 00:06:46,250

Order什么之类的

111

00:06:46,740 --> 00:06:48,950

这里同样也有一批

112

00:06:49,870 --> 00:06:52,380

那么这些共同的领域类也好

113

00:06:52,390 --> 00:06:54,780

它会有一个共同的超类

114

00:06:57,430 --> 00:06:58,340

超类的目的

115

00:06:59,880 --> 00:07:01,840

主要是维护一些共同的东西了

116

00:07:02,430 --> 00:07:04,860

这个就是我们一会要提到的

117

00:07:06,820 --> 00:07:08,380

Fowler把它归纳

118

00:07:08,390 --> 00:07:11,910

叫做层超类型这样一个模式

119

00:07:18,470 --> 00:07:19,540

这是它的类

120

00:07:21,070 --> 00:07:24,670

你看,Person这个类已经很简单

121

00:07:24,680 --> 00:07:24,950

122

00:07:24,960 --> 00:07:28,740

里面全部都是只有领域的操作

123

00:07:29,110 --> 00:07:31,620

因为数据的操作已经到这里来了

124

00:07:31,830 --> 00:07:32,980

到这里面来了

125

00:07:34,200 --> 00:07:35,660

查找更新什么的

126

00:07:37,940 --> 00:07:38,860

到这里来了

127

00:07:39,480 --> 00:07:44,690

而且有一些是在抽象类里面

128

00:07:48,410 --> 00:07:49,990

先在抽象类里面

129

00:07:50,000 --> 00:07:51,230

定义抽象的方法

130

00:07:51,240 --> 00:07:55,160

然后下面来实现,下面来覆盖实现

相关推荐
Hello Dam11 分钟前
面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制
spring cloud·微服务·云原生·架构·gateway·登录验证·单点登录
AI人H哥会Java8 小时前
【Spring】Spring的模块架构与生态圈—Spring MVC与Spring WebFlux
java·开发语言·后端·spring·架构
小屁不止是运维8 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
不会写代码的女程序猿8 小时前
关于ETL的两种架构(ETL架构和ELT架构)
数据仓库·架构·etl
Leoysq14 小时前
深度学习领域的主要神经网络架构综述
深度学习·神经网络·架构
ahhhhaaaa-21 小时前
【AI图像生成网站&Golang】项目架构
开发语言·架构·golang
你有抖音吗1 天前
请说下你对 MYSQL 架构的了解?
mysql·架构
橘子在努力1 天前
【橘子微服务】spring cloud function的编程模型
spring cloud·微服务·架构
一休哥助手1 天前
分布式超低耦合,事件驱动架构(EDA)深度解析
分布式·架构