[图解]企业应用架构模式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
标识映射这样一个模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/770102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年小米SU7维修手册和电路图线路图接线图资料更新

此次更新了2024年小米SU7维修手册和电路图资料,覆盖市面上99%车型,包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等! 汽修帮…

ImportError cannot import name ‘uic‘ from ‘PyQt5‘

ImportError cannot import name ‘uic’ from ‘PyQt5’ 1、描述 使用nuitka把PyQt5打包exe文件时报错: ImportError cannot import name ‘uic’ from ‘PyQt5’ 2、原因 这个是由于无法找到uic的目录导致的,在PyQt5的目录下是有uic文件的。 3、解决方案 找到导入uic…

常见sql语句练习

Tips:之前查看网上的文章感觉太乱了,所以自己整理了一套sql语句来练习,主要也可以拿来应对面试,需要的可以自行下载练习 包含基本语句、聚合函数、模糊查询、范围查询、排序、聚合、分组、分页、子查询、索引和视图、左右连接、双…

电脑突然不能上网,然后网线是正确的,网络诊断提示说,显示远程计算机或设备将不接受连接

解决方法: WINR输入 cmd 点击确认,输入inetcpl.cpl,点击确定,弹出右边窗口。 电脑显示远程计算机或设备将不接受连接的解决办法,已解决

『我在家乡的精神角落』插画H5 案例赏析

「我在家乡的精神角落」是一部由快手精心打造的插画艺术风H5,它以独特的方式探索个体的内心世界。通过简约的插画和丰富的色彩,结合九型人格测试的问题,引导用户发现自我,找到属于自己的精神角落。 part1. 创意定位 人格测试&…

LED透明屏的维护秘籍

LED透明屏,听起来是不是就很有科技感?它不仅看起来美观,而且功能强大。但你知道吗,要想让你的LED透明屏长时间保持最佳状态,一些简单的维护是必不可少的。下面是一些维护小贴士,让你的屏幕始终光彩照人。 1…

3C电子制造行业MES系统,提高企业生产效率

随着科技的不断进步,3C电子制造行业正迎来传统工厂向数字化工厂转型的阶段。在这场变革中,MES系统发挥着重要的作用,成为了企业变革的“智慧大脑”,引领着生产流程的优化和升级。 那么,MES系统究竟有哪些功能&#xf…

干货!一文读懂10种主流的图片格式

JPG、PNG、GIF,这些在我们生活中常见的图片格式,你真的了解它们吗?你知道除了这3种图片格式外,还有十多种主流的图片格式吗?每一种图片格式都有自己的特点和适用场景,选择正确的图片类型不仅能提升视觉效果…

【学习笔记】网络设备(华为交换机)基础知识1——命令行入门知识

一、前期准备 提示:下面所有学习内容都是基于以下条件完成的 条件1.已经可以正常访问交换机的命令行接口 连接到命令行接口的方法 : ① :通过Console口本地访问 ② : 通过Telnet访问 ③ : 通过SSH访问 ④ &#xff1…

信息打点web篇---前端js打点

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理前端js代码的打点思路 本文只为学习安全使用,切勿用于非法用途。 一切未授权的渗透行为都是违法的。 前端js打点概念与目的 javascript文件属于前端语言,也就是说他的代码都…

【Python】已解决:ModuleNotFoundError: No module named ‘cv2’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:ModuleNotFoundError: No module named ‘cv2’ 一、分析问题背景 在Python编程中,当你尝试导入一个不存在的模块时,会遇到ModuleNotFou…

权限维持Linux---监控功能Strace后门命令自定义Alias后门

免责声明:本文仅做技术交流与学习... 目录 监控功能Strace后门 1、记录 sshd 明文 监控 筛选查看 2、记录sshd私钥 命令自定义Alias后门 1、简单粗鲁实现反弹: 靶机替换命令 攻击机监听上线 2.升级(让命令正常) 将反弹命令进行base64编码 替换alias命令 …

【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用

系列篇章💥 No.文章1【Qwen部署实战】探索Qwen-7B-Chat:阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用4【Q…

蓝牙资讯|苹果Apple Pencil新专利:用笔套扩展传感器 / 续航等模块化方案

根据美国商标和专利局最新公示的清单,苹果公司获得了一项 Apple Pencil 的专利,探索了模块化设计方案,用户未来可以根据自身需求或者使用场景,随心更换 Pencil 的模块,达到不同的效果。 苹果在专利中表示笔套内置传感器…

GNU/Linux - Kconfig Language - 1

Introduction 配置数据库是以树形结构组织的配置选项集合: The configuration database is a collection of configuration options organized in a tree structure: - Code maturity level options | - Prompt for development and/or incomplete code/drivers …

hibernate与jpa学习

jpa是一个规范,hibernate是jpa的实现,是一种框架。 hibernate: ORM框架/持久层框架(Object Relational Mapping) 它是是一个轻量级开放源代码的对象关系映射框架,hibernate可以自动生成SQL语句&#xff0…

js 使用 lodash-es 检测某个值是否是函数

import { isFunction } from lodash-eslet isA isFunction(() > {}) console.log(isA) //true https://www.lodashjs.com/docs/lodash.isFunction#_isfunctionvalue https://lodash.com/docs/4.17.15#isFunction 人工智能学习网站 https://chat.xutongbao.top

简单的电路指示锂离子电池的健康状况

锂离子电池对不良处理很敏感。当我们将电池充电至低于制造商定义的裕量时,可能会发生火灾、爆炸和其他危险情况。 锂离子电池在正常使用的过程中,其内部进行电能与化学能相互转化的化学正反应。但在某些条件下,如对其过充电、过放电或过电流…

复杂流分类

拓扑图 配置 配置ACL 配置流分类、流行为、流策略 在接口应用 sysname AR1 # acl number 2000 rule 5 permit source 10.1.1.1 0 acl number 2001 rule 5 permit source 10.1.1.2 0 acl number 2002 rule 5 permit source 10.1.1.3 0 # traffic classifier EF operat…

CGLib动态代理技术

基于CGLib的动态代理机制,ProxyFactoryy无需再像JDK动态代理那样实现一个interface,实际情况下可能这个interface并不存在,只需要实现另外一个接口MethodInterceptor即可 package com.hmdp.service.尚硅谷的代理模式3; //CGlib代理import …