数据库基本知识点
数据库
数据库即数据的仓库,在数据库中提供了专门的管理系统,对数据库中的数据进行集中的控制和管理。能高效的数据进行存储、检索。
优势:
1、降低存储数据的冗余度
2、更高的数据的一致性
3、存储数据可以共享
4、能够实现数据的安全性
5、便于维护数据的完整性
6、建立数据库所遵循的标准
关系模型把世界看作是由实体(Entity)和联系(Relationship)组成的。
关系模型数据库是一种以表作为实体,以主键和外键关系作为联系的一种数据库结构。
在关系型数据库中,相类似的实体被存入表中。表(table)是关系型数据库的核心单元,他是数据存储的地方。
主键:在在关系型数据库中,用一个唯一的标识符来标识每一行,这个标识符就是主键。
主键的特点:不能重复,不能为空。
外键:在关系型数据中,外键(Forergn Key)是用来表达表和表之间关联关系的列。
关系型数据库:
1、一对一关系:一条主表记录对应一条从表记录,同时一条从表记录对应一条主表记录。(比较少见的类型)
例如:(姓名)1.张三 2.王五 3.李猪 (身份证) 3.5464613213 2.564554544545 1.54664354545
2、一对多关系:一条主表记录对应多条从表记录,同时一条从表记录对应一条主表记录。
在一对多关系中,“多边”的表称为从表,把“一边”的表称为主表。从表利用外键,引用主表的主键,外键加在从表之中。
例如:(姓名)1.张三 2.王五 (语句)1.舒服了 2.爽啊 1.真舒服 张三对应两条语句。
3、多对多关系:一条主表记录对应多条从表记录,同时一条从表记录对应多条主表记录。
例如:1.张三 2.王五 3.二货 (父辈类)5.王二 6.老王 中间表 :1-5 2和3-6. 多个有多个父辈
关系型数据库只是一个保存数据的容器,大多数数据库依靠一个称为数据库管理系统;+
数据库管理系统(Database Management System 简称DBMS)来管理数据库中数据。
数据库管理系统分类:
1、本地数据库管理系统
2、数据库服务管理系统
SQL是结构化查询语言,是一种用于管理关系型数据库,并与数据库中的数据进行通讯的语言。
SQL语言分类:
1、数据定义语言(DDL) 创建,修改,删除数据库的内部数据结构
2、数据查询语言(DQL) 用于数据库中数据的查询
3、数据操作语言(DML) 用于数据库中数据的修改。包括添加,删除,修改等。
4、数据控制语言(DCL) 控制数据库访问权限
create database 数据库名称 数据库名必须唯一,且符合标识符规则。
数据类型一共分为整数类型、浮点类型、字符串类型、日期类型和二进制类型
整数类型分为1,2 ,3, 4,8字节
浮点类型:FLOAT 4字节 7位小数 单精度浮点数
DOUBLE 8字节 15位小数 双精度浮点数
DECIMAL(M,D) 17字节 30位小数 小数值 DECIMAL(M,D)M为总位数,D为小数位,M必须大于D
类型 范围 用途
字符串类型:CHAR(N) 0~255 定长字符串
VACHAR(N) 0~65535 变长字符串
日期类型:类型 大小 格式 用途
DATE 3字节 YYYY-MM-DD(2000-10-10) 日期值
TIME 3字节 HH:MM:SS(12:10:05) 时间值或持续时间
ENUM枚举类型:在MySQL中,ENUM是一个字符串对象,其值是从列创建时定义的允许值列表中选则的
ENUM枚举类型使用语法:CREATE TABLE t employee(
employeeName VARCHAR(50),
edu ENUM("高中",‘大专’,‘本科’));
where和having的区别:
1、where运行在分组前,因此不能执行任何聚合函数
2、having是运行在分组后,只能用聚合函数的过滤。
基本查询SQL的执行顺序:后执行的字句,可以使用前执行字句的计算结果、定义别名等。
基本查询SQL的执行顺序:
1、执行from
2、where条件过滤
3、group by分组
4、执行select投影列
5、having条件过滤
6、执行order by 排序
7、执行limit语句,返回限定行。
子查询: 查询工资比张三高的员工信息
select*from t_employee where money>(select money from t_employee where emName='张三');
在where中嵌套子查询,如果子查询返回单行单列,才能使用比较运算符。(<,>,=,<=)等;
在where中嵌套子查询,如果子查询返回多行多列,只能使用in或not in运算符。
相关子查询:
在主查询中,每查询一条记录,需要重新做一次子查询,这种称为相关子查询。相关子查询的执行,依赖于外部查询的数据,外部查询返回一行,子查询就执行一次。
非相关子查询:
在主查询中,子查询只需要执行一次,子查询结果不再变化。子查询结果供主查询使用,这种查询方式称为非相关子查询。
在SQL语句中,=用于查询条件,表示比较两个值是否相等。=用于修改语句,表示赋值。
数据完整性:
可靠性 + 准确性 = 数据完整性
为什么要保证数据库完整性?
为了防止垃圾数据的产生,从而影响数据库的执行效率。
数据库完整性的分类:
实体完整性、域完整性、引用完整性、自定义完整性。
实体完整性:保证每行所代表的实体能互相区别,不能存在两条一模一样的记录。
实体完整性的实现方式:
主键约束:主键是表中的一到多个列,主键列不能为空,也不能重复,一个表只能有一个主键。
唯一约束:定列所有值必须唯一,该列可以为空,一张表中可以给多个列设置唯一约束。
主键列满足条件:
值不能为空 值必须唯一 不能有业务含义 值不能发生变动
建表格中的列后加 UNIQUE 表示唯一约束
域完整性:保证指定列的数据的有效性
实现方式:
1、非空约束(not null) :指定列不能插入null
2、默认约束(default):添加记录时,如果该列的值不做插入,那么以默认值插入
3、检查约束(check):检查插入列数据的有效值。(mysql不支持检查约束)
money(check(money>1000 and money< 15000));---不满足条件报错。
引用完整性:从表外键中出现的数据,必须在主表的主键列中出现。
实现方式: 外键约束
外键和外键约束的区别:
外键是用来表示表与表之间联系的,是表中的一个列;
外键约束指在外键列上加上一个约束,强制外键列引用的数据是正确的。如果违反该约束,则不允许该条数据的修改
没有建立外键约束不等于没有外键。
添加外键约束的语法 (表名为s_student)随便加
alter table 表名 ADD COnSTRAINT fk_1 FOREIGN KEY(classId) REFERENCES 表名 t_class(Id)、
删除外键约束的语法:
ALTER TABLE 表名 DROP FOREIGN KEY fk_1;
删除主表记录:
当两个表之间建立了关联关系,并且在从表中的外键添加了外键约束时,如果主表记录有从表记录引用,那么主表记录无法删除。
删除主表记录方式:
1、级联删除:先删除主表记录对应的从表记录,然后再删除主表记录
2、外键置空:先将主表对应的从表记录,外键设置为null。然后再删除主表记录。
数据库第一规范:
行不重复(定义主键),列不可再分(值必须唯一)。
第二规范:
1、表必须符合第一范式
2、表中的所有非主键列必须依赖于整个主键列(非主依主)。 每个表值描述一件事情(一个实体)
第三范式:
如果一个关系满足第二范式,并且除了主键以外的其他列都不互相依赖,则满足第三范式(非主独立)。
非主键列之间必须相互独立(非主独立)。
JDBC (Java DataBase Connectivity) ,是Java连接数据库的一套API.
概念:是Java连接数据库的一套标准。该标准定义了大量的接口,由厂商提供实现类,开发者利用接口调用方法,可以屏蔽不同数据库的差异。无论连接什么数据库都是一套API。
驱动包就是数据库厂商针对JDBC规范所写的实现类,连接不同数据库是,应使用不同数据库厂商提供的驱动包。
JDBC 主要完成数据库的磁盘数据和内存中对象数据的交互,本质是流操作。
JDBC开发流程:1、建立连接 2、执行SQL语句 3、关闭连接
流的开发流程:1、建立流 2、操作流 3、关闭流
SQL注入:在JDBC中插入值时,如果以拼接字符串方式插入值,一旦在值中,有非法字符,或SQL语句的关键字时,会导致SQL语句语法错误,或执行不正确的情况。这称为SQL注入。
Statement和PreparedStatement的区别:
1、Statement是PreparedStatement的父接口,Statement在插入SQL语句值的时候,只能以拼接字符串方式进行。不但效率低。而且容易引起SQL注入。
2、PreparedStatement提供了占位符方式填充SQL语句的值。无论是什么值,都当字符串处理,不会引用SQL注入。而且SQL语句只被编译一次,效率较高。
三层架构:三层架构是一种架构模式。三层分为持久层、业务层、表现层。
持久层:主要作用是完成内存数据和磁盘数据的转换。采用DAO模式,建立实体类和数据库进行映射,也就是那个表对应哪个类;哪个列对应哪个属性(ORM对象和关系的映射)。持久层主要的目的就是完成对象数据和关系数据转换。
业务层:主要完成业务处理操作,采用事务脚本模式。将一个业务中所有的操作封装成一个方法。保存在该方法中,所有的数据库更新操作,同时成功或同时失败。不允许部分成功部分失败,这样引起数据混乱的操作。
表现层:主要是完成数据的展示和流程的控制。采用MVC模式。
M:模型,也就是实体类。用于数据的封装和传输
V:视图,也就是GUI界面,用于数据的展示和数据的收集。进行数据的交互
C:控制,也就是事件处理,用于业务流程控制 。
操作步骤:
业务层(业务接口) 通过( 持久接口)持久层 创建 表现层(表现实体类)
事务:事务是用户定义的一个操作序列。-- 事务认为,这些操作序列是一个不可分割的工作单位。
事务特点:原子性、一致性、隔离性和持久性。
事务的原子性:表示事务执行过程中,用户定义的操作序列妖魔全部执行成功,要么全部执行失败
事务的一致性:表示事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态,这称为事务回顾。
事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
事务的持久性:表示事务完成之后,对系统的影响是永久性的,如果已提交的数据在事务执行失败时,数据的状态都应该正确。
反射:在编译期间并不清楚应该加载哪个类,类的加载就是在运行时、期间运行的。通过反射可以对类进行加载、探知、自审。
得到Class对象的三种方式:
1、类名。class (student。class)
2、对象。getClass( ) (s1.getclass( ) )
3、Class。forname("类的全路径(包名+类名)") (class。forName(“mysql。student‘’))
得到该类中所有的公有属性列表:
Field [ ] file = c.get.Fields( );
得到该类中所有的属性,包括私有属性列表:
Field [ ] file = c.getDeclaredFields( );
构造方法的作用:
1、为对象分配空间
2、如果该类没有加载,则加载类
3、初始化成员变量
4、返回对象的应用
模式的分类:
架构模式:架构是指一个软件系统整体的组织结构
架构模式描述软件系统的组织架构的一些规则和指南
通过这些规则和指南,我们可以吧预定义的、职责明确的子系统有效地组织起来
设计模式:设计模式描述的是在软件系统的某一局部不断重现的核心解决方案。这些解决方案以完善的设计结构出现,可以被应用到以后出现的类似的环境中。
工厂模式:将对象的创建和对象的使用分开进行。其主要目的是解耦。
单例模式:让一个类所产生的对象的只有唯一的一个,以减少内存的消耗。
立即加载:在类加载时,直接实例化对象,以后都返回该对象的引用。
延迟加载:类加载时并不实例化,而是在调用方法时,在实例化。
XML技术概述:可扩展的标记语言。以标签和字标记方式描述对象数据。
<< >> && " “ &qpos; ‘
每个XML文档必须有且只有一个根元素
根元素是一个完全包括文档中其他所有元素的元素
所有的元素都必须在根元素中定义
CDATA是不被解析器解析的文本。文本内的标签不会被当做标记,实体不会被展开。
语法:<![CDATA[.。。。。。]]> 中括号里的东西不管是什么都当文本处理
XML文档必须是格式良好的。满足XML基本的语法规则。如果XML文档不是格式良好的,就不能被应用程序和浏览器正确识别和解析。
语法规则:
必须有XML声明语句
<?xml version=”1.0” encoding=”utf-8” ?>
必须有且仅有一个根元素 标记大小写敏感 属性值用引号 标记成对 空标记关闭<a/> <a></a> 元素正确嵌套。
文档描述与校验技术:DTD和Schema都是用于定义XML结构,并且用于检验我们书写的XML文档是否符合要求的技术。
有效的XML除了要满足XML规范外,还要满足相应DTD和Schema定义的元素规范
有效的XML一定是格式良好的,但格式良好的XML不一定是有效的
线程:
单任务处理:一个任务没有完成时,不会进行别的任务。
多任务处理:一个任务没有完成时,又在进行别的任务。
多任务处理的两种类型:
基于进程 :特点:是允许计算机同时运行两个或更多的程序
基于线程
进程是指一种“自包含的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存。”
线程是指在一个程序中,能独立的程序片段加做‘线程’(thread),线程是进程内部单一的顺序控制流。
一个进程拥有多个线程。多个线程共享一个进程的内存空间。
主线程:当一个程序启动时,就有一个线程被操作系统创建,于此同时一个线程也立刻运行,该线程通常叫做程序的主线程。
简单点说,就是main方法一执行,就开启了主线程,每个进程至少有一个主线程。
主线程的特点:1、最先开始 2、最后结束 3、产生其他子线程 4、子线程结束后,清理子线程占用的内存资源。
创建线程的方式:
1、 继承Thread类,重写run()方法。
2、 实现Runnable接口,实现run()方法。
调用start()方法,会在主线程基础上,开启新的子线程。多个任务同时执行
调用run()方法,是普通方法调用,不会在主线程基础上,开启新的子线程。需要一个任务执行完毕时,才能再执行另一个任务。
线程的状态:
新建(创建Thread线程对象)à就绪(调用start()方法,启动线程)à运行(执行run()方法,完成业务操作)à死亡(run()方法执行完毕)。
运行(执行run()方法,完成业务操作)à指向五个状态
1、睡眠(调用sleep()方法)
2、等待(调用object的wait()方法)
3、挂起(调用yield()方法,线程显式出让CPU控制权)
4、阻塞(等待IO事件输入)
1,2,3,4又指向就绪(调用start()方法,启动线程) 重复运行
线程的优先级是指:当两个或两个以上的线程同时处于就绪状态时,优先级高的线程会优先得到执行。 线程的优先级分为10级,数字越大,优先级越高
优先级默认为5级
线程同步是指,当两个或两个以上的线程,同时访问同一个资源时,为了确保数据的安全,只允许同一个时间点,同一个共享资源只被一个线程进行访问。
线程同步带来的结果:1、数据安全 2、效率低下
线程同步使用关键字synchronize来进行标识。
线程同步的实现方式有两种:同步方法和同步块。
Java使用wait()、notify()和notifyAll()方法,完成线程的通信。
这些方法时作为object类中的final方法实现的。三个方法仅在synchronize方法中才能被调用。
Wait()方法和sleep()方法,都能让线程暂时停止运行。但是他们使用的方式和时机是不同的。
1、 sleep()方法在线程类Thread中定义,wait()方法在object中定义。
2、 wait()方法只能放在同步方法或同步块中,表示当前线程对资源进行等待。Sleep方法可以放在任何位置,表示当前线程休眠。
3、 wait()方法要释放对象锁,sleep()方法不会释放对象锁。
4、 wait()方法使用后,线程需要notify唤醒后才能继续执行。而sleep()在休眠结束后,线程自动继续执行。
TCP/IP协议:
TCP/IP模型:分为应用层、传输层、网络互联层和网络接口层。
网络编程的实质就是编写程序直接或间接地通过网络协议与其他计算机上的某个程序进行通讯
端口:
端口,就是应用程序用于数据交互的通道,用于实现程序的通信。每个应用程序都有固定的端口。
两个应用程序如果使用同一个端口,那么会抛出端口冲突异常:java.net.BindException.
常用的端口:
协议 · 端口
TeInet协议 tel 23
简单邮件传输协议smtp 25
文件传输协议ftp 21
超文本传输协议http 80
TCP协议:比较可靠地双向流协议
三次握手
提供消息确认、错误检测和错误恢复等服务。如果数据在传输过程中有消耗,有遗失,会要重新发送。从而保证数据的完整性。
UDP协议:
比较不可靠,如果数据在传输中有损耗,不会要求重发,优点是速度快。
客服端和服务器:服务器和客户端共同承担计算。
客户端:向另一台计算机请求服务的计算机。
服务器:处理客户端请求的计算机。