四.需求规格说明
MVC模型
1、概念:
Model View Controller。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC分层开发= 视图层 + 控制层 + 数据模型层
2. 组成结构:
模型(Model):负责存储系统的中心数据。
视图(View):将信息显示给用户(可以定义多个视图)。
控制(Controller):处理用户输入的信息。负责从视图读取数据,控制用户输入,并向模型发送数据,是应用程序中处理用户交互的部分。负责管理与用户交互交互控制
- MVC模型在B/S架构中的实现
BS架构的典型实现:Browser/Server
CS:Client/Server
BS架构的典型实现:
View:JSP动态进行页面展示;CSS 页面样式设计; (JQuery,Nodejs,Layui,EasyUI,BootStrap,AngularJs,Reactjs,VUE等)页面业务逻辑及页
面框架设计,Ajax 异步请求。Control:servlet,Structs,SpringMVC/SpringBoot
Model:数据模型 Bean/POJO,服务层,持久化(JDBC,Hibernate,Mybatis)。
数据持久化
1.概念:
将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的过程. 数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。
通常指的内存数据与数据库模型的转换。
2.关系型数据库模型 oracle/mysql/sql server等
表:关系型数据库存储数据的模型。
列名:命名要有意义,使用驼峰格式
数据类型:int、float、varchar、date等。
约束:非空、唯一、主键、外键、自增长等
表数据基本操作
增:insert into table values();
删:delete from table where xxx=xxx;
truncate table
改:update table set xxx=xxx,yyyy=yyy;
查:select * from table;
聚合函数、子查询、联合查询、分组
聚合函数:
Count(*):数据数量
Sum():求和
Avg():求平均数
max():求最大值
Min():求最小值
子查询:
in/not in
将子查询的结果作为主查询的条件
exists/not exists
将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留
联合查询:
全连接:取数据并集
内连接:取数据交集
select * from student a,SCORE B WHERE A.student_id=B.student_id;
左连接 left join: 取左表的所有数据。
select * from student a LEFT OUTER JOIN score b on a.student_id=b.student_id;
右连接 right join:取右表的所有数据。
select * from student a RIGHT JOIN score b on a.student_id=b.student_id;
分组查询:
group by
having
注:Select 子句中的所有查询字段,除了聚合函数,都必须放在group by子句中。
分组函数中的条件要写在having后面
存储过程:
数据库编程技术,完成特定功能的sql集。包括:变量定义,变量赋值,游标,sql语句(DML),输入输出参数等。
3.对象关系映射(ORM)
概念:用于实现面向对象编程语言里不同类型系统的数据之间的转换,建立对象和数据库数据表的映射,便于开发进行对象和数据库表之间的交互(持久化)。
ORM的实现:Hibernate/Mybatis
Mybatis映射类型:
简单映射:表字段和对象属性一对一映射
级联映射:
一对一关系:ResultMap>Assocation
一对多关系:ResultMap>Collection
Mybatis对ORM的支持
数据模型
概念数据模型:
1.概念:
Conceptual Data Model:概念数据模型,它以实体-联系(Entity-RelationShip, E-R)理论为基础,并对这一理论进行了扩充。它从用户的观点出发对信息进行建模,主要用于数据库的概念级设计
概念数据模型=实体+联系
2.实体:
指现实世界中客观存在,并可相互区别的事物或者事件。它可以是具体的对象,例如一种商品,一名职工,一个机构等,也可以是抽象的事件,例如一次会议,一次旅行等。
3.实体的元素:
属性(Attribute):每一个实体都包括一组用来描述实体特征的属性(Attribute),例如学员实体可由学员编号,学员年龄,性别等组成。在CDM中,使用name和code表示。
数据类型(Data type):表示属性的数据类型。指定属性允许的值范围。
标准数据类型如下:
标识符:标识实体属性的约束
常用的标识符有:
Mandatory:属性是否允许为空
Primary Identity:表示是否为主标识
Display:表示属性是否在模型图中展示。
包含的元素
数据域(Domain):域是具有相同数据类型值的集合,可以被多个实体的属性以及数据项共享。
类似于数据字典,常用于属性的值是固定的几个的情况。
定义一个数据域可以应用到多个实体中。
域发生变化只需求修改域的定义即可,无需逐个修改实体。
创建数据域:
定义数据域的基本信息:
数据项(data item):即实体的属性。定义好数据项(属性),在实体中可以直接添加已经定义的数据项。
一个数据项可以在多个实体中使用。
对于公共的属性,无需在多个实体中重复敲入。
属性发生变化只需求修改域的定义即可,无需逐个修改实体的属性
创建数据项:和数据域的创建类似。
使用数据项:
定义数据域的子项
联系(Relationship):指两个实体之间或者实体内部的连接或关系。
完成实体定义以后,应该在它们之间建立联系。实体的联系通常是依据业务规则确定的。
包括的类型:
一对一:对象A只能有一个对象B
一对多:对象A可以有多个对象B
多对一:对象B可以有多个对象A
多对多:对象A可以有多个对象B,对象B可以有多个对象A
物理数据模型:
1、概念:
Physical Data Model(PDM):物理数据模型,是面向计算机物理表示的模型,描述了数据在储存介质上的组织结构。
进行数据库体系结构设计,真正实现数据在数据库中的存放。
与具体的DBMS 有关
物理数据模型的内容包括确定所有的表和列,定义外键用于确定表之间的关系,基于用户的需求可能进行规范化等内容
2.包含的元素:
表
数据库表,表信息与数据模型的DBMS一致。
视图
视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图使用查询语句创建,可以定义视图只查或者可修改模式。
索引
索引其实是一种数据结构,其功能是帮助我们快速匹配查找到需要的数据行,是数据库性能优化最常用的工具之一。其作用相当于超市里的导购员、书本里的目录。
索引类型:
主键索引 PRIMARY KEY:一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
唯一索引 UNIQUE:唯一索引列的值必须唯一,但允许有空值
普通索引 INDEX:最基本的索引,它没有任何限制
组合索引 INDEX:组合索引,即一个索引包含多个列.
全文索引 FULLTEXT:全文索引
索引设计的原则
适合索引的列是出现在where子句中的列,或者连接子句中指定的列
基数较小的类,索引效果较差,没有必要在此列建立索引
使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间
不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
3.操作:
创建索引
主键:
主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。
基本特性:非空,唯一
外键:
建立表与表之间的关联关系。让表与表之间的数据,更加的完整,关连性更强。
设置外键约束的两个表之间会具有父子关系,即子表中外键的字段的取值范围由父表所决定
CDM生成PDM:
使用CDM可以自动生成PDM,操作如下所示:
PDM导出sql语句:
PDM使用power designer可以自动导出数据模型sql语句,如下图所示:
相关文章:
类图及类图中的关系
1.类图和对象图
类图(Class Diagram)是显示出类、接口以及他们之间的静态结构与关系的图。其中最基本的单元是类或接口。
类图不但可以表示类(或者接口)之间的关系,也可以表示对象之间的关系。下面是一个典型的类图:
类图一般分为几个部分:类名、属性、方法。下面分别讲解。
(1)类名
上面的Car就是类名,如果类名是正体字,则说明该类是一个具体的类,如果类名是斜体字,则说明类是一个抽象类abstract。
(2)属性列表
属性可以是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。当然,这只是一种表现方式。我是用的是Rational Rose,如果用的是别的软件,还可能使用+、-、#表示:+代表public、-代表private、#代表protected。
(3)方法列表
方法可以是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。当然,这只是一种表现方式。我是用的是Rational Rose,如果用的是别的软件,还可能使用+、-、#表示:+代表public、-代表private、#代表protected。
对于静态属性,属性名会加上一条下划线。如上图所示。
此外,类图既能表示类之间的关系,还能表示对象之间的关系。二者的区别是:对象图中对象名下面会加上一条下划线。
2.类图中的关系
(1)Generalization:泛化、一般化
Generalization表示的是类与类之间的继承关系、接口与接口之间的继承关系、类与接口之间的实现关系。如果体现到Java语言中,那就是反应extends和implements关键字。其典型类图如下所示:
(2)Association:关联关系
关联关系描述的是类与类之间的连接,他表示一个类知道另一个类的属性和方法。关联关系可以是单向的或者双向的。在Java语言中,单向的关联关系是通过以实例变量的方式持有被关联对象的引用来实现的。一般来说是不建议使用双向的关联关系的。下面举例介绍单向的关联关系。
上面的类图表现的是骑手和马之间的关系。Rider中有一个实例变量类型是Horse。
每个连接都会有两个端点,上面的Rider和Horse就是端点,且每个端点都可以有(optional)一个基数(multiplicity),表示这个类可以有几个实例。这个类似于数据库中的1:n、m:n这些关系。我们可以给上面的例子加上基数:
上面表示的是骑手与马之间的1对n关系。
(3)Aggregation:聚合关系
聚合关系是关联关系的一部分,是非常强的关联关系。聚合关系表现的更多的是整体与部分的关系。例如汽车和车门、发动机之间的关系。如图所示:
与关联关系一样,聚合关系也是通过实例变量实现的。单纯从语法的角度基本上无法判断出关联关系和聚合关系。
(4)Composition:组合关系
组合关系同样也是关联关系中的一种,这种关系是比聚合关系更加强的关系。我们前面提到,聚合关系表现的是整体与部分之间的关系,组合关系是在聚合关系的基础上,表示不可分割的整体与部分之间的关系。也就是说表示整体的对象需要负责表示部分的对象的生命周期。
“代表整体的对象负责保持代表部分的对象的存活,在一些情况下负责将代表部分的对象湮灭掉。代表整体的对象某些时候可以将代表部分的对象传递给另外一个对象,并由它负责代表部分的对象的生命周期。换言之,代表部分的对象同一时刻只能与一个对象构成组合关系。并且由后者排他的负责其生命周期。”——《Java与模式》
我们以人和手臂的关系举例,组合关系的类图如下:
(5)Dependency:依赖关系
依赖关系表示一个类依赖于另一个类的定义。依赖关系是单方向的。人吃苹果,那么人依赖苹果。类图如下:
一般来说,被依赖的对象往往是以局部变量、方法参数的形式存在于来对象中,与关联关系不同,它不会以成员变量的形式存在于以来对象中。这一点值得注意。另外,每一个依赖都有一个名称。上面这个依赖关系的名称就是eats。
以上就是类图和常见的类图之间的关系。最近看一些相关的书籍,发现对常见的类关系还是不熟,把自己之前的一篇博客转过来再好好看看。
五分钟读懂UML类图
一、类的属性的表示方式
在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modifyInfo()方法。
那么属性/方法名称前加的加号和减号是什么意思呢?它们表示了这个属性或方法的可见性,UML类图中表示可见性的符号有三种:
· + :表示public
· - :表示private
· #:表示protected(friendly也归入这类)
因此,上图中的Employee类具有3个私有属性和一个公有方法。
实际上,属性的完整表示方式是这样的:
可见性 名称 :类型 [ = 缺省值]
中括号中的内容表示是可选的
二、类的方法的表示方式
上图中我们已经看到了方法的表示形式。实际上,方法的完整表示方式如下:
可见性 名称(参数列表) [ : 返回类型]
同样,中括号中的内容是可选的。
比如在下图的Demo类中,定义了3个方法:
· public方法method1接收一个类型为Object的参数,返回值类型为void
· protected方法method2无参数,返回值类型为String
· private方法method3接收类型分别为int、int[]的参数,返回值类型为int
三、类与类之间关系的表示方式
1、关联关系
关联关系又可进一步分为单向关联、双向关联和自关联。
(1)单向关联
我们可以看到,在UML类图中单向关联用一个带箭头的直线表示。上图表示每个顾客都有一个地址,这通过让Customer类持有一个类型为Address的成员变量类实现。
(2)双向关联
从上图中我们很容易看出,所谓的双向关联就是双方各自持有对方类型的成员变量。在UML类图中,双向关联用一个不带箭头的直线表示。上图中在Customer类中维护一个Product[]数组,表示一个顾客购买了那些产品;在Product类中维护一个Customer类型的成员变量表示这个产品被哪个顾客所购买。
(3)自关联
自关联在UML类图中用一个带有箭头且指向自身的直线表示。上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”。
2、聚合关系
上图中的Car类与Engine类就是聚合关系(Car类中包含一个Engine类型的成员变量)。由上图我们可以看到,UML中聚合关系用带空心菱形和箭头的直线表示。聚合关系强调是“整体”包含“部分”,但是“部分”可以脱离“整体”而单独存在。比如上图中汽车包含了发动机,而发动机脱离了汽车也能单独存在。
3、组合关系
组合关系与聚合关系见得最大不同在于:这里的“部分”脱离了“整体”便不复存在。比如下图:
显然,嘴是头的一部分且不能脱离了头而单独存在。在UML类图中,组合关系用一个带实心菱形和箭头的直线表示。
4、依赖关系
从上图我们可以看到,Driver的drive方法只有传入了一个Car对象才能发挥作用,因此我们说Driver类依赖于Car类。在UML类图中,依赖关系用一条带有箭头的虚线表示。
5、继承关系
继承关系对应的是extend关键字,在UML类图中用带空心三角形的直线表示,如下图所示中,Student类与Teacher类继承了Person类。
6、接口实现关系
这种关系对应implement关键字,在UML类图中用带空心三角形的虚线表示。如下图中,Car类与Ship类都实现了Vehicle接口。
到了这里,UML类图中最常见的表示方式我们就介绍完了,有了这些我们就能读懂常见的UML类图了,剩下的遇到时再查即可。