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

1

00:00:00,040 --> 00:00:03,300

接下来,我们就来看一下代码的示例了

2

00:00:06,910 --> 00:00:09,180

我们同样一步一步来看一下

3

00:00:35,030 --> 00:00:36,950

首先初始化数据

4

00:00:37,870 --> 00:00:41,620

这个地方跟之前我们举的例子是一样的

5

00:00:44,970 --> 00:00:47,640

建立连接,打开连接,这一样的

6

00:00:48,170 --> 00:00:49,760

同样,这个连接,我们后面用的

7

00:00:49,770 --> 00:00:53,530

依然是SQLite的数据库

8

00:00:55,080 --> 00:00:57,460

然后创建命令

9

00:00:58,330 --> 00:01:00,320

然后就执行命令了

10

00:01:00,330 --> 00:01:03,510

如果有以前剩下的表,删除掉

11

00:01:06,100 --> 00:01:06,390

12

00:01:07,190 --> 00:01:08,890

然后创建Person表

13

00:01:08,900 --> 00:01:12,450

然后插入初始数据

14

00:01:12,460 --> 00:01:14,250

这都一样的

15

00:01:18,300 --> 00:01:23,890

我们看第一个,查询

16

00:01:24,460 --> 00:01:26,010

我们看第一个示例,查询

17

00:01:28,250 --> 00:01:29,400

查询这里

18

00:01:30,860 --> 00:01:32,020

获取所有人员

19

00:01:33,420 --> 00:01:38,320

首先,它这里就先创建一个映射器

20

00:01:39,230 --> 00:01:40,550

PersonMapper

21

00:01:40,560 --> 00:01:41,990

人员映射器

22

00:01:42,160 --> 00:01:45,690

这显然是一个具体的映射器

23

00:01:46,990 --> 00:01:49,640

但是你看我们new这个的时候

24

00:01:51,340 --> 00:01:52,520

它是跳到这里来的

25

00:01:52,650 --> 00:01:54,920

跳到抽象的映射器这里来的

26

00:01:56,820 --> 00:01:59,520

因为在PersonMapper这里面

27

00:01:59,530 --> 00:02:03,680

没有构造器

28

00:02:04,890 --> 00:02:11,040

这里面也没有,就会什么

29

00:02:12,080 --> 00:02:18,740

缺省认为给你一个没有参数的构造器

30

00:02:20,050 --> 00:02:22,740

相当于用的是

31

00:02:23,200 --> 00:02:27,230

它的超类的一个没有参数的、无参的构造器

32

00:02:27,490 --> 00:02:29,000

反正有这么一个东西给你

33

00:02:29,450 --> 00:02:31,810

实例化一个东西出来就行

34

00:02:34,300 --> 00:02:40,480

抽象映射器这里,定义了一个字典

35

00:02:40,570 --> 00:02:43,960

这跟之前我们看活动记录一样

36

00:02:43,970 --> 00:02:47,680

用来作为存放标识映射的地方

37

00:02:47,810 --> 00:02:48,160

38

00:02:49,020 --> 00:02:54,190

LoadedMap,已加载的映像

39

00:02:54,400 --> 00:02:55,750

已加载的映射

40

00:02:56,910 --> 00:03:00,110

这是键,这是里面的对象

41

00:03:00,280 --> 00:03:07,580

就用LoadedMap来存放

42

00:03:09,860 --> 00:03:11,780

已经加载的领域对象

43

00:03:13,420 --> 00:03:14,490

好,这个有了

44

00:03:16,140 --> 00:03:18,850

然后就调用它的findall

45

00:03:18,860 --> 00:03:22,450

这样的一个操作

46

00:03:23,840 --> 00:03:25,790

mapper的findall操作

47

00:03:32,060 --> 00:03:34,180

那么这个操作就返回

48

00:03:34,190 --> 00:03:36,020

一个Person的列表了

49

00:03:39,080 --> 00:03:41,550

这里面的代码,我们看

50

00:03:45,350 --> 00:03:52,280

首先它new了这样一个对象

51

00:03:58,130 --> 00:04:02,000

findall语句的这样一个对象

52

00:04:02,740 --> 00:04:04,020

这个是一个类

53

00:04:04,430 --> 00:04:07,610

把它定义成一个类的形式

54

00:04:07,900 --> 00:04:09,780

我们看在new完之后

55

00:04:11,330 --> 00:04:13,210

一会我们再看这里面,new完之后

56

00:04:13,220 --> 00:04:17,150

它把它传给findmany

57

00:04:17,160 --> 00:04:18,590

作为参数

58

00:04:22,400 --> 00:04:25,930

然后就得回来一个集合

59

00:04:25,940 --> 00:04:29,410

然后再把这个集合变成Person对象

60

00:04:29,420 --> 00:04:32,470

然后转成列表返回来

61

00:04:33,580 --> 00:04:35,570

首先肯定是先执行这个了

62

00:04:36,960 --> 00:04:38,510

我们看这个是什么东西

63

00:04:39,270 --> 00:04:39,940

往下走

64

00:04:40,960 --> 00:04:46,590

在这里,你看,它实现了这样一个接口

65

00:04:49,350 --> 00:04:50,540

这个接口是什么

66

00:04:50,630 --> 00:04:52,520

我们来看一下它的定义

67

00:04:55,880 --> 00:04:57,950

很简单就是一个包装

68

00:04:57,960 --> 00:05:01,070

这个里面有一个SQL的字符串

69

00:05:01,080 --> 00:05:04,280

实际上就是SQL语句

70

00:05:04,290 --> 00:05:05,780

只不过这个SQL语句

71

00:05:05,910 --> 00:05:09,480

可能留下了某些参数的空档在里面

72

00:05:10,270 --> 00:05:11,890

第二个就是参数列表

73

00:05:11,900 --> 00:05:16,860

是一个对象数组,里面放参数

74

00:05:17,110 --> 00:05:18,870

就是SQL是哪一句

75

00:05:19,220 --> 00:05:21,800

然后具体的参数值是哪些

76

00:05:21,810 --> 00:05:24,300

就放在这里,这是接口

77

00:05:26,660 --> 00:05:32,460

然后各个类,用的时候,自己去实现这个接口

78

00:05:34,310 --> 00:05:36,520

就把SQL语句

79

00:05:36,530 --> 00:05:39,660

你要发给数据库的SQL语句

80

00:05:39,670 --> 00:05:43,920

变成一个实现接口的类

1

00:00:00,550 --> 00:00:04,650

好,我们看这里,它实现的接口

2

00:00:04,660 --> 00:00:05,970

你看,这个类是一个什么

3

00:00:05,980 --> 00:00:08,810

是一个在PersonMapper

4

00:00:08,820 --> 00:00:11,930

这里面的一个内部类

5

00:00:16,290 --> 00:00:17,790

实现这个,说明什么

6

00:00:17,800 --> 00:00:20,860

它里面就会有一个SQL语句

7

00:00:21,240 --> 00:00:23,810

然后一个对象的参数数组

8

00:00:24,150 --> 00:00:27,450

对象数组保存参数,SQL语句

9

00:00:29,040 --> 00:00:31,400

给它赋值赋成这个了

10

00:00:32,370 --> 00:00:34,780

然后参数的数组没有,空的

11

00:00:35,290 --> 00:00:37,610

因为这个语句不需要参数

12

00:00:37,620 --> 00:00:41,660

13

00:00:42,480 --> 00:00:49,630

好,现在得到一个刚才的实例了

14

00:00:49,880 --> 00:00:51,110

里面有一个SQL语句

15

00:00:53,990 --> 00:00:55,070

一个参数数组

16

00:00:56,900 --> 00:00:59,310

然后把它传给findmany

17

00:01:00,510 --> 00:01:03,290

我们看,findmany在哪里

18

00:01:08,900 --> 00:01:13,060

那么这个是在抽象的映射器里面定义的

19

00:01:14,490 --> 00:01:18,810

你看,这是刚才定义的接口

20

00:01:19,410 --> 00:01:25,860

然后给它,返回的是领域对象的列表

21

00:01:26,940 --> 00:01:34,440

我们看这里面,首先创建并打开连接

22

00:01:37,310 --> 00:01:38,420

一样的

23

00:01:41,500 --> 00:01:42,490

这里,这一句

24

00:01:43,910 --> 00:01:47,770

首先把SQL这个,它有两个属性

25

00:01:47,940 --> 00:01:49,890

一个SQL,一个是对象数组

26

00:01:50,660 --> 00:01:52,470

把这个拿出来,在这里

27

00:01:52,480 --> 00:01:56,830

里面的值是select什么

28

00:01:57,900 --> 00:01:58,330

放这里

29

00:01:58,500 --> 00:02:02,630

用它来构造command对象

30

00:02:03,690 --> 00:02:05,980

然后再把这个里面

31

00:02:07,300 --> 00:02:10,420

这里面的参数数组的属性拿出来

32

00:02:11,040 --> 00:02:13,460

在这里,实际上啥也没有

33

00:02:14,830 --> 00:02:16,390

如果有,就拿出来

34

00:02:16,400 --> 00:02:20,570

一个一个,类型就object就行了

35

00:02:21,170 --> 00:02:25,770

值,就是这里面这个,就是数组里面的值

36

00:02:26,500 --> 00:02:28,240

然后添加参数,我们这里没有

37

00:02:28,750 --> 00:02:34,650

因为我们这个是查询所有

38

00:02:34,780 --> 00:02:36,050

因为参数是没有的

39

00:02:38,350 --> 00:02:39,920

然后就执行查询了

40

00:02:41,910 --> 00:02:43,960

执行查询就返回来所有的人了

41

00:02:47,490 --> 00:02:50,560

reader里面就有

42

00:02:50,570 --> 00:02:52,840

所有的Person的数据,因为返回来所有

43

00:02:52,850 --> 00:02:54,310

在这里了

44

00:02:54,690 --> 00:02:58,090

然后,这里面你看,这有一个loadall

45

00:02:58,100 --> 00:03:01,940

就是说,把它全部加载

46

00:03:02,540 --> 00:03:06,010

把reader里面的内容加载到领域对象

47

00:03:06,740 --> 00:03:07,450

并且返回

48

00:03:08,460 --> 00:03:12,910

我们看这里面,loadall

49

00:03:12,920 --> 00:03:16,670

这个是在抽象映射器里面定义的

50

00:03:17,120 --> 00:03:19,110

在这个类里面定义的

51

00:03:22,170 --> 00:03:25,390

这是reader作为参数

52

00:03:25,400 --> 00:03:28,430

返回是领域对象的一个数组,一个列表

53

00:03:30,400 --> 00:03:32,550

首先创建一个列表

54

00:03:35,930 --> 00:03:38,410

然后,这里面逐行逐行

55

00:03:39,480 --> 00:03:43,840

来把它load到这个对象里面

56

00:03:43,850 --> 00:03:45,560

然后添加到领域对象列表

57

00:03:45,570 --> 00:03:47,610

你看,一行一行读

58

00:03:47,620 --> 00:03:52,400

读完之后,你看这里,首先是Load(reader)

59

00:03:54,410 --> 00:03:55,170

读完一行

60

00:03:55,180 --> 00:03:58,810

那么针对这一行把它load到领域对象里面

61

00:03:59,880 --> 00:04:02,750

那么我们看load这个,到这里

62

00:04:04,720 --> 00:04:07,060

load也是在这里面

63

00:04:07,410 --> 00:04:08,710

抽象映射器里面的

64

00:04:10,310 --> 00:04:15,210

那么load这个是做什么

65

00:04:16,140 --> 00:04:18,410

我们看上面这里,我注释了一下

66

00:04:19,440 --> 00:04:21,760

根据当前行返回领域对象

67

00:04:22,240 --> 00:04:26,720

首先,如果标识映射里面有的

68

00:04:27,960 --> 00:04:30,200

那就直接返回标识映射里面就行了

69

00:04:31,300 --> 00:04:34,760

就不用把reader里面

70

00:04:34,770 --> 00:04:36,840

那个东西拿出来赋值,不要了

71

00:04:38,420 --> 00:04:41,960

如果没有

72

00:04:42,890 --> 00:04:46,360

首先映射里面要把它加进去了

73

00:04:47,250 --> 00:04:50,740

首先要构造出一个领域对象

74

00:04:51,320 --> 00:04:52,800

把它变成一个领域对象

75

00:04:52,810 --> 00:04:54,480

然后把它加到映射里面去

76

00:04:55,890 --> 00:05:00,110

那么就用这个doload来映射

77

00:05:05,190 --> 00:05:10,480

这里就用到一个标识映射的模式了

78

00:05:10,610 --> 00:05:12,880

我们前面也用到,我们前面没有讲

79

00:05:13,670 --> 00:05:15,120

所以我们就来讲一下

80

00:05:15,650 --> 00:05:18,350

标识映射这样一个模式

相关推荐
想进大厂的小王2 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
阿伟*rui3 小时前
认识微服务,微服务的拆分,服务治理(nacos注册中心,远程调用)
微服务·架构·firefox
ZHOU西口3 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
deephub6 小时前
Tokenformer:基于参数标记化的高效可扩展Transformer架构
人工智能·python·深度学习·架构·transformer
架构师那点事儿7 小时前
golang 用unsafe 无所畏惧,但使用不得到会panic
架构·go·掘金技术征文
W Y9 小时前
【架构-37】Spark和Flink
架构·flink·spark
Gemini199510 小时前
分布式和微服务的区别
分布式·微服务·架构
Dann Hiroaki18 小时前
GPU架构概述
架构
茶馆大橘18 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
coding侠客19 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构