今日内容:
1.数据库范式;
2.事务;
3.JavaScript基础。
数据库范式:
1.第一范式:每一列都是不可分割的原子数据项(每一个列都只包含唯一意义,例如:如果一个列叫做人员信息【其中包含了年龄,姓名等多个信息】,则不符合1NF,应该拆分。)
2.第二范式:在1NF的基础上,非码属性必须完全依赖于候选码。
3.第三范式:在2NF的基础上,任何非主属性不依赖于其它非主属性。
事务:
概念:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
操作:
手动提交:
1.开启事务:start transaction;
2.需要事务管理的各种SQL任务;
3.回滚:rollback;
4.提交:commit;
事务四大特征:
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;
2.持久性:当事务提交或回滚后,数据库会永久保存数据;
3.隔离性:多个事务之间,相互独立;
4.一致性:事务操作前后,数据总量不变。
事务的隔离级别:
**概念:**多个事务之间是相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不懂的隔离级别就可以解决这些问题。
存在问题:
1.脏读:一个事务,读取到另一个事务中没有提交的数据;
2.不可重复读(虚读):在同一个事务中,两次读到的数据不一致;
3.幻读:一个事务操作数据表中所有记录,另一个事务添加了一条记录,则第一个事务查询不到自己的修改。
隔离级别:
1.read uncommitted:读未提交
* 产生的问题:脏读,虚读,幻读
2.read committed:读已提交(oracle默认)
* 产生的问题:虚读
3.repeatable read:可重复读(Mysql默认)
* 产生的问题:幻读
4.serializable:串行化
* 可解决所有问题
注意:隔离级别从上到下,从小到大,安全性越来越高,效率越来越低。
JavaScript基础
概念:一门客户端编程语言
运行在客户端浏览器中的,每一个浏览器都有JavaScript的解析引擎。
脚本语言:不需要编译,直接就可以被浏览器解析执行。
功能:
可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态效果,增强用户体验。
ECMAScript:客户端脚本语言的标准
1.基本语法:
-
与html结合方式:
- 内部JS
- 定义<script>,标签体内容就是js代码
- 外部JS
- 定义<script>,通过src属性引入外部的js文件
- 注意:
- <script>标签可以定义在html页面的如何地方。但是定义的位置会影响执行顺序。
- <script>标签可以定义多个。
- 内部JS
-
注释:
- 单行注释://注释内容
- 多行注释:/*注释内容*/
-
数据类型:
- 原始数据类型(基本数据类型):
- number:数字。整数、小数和NaN(not a number 一个不是数字的数字类型)
- string:字符串。
- boolean:true和false。
- null:对象为空的占位符。
- undefined:未定义。如果一个变量没有给初始化值,则会被默认赋值为undefine
- 引用数据类型:对象
- 原始数据类型(基本数据类型):
-
变量:
- 变量:一小块存储数据的内存空间
- java是强类型的编程语言,js是弱类型的语言。
- 语法:
- var 变量名 = 初始化值;(如果不使用var修饰的变量则为全局变量)
- 可以使用:typeof(变量名)来得到该变量的数据类型。
-
运算符:
- 一元运算符:见Java。++,–,+(正号)…
- 注意:在js中,如果运算数不是运算符所要求的的类型,那么js引擎会实现自动转换。
- string转number:按照字面值转换,如果字面值不是数字,则转为NaN。
- boolean转number:true转为1,false转为0。
- number转boolean:0或NaN为假,其他为真。
- string转boolean:除了空字符串(“”),其他都是true。
- null和undefined:都是false。
- 对象:所有对象都是true。
- 注意:在js中,如果运算数不是运算符所要求的的类型,那么js引擎会实现自动转换。
- 算数运算符:见java。+,-,*,/,%…
- 赋值运算符:见java。
- 比较运算符:
- 类型相同比较
- 字符串:按字典顺序比较,按位逐一比较,直到得到大小为止。
- 类型不同比较
- 先进行类型转换,再比较。
- ===:全等于,不进行类型转换,如果类型不同,则认为不相等。
- 类型相同比较
- 逻辑运算符:见java。
- 三元运算符:见java。
- 一元运算符:见Java。++,–,+(正号)…
-
**流程控制语句:**见java,仅仅说明特殊的内容。
- switch:js可以接受任意类型。
2.基本对象
Function:函数对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Function对象</title>
<script>
/**
* Function:函数(方法)对象
* 创建:
* 方法
* 属性
* 1.length:代表形参的个数
* 特点
* 1.方法定义时,形参的类型可以不写
* 2.方法是一个对象,如果定义了名称相同的方法,会覆盖前者
* 3.在js中,方法的调用只与方法名称有关,和参数列表无关
* 4.在方法声明中有一个隐藏的内置对象arguments数组,封装了所有的参数(在可变参数情景下可用)
* 调用
*/
// //1.创建方式1
// var fun1 = new Function("a","b","alert(a);")
// //调用方法
// //fun1(3,4)
//2.创建方式2
function fun2(a, b) {
alert(a + b)
}
//fun2(3,4)
//3.创建方式3
var fun3 = function (a, b) {
alert(a * b)
}
fun3(3, 4)
//传入的参数个数可以和定义的形参个数不同,若少了,则剩下的变量为undefind,若多了,则会被忽略掉多余部分
fun3(1)
fun3(1, 3, 4)
//使用arguments对象实现可变参数
//多数累加
function fun4() {
var sum = 0
alert("开始累加")
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i]
}
alert(sum)
}
fun4(1,4,3)
</script>
</head>
<body>
</body>
</html>
Array:数组对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Array对象</title>
<script>
/**
* Array:数组对象
* 1.创建:
* 1.var arr = new Array(元素列表);
* 2.var arr = new Array(默认长度);
* 3.var arr = [元素列表];
* 2.方法
* 1.join(参数):将数组中的元素按照参数指定的分隔符拼接为字符串
* 2.push(元素):向数组末尾添加一个或多个元素
* 3.属性
* 4.特点
* 1.js中,数组的元素类型是可变的
* 2.js中,数组的长度是可变的
*
*/
//创建方式:
var arr1 = new Array(1, 2, 3)
var arr2 = new Array(5)
var arr3 = [1,2,3,4,5]
var arr4 = new Array()
document.write(arr1+"<br>")
document.write(arr2+"<br>")
document.write(arr3+"<br>")
document.write(arr4+"<br>")
var arr5 = [1,"abc",true]
document.write(arr5+"<br>")
document.write(arr5[10]+"<br>")
arr5[10] = "hehe"
document.write(arr5+"<br>")
</script>
</head>
<body>
</body>
</html>
Boolean:类似于boolean包装类。
Date:时间对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Date对象</title>
<script>
/**
* Date:日期对象
* 1.创建:
* var date = new Date();
* 2.方法:
* toLocaleString():根据本地时间格式,把 Date 对象转换为字符串。
* getTime():返回 1970 年 1 月 1 日至今的毫秒数,时间戳
*/
var date = new Date()
document.write(date.toLocaleString())
</script>
</head>
<body>
</body>
</html>
Math:数学对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Math对象</title>
<script>
/**
* Math:日期对象
* 1.创建:
* *特点:Math对象不用创建,直接使用
* 2.方法:
* random():返回0~1之间的随机数,含0不含1
* 3.属性:
* PI
*
*/
document.write(Math.PI)
</script>
</head>
<body>
</body>
</html>
Number:类似于基本类型的包装类。
String:类似于基本类型的包装类。
RegExp:正则表达式对象
1.正则表达式:定义字符串的组成规则。
(1).单个字符:[]
如:[a] [ab] [a-zA-Z0-9]
特殊符号代表特殊含义的单个字符:
\d:单个数字字符 [0-9]
\w:单个单词字符[a-zA-Z0-9]
(2).量词符号:
?:表示出现0次或1次
*:表示出现0次或多次
+:表示出现1次或多次
{m,n}:表示m <= 数量 <= n
{,n}:表示最多n次
{m,}:表示最少m次
(3).开始结束符号
^开始符号
$结束符号
2.正则对象:
(1).创建
var reg = new RegExp(“正则表达式”);
var reg = /正则表达式/;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RegExp对象</title>
<script>
/**
* RegExp:正则对象
* 1.创建:
* var reg = new RegExp("正则表达式");
* var reg = /正则表达式/;
* 2.方法:
* test(参数):验证指定的字符串是否符合正则定义的规范
*
*/
var reg = new RegExp("\\w{6,12}")
var reg2 = /^\w{6,12}$/
//验证
var username = "zhangsandafadfadf"
var flag = reg2.test(username)
alert(flag)
</script>
</head>
<body>
</body>
</html>
Global:全局对象
1.特点:全局对象,这个Global中封装的方法不需要对象就可以直接调用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Global对象</title>
<script>
/**
* Global:全局对象
* 1.方法:
* encodeURI() 把字符串编码为 URI。
* encodeURIComponent() 把字符串编码为 URI 组件,区别在于编码的字符更多。
* decodeURI() 解码某个编码的 URI。
* decodeURIComponent() 解码一个编码的 URI 组件。
*
* parseInt():将字符串转为数字
* 逐一判断每一个字符是否是数字,直到不是数字为止,将前边的数字部分转为nubmer
*
* eval():将字符串转为脚本执行
*/
var str = "世科网络"
var encod = encodeURI(str)
document.write(encod+"<br>")
var dencod = decodeURI(encod)
document.write(dencod+"<br>")
var str = "123abc"
document.write(parseInt(str))
var str = "alert(123)"
eval(str)
</script>
</head>
<body>
</body>
</html>