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

发布于:2024-07-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

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
标识映射这样一个模式


网站公告

今日签到

点亮在社区的每一天
去签到