[图解]企业应用架构模式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

标识映射这样一个模式

相关推荐
hstar952726 分钟前
二、即时通讯系统设计经验
java·架构
江梦寻40 分钟前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式
打码人的日常分享9 小时前
物联网智慧医院建设方案(PPT)
大数据·物联网·架构·流程图·智慧城市·制造
白水baishui9 小时前
搭建强化推荐的决策服务架构
架构·推荐系统·强化学习·决策服务·服务架构
何双新10 小时前
第23讲、Odoo18 邮件系统整体架构
ai·架构
雪碧聊技术10 小时前
将单体架构项目拆分成微服务时的两种工程结构
微服务·架构·module·project·工程结构
从零开始学习人工智能10 小时前
Doris 数据库深度解析:架构、原理与实战应用
数据库·架构
程序员JerrySUN11 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
Theodore_102212 小时前
大数据(2) 大数据处理架构Hadoop
大数据·服务器·hadoop·分布式·ubuntu·架构
米粉030512 小时前
深入剖析Nginx:从入门到高并发架构实战
java·运维·nginx·架构