1
00:00:01,720 --> 00:00:03,950
下一個我們要講的就是
2
00:00:04,660 --> 00:00:07,420
數據映射器這個模式
3
00:00:09,760 --> 00:00:13,420
這個也是在數據源模式里面
4
00:00:13,430 --> 00:00:14,820
用得最廣泛的
5
00:00:16,250 --> 00:00:19,170
大多數都是用
6
00:00:19,180 --> 00:00:21,540
數據映射器模式的產品
7
00:00:21,550 --> 00:00:25,370
來做數據庫的訪問
8
00:00:28,710 --> 00:00:29,660
我們看它的定義
9
00:00:31,100 --> 00:00:34,530
在保持對象
10
00:00:34,800 --> 00:00:37,190
還有數據庫以及映射器本身
11
00:00:37,360 --> 00:00:39,070
彼此獨立的情況下
12
00:00:40,080 --> 00:00:43,640
在二者之間移動數據的一個映射器層
13
00:00:45,860 --> 00:00:48,050
彼此獨立的意思就是什么
14
00:00:48,650 --> 00:00:50,970
可以換了
15
00:00:51,100 --> 00:00:52,450
比如說,你可以換數據庫
16
00:00:53,920 --> 00:00:58,460
后面可以是關系數據庫
17
00:00:58,710 --> 00:01:02,870
關系數據庫也可以換不同產品
18
00:01:05,320 --> 00:01:07,030
包括映射器本身也可以換
19
00:01:07,620 --> 00:01:07,940
20
00:01:08,860 --> 00:01:12,810
比如說,你本來用,如果是映射器
21
00:01:13,510 --> 00:01:15,700
你本來用的是,比如說
22
00:01:16,030 --> 00:01:16,700
Hibernate
23
00:01:17,530 --> 00:01:26,120
你換成Mybatis之類的,都可以換
24
00:01:31,960 --> 00:01:32,390
我們來看
25
00:01:33,900 --> 00:01:36,740
映射器的好處就是說
26
00:01:36,750 --> 00:01:41,520
它可以保持領域層干凈
27
00:01:41,530 --> 00:01:46,360
我們前面講的活動記錄也好
28
00:01:50,960 --> 00:01:51,960
入口也好
29
00:01:52,640 --> 00:01:53,780
入口它本身就是
30
00:01:55,770 --> 00:01:58,430
沒有領域邏輯在里面了
31
00:01:59,490 --> 00:02:02,880
就是數據在內存的一個映射
32
00:02:02,890 --> 00:02:06,650
活動記錄就是在入口之上加上領域邏輯
33
00:02:09,470 --> 00:02:13,730
但是映射器這里
34
00:02:13,860 --> 00:02:16,730
Person這個類
35
00:02:17,050 --> 00:02:19,090
它就可以是干凈的
36
00:02:19,300 --> 00:02:21,700
里面只有領域概念
37
00:02:21,830 --> 00:02:25,030
一些領域的操作
38
00:02:25,730 --> 00:02:35,310
沒有跟數據訪問相關的或者其他
39
00:02:35,910 --> 00:02:38,030
領域類它就可以不知道數據庫的存在
40
00:02:38,780 --> 00:02:42,500
也不需要知道映射器的存在
41
00:02:43,770 --> 00:02:47,170
意味著整個映射器是可以更換的
42
00:02:47,780 --> 00:02:50,720
因為它本身根本就不知道
43
00:02:50,730 --> 00:02:51,800
你用了什么映射器
44
00:02:52,140 --> 00:02:53,300
也不知道你用了什么數據庫
45
00:02:54,410 --> 00:02:56,180
所以你完全可以
46
00:02:56,860 --> 00:03:01,650
換另外一個映射器來配合它
47
00:03:06,780 --> 00:03:13,320
顯然,這樣一種模式
48
00:03:13,330 --> 00:03:16,230
它在什么情況下是比較適合的
49
00:03:18,370 --> 00:03:20,730
數據庫和領域是單獨演變的
50
00:03:22,030 --> 00:03:23,830
這樣一種方式是比較適合的
51
00:03:26,180 --> 00:03:28,640
但實際上大家都覺得
52
00:03:28,650 --> 00:03:30,120
自己的應用
53
00:03:30,130 --> 00:03:32,900
都希望單獨演變
54
00:03:33,030 --> 00:03:34,770
但在實際中
55
00:03:35,140 --> 00:03:36,930
我們往往就高估了
56
00:03:38,000 --> 00:03:42,120
平臺的單獨演變這種可能性
57
00:03:42,690 --> 00:03:43,440
很多時候
58
00:03:43,450 --> 00:03:48,400
我們根本就沒有真正的這種需要
59
00:03:50,220 --> 00:03:53,070
但是這個作為它的一個優點
60
00:03:56,240 --> 00:04:00,020
跟其他的相比
61
00:04:00,840 --> 00:04:01,760
這是一個優點
62
00:04:02,990 --> 00:04:07,670
第二個,肯定是面向對象的
63
00:04:07,680 --> 00:04:10,840
因為你要保持領域對象的干凈
64
00:04:10,850 --> 00:04:12,600
領域邏輯
65
00:04:13,840 --> 00:04:18,480
是因為你是面向對象的這種實現
66
00:04:19,190 --> 00:04:20,880
才有必要這樣來做
67
00:04:20,890 --> 00:04:22,760
否則你根本不是面向對象的
68
00:04:22,770 --> 00:04:27,050
你前面都沒有什么對象的封裝等等
69
00:04:27,770 --> 00:04:30,320
你就直接用一個入口就可以了
1
00:00:00,570 --> 00:00:04,040
下面這個就是映射器的類圖了
2
00:00:06,480 --> 00:00:09,480
當然這個畫得比較簡單了
3
00:00:09,490 --> 00:00:12,190
就是說,映射器負責依賴這兩邊
4
00:00:12,400 --> 00:00:14,860
但這兩邊互相是不知道的
5
00:00:19,000 --> 00:00:22,850
序列圖,這是書上我們截屏下來的序列圖
6
00:00:23,490 --> 00:00:25,040
從數據庫檢索數據
7
00:00:27,680 --> 00:00:32,020
由映射器來取
8
00:00:32,110 --> 00:00:35,880
然后這里如果說
9
00:00:36,610 --> 00:00:38,090
map
10
00:00:38,100 --> 00:00:42,240
就是一個內存里面
11
00:00:42,450 --> 00:00:44,280
的映射還不存在
12
00:00:44,690 --> 00:00:47,120
這里就給它新建一個
13
00:00:48,090 --> 00:00:50,310
存在,就直接用這個就行了
14
00:00:52,880 --> 00:00:58,670
然后get如果是沒有,返回空
15
00:00:58,680 --> 00:01:03,520
那么就訪問數據庫得到數據
16
00:01:03,530 --> 00:01:08,060
然后由它來把這個對象
17
00:01:08,070 --> 00:01:09,980
在內存里面創建起來
18
00:01:10,690 --> 00:01:12,600
相當于把數據庫里面的數據
19
00:01:12,610 --> 00:01:13,640
搬到內存里面
20
00:01:13,650 --> 00:01:14,880
來建立一個映像
21
00:01:16,180 --> 00:01:19,060
當然,同時要把它加到map里面
22
00:01:19,070 --> 00:01:21,020
如果map里面不存在
23
00:01:23,060 --> 00:01:24,620
更新也是一樣,更新
24
00:01:24,630 --> 00:01:27,900
把數據拿過來
25
00:01:28,680 --> 00:01:32,220
由它來更新到數據庫里面去
26
00:01:33,140 --> 00:01:36,330
這些一會我們在演示示例代碼的時候
27
00:01:36,990 --> 00:01:38,980
都會慢慢看到的