数据库–1,概述作用就是用来存储数据和管理数据,本质上就是需要安装MySQL软件.分类: 关系型数据库MySQL 和 非关系型数据库Redis ,主要观察数据之间的关系
–2,使用1,安装服务器端: 存数据,管理数据
核心步骤: 设置字符集/编码成 utf-8 , 端口号3306 , 设置服务名称MySQL , 设置密码root
2,安装客户端: 连接服务器,操作服务器里的数据
1,小黑窗口/DOS窗口: --从开始菜单里找MySQL/Mariadb,输入密码 --win+r 然后输入cmd
#发起MySQL的命令 -u是指定用户名(root) -p是指定密码(自定义的) mysql -uroot -proot
2,图形化的工具:sqlyog
3,数据库的结构 数据库 -> 表(行和列) -> 数据 4,SQL语言 1,概述 结构化查询语言,用来操作数据库的语言,是一种标准. 增删改查里将来发生最多的业务就是: 查 !!! 2,分类: DML是数据操纵语言 DDL是指数据定义语言 DCL是指数据控制语言 DQL是指数据查询语言 二,数据库的常见操作 增删改查 CRUD –1,创建库 也可以简写成:create table cgb charset utf8 ;![img](https://img-blog.csdnimg/c0f90ddb11bf40d1ba949729f064b780.png) ### –2,查询库 ![img](https://img-blog.csdnimg/396e4247fb394ffc95d90f8ecd6e2b2e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAY2dibHB4,size_20,color_FFFFFF,t_70,g_se,x_16) ### –4,删除库 ![img](https://img-blog.csdnimg/25ca0ee7cc8046e890cecd8b873ccee1.png) ## 三,表的常见操作 增删改查 CRUD ### –1,使用指定的数据库 ![img](https://img-blog.csdnimg/3598be1e299843fb926f62bab2cf559d.png) ### –2,创建表 语法: ```sql create table 表名(字段名称 字段类型(字段长度),字段2,字段3,...)
练习:
mysql> create table tb_order_detail( -> id int(11), -> order_id int(11), -> num tinyint(4), -> item varchar(30), -> price double -> ); Query OK, 0 rows affected (0.02 sec)
–3,查看表
mysql> show tables; +---------------------+ | Tables_in_cgb210901 | +---------------------+ | tb_door | | tb_order_detail | +---------------------+ 2 rows in set (0.00 sec)
–4,修改表
mysql> alter table tb_door add column money numeric(7,2); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
–5,描述表结构
–6,删除表
mysql> drop table tb_door; Query OK, 0 rows affected (0.00 sec)
四,数据的常见操作
增删改查 CRUD
–1,查询数据/记录
–2,插入数据/记录
语法:insert into 表名 values(1,2,3,4,5,6)注意:1, 需要设置几个值?要看表里有几个字段2, 值的顺序要和字段的顺序保持一致3, 如果字段是字符串类型,设置值时必须要有" " ’ '的标记
–3,修改数据/记录
–4,删除数据/记录
五,数据库的使用细节
–1,命名规范
1, 以字母开头,不要以数字开头2, 不能使用保留字:select / from / update / delete / insert into3, MySQL数据库不区分大小写,多个单词用下划线分开
–2,数据类型
1, 整型:int2, 小数:double(不精确) / numeric(a,b) / decimal(a,b)–a是数字的位数b是小数位数3, 时间: date(年月日) time(时分秒) datetime(年月日时分秒) timestamp(时间戳,毫秒数)4, 字符串: char / varchar区别:char 是固定长度,浪费空间char(10)varchar 是可变长度,节省空间varchar(10)特殊场景: 数据长度如果就是固定的,优先选char,因为查的快5, 图片: 如果想存入数据库,只会存文件的磁盘路径D:/abc/1.jpg,不是存文件本身
六, 字段约束
使用的时间: 通常在设计表创建表时就已经确定了
–1,非空约束
哪个字段添加了非空约束,从此,字段值不能为空,使用not null
mysql> create table b( -> password varchar(100) not null #给字段添加非空约束 -> ); Query OK, 0 rows affected (0.01 sec) mysql> insert into b values('abc'); #password字段设置了值,执行OK Query OK, 1 row affected (0.00 sec) mysql> insert into b values(null); #password字段值不能设置成null,否则不符合非空约束啦,报错! ERROR 1048 (23000): Column 'password' cannot be null
–2,主键约束
每个表都应该设计主键 , 主键是每条记录/数据的唯一标识.现象是: 字段的值必须唯一且不能为空,使用primary key
–3,唯一约束
哪个字段添加了唯一约束,从此,字段值不能相同
一,字段约束
–1,唯一约束
哪个字段添加了唯一约束,从此,字段值不能相同,使用unique
C:\Users\WangYiBo>mysql -uroot -proot #使用用户名root和密码root来连接数据库 mysql> show databases; #展示所有数据库 mysql> use cgb210901; #使用指定的数据库 mysql> show tables; #展示所有表 #唯一约束:添加后,字段值不能重复 CREATE TABLE d( #创建表 tel CHAR(11) UNIQUE #唯一约束 #字段名称 字段类型(字段长度) ); INSERT INTO d VALUES('12345678901'); #成功 INSERT INTO d VALUES('12345678901'); #报错,值相同啦. #Duplicate entry '12345678901' for key 1
练习:
mysql> create table e( #创建表 -> password varchar(10) not null unique #字段名称 字段类型(字段长度) 非空约束 唯一约束 -> ); Query OK, 0 rows affected (0.01 sec) mysql> insert into e values(null); #报错,字段值不符合非空约束 ERROR 1048 (23000): Column 'password' cannot be null mysql> insert into e values('123'); #正确的,因为满足了非空约束和唯一约束 Query OK, 1 row affected (0.00 sec) mysql> insert into e values('123');#报错,字段值不符合唯一约束 ERROR 1062 (23000): Duplicate entry '123' for key 1 mysql>
–2,主键约束
每个表都应该设计主键 , 主键是每条记录/数据的唯一标识.现象是: 字段的值必须唯一且不能为空,使用primary key主键自增策略: 使用auto_increment,让主键的值交给数据库自动维护
mysql> create table g( #字段名 字段类型 主键 自增 -> id int primary key auto_increment, -> name varchar(100), -> age int -> ); Query OK, 0 rows affected (0.00 sec) #主键的值不用自己设置null,数据库会自增 mysql> insert into g values(null,'tony',18); Query OK, 1 row affected (0.00 sec) mysql> select * from g; +----+------+------+ | id | name | age | +----+------+------+ | 1 | tony | 18 | +----+------+------+ 1 row in set (0.00 sec)
二,基本函数
–1,工具的使用
1,找到.exe程序,双击,输入了密码,点击连接,就可以了2,创建库: 右键-新建数据库-设置数据库名-选字符集utf8-确定3,创建表: 右键-创建表-输入字段名字段类型字段长度字段约束-创建表-输入表名-确定4,添加表里的记录,如下图
–2,准备数据
CREATE TABLE dept( deptno int primary key auto_increment , dname VARCHAR(20), loc VARCHAR(13) ); INSERT INTO dept VALUES(null,'accounting','一区'); INSERT INTO dept VALUES(null,'research','二区'); INSERT INTO dept VALUES(null,'operations','二区'); CREATE TABLE emp( empno int primary key auto_increment, ename VARCHAR(10), job VARCHAR(10), mgr int, hiredate DATE, sal double, comm NUMERIC(7,2), deptno int ); INSERT INTO emp VALUES(100,'jack','副总',NULL,'2002-05-1',90000,NULL,1); INSERT INTO emp VALUES(200,'tony','总监',100,'2015-02-02',10000,2000,2); INSERT INTO emp VALUES(300,'hana','经理',200,'2017-02-02',8000,1000,2); INSERT INTO emp VALUES(400,'leo','员工',300,'2019-02-22',3000,200.12,2); INSERT INTO emp VALUES(500,'liu','员工',300,'2019-03-19',3500,200.58,2);
–3,基础函数的使用
lower–全转小写upper–全转大写length–求长度substr–截取子串concat–拼接字符串replace–替换
#SQL中的函数 #SELECT 列名1,列名2 FROM 表名 SELECT * FROM emp #查询所有列 SELECT ename FROM emp #查名字 SELECT empno,ename FROM emp #查编号和名字 SELECT empno a FROM emp #给列设置别名 #UPPER转大写 列名 列的别名 SELECT ename,UPPER(ename) a FROM emp #lower转小写 列名 SELECT ename,LOWER(ename) FROM emp #length求长度,根据u8,一个字母或数字长度为1,一个汉字长度为3 SELECT ename,LENGTH(ename) FROM emp#查ename的长度 SELECT ename,job,LENGTH(job) FROM emp#查job的长度 #substr截取子串 #SUBSTR(a,b)-a是截取谁b是从哪个字符开始 SELECT ename,SUBSTR(ename,2) FROM emp #SUBSTR(a,b,c)-a是截取谁b是从哪个字符开始c是截取的长度 SELECT ename,SUBSTR(ename,2,2) FROM emp #concat(a,b,...)拼串-a是列名b是要拼接的数据 #...是指可以有多个参数 SELECT ename,CONCAT(ename,"hello",1,2) FROM emp #替换replace(a,b,c)-a是字段名把b换成c SELECT ename,REPLACE(ename,'a','666') FROM emp #ifnull(a,b)-a是字段名b是要换成的值 SELECT comm,IFNULL(comm,100) FROM emp#如果是null就换成100 #查询每个员工的月薪 SELECT sal,comm,sal+IFNULL(comm,0) FROM emp #对小数的函数: SELECT comm,ROUND(comm) FROM emp#四舍五入,取整 SELECT comm,ROUND(comm,1) FROM emp#四舍五入,保留1位小数 SELECT comm,CEIL(comm) FROM emp#ceil向上取整 SELECT comm,FLOOR(comm) FROM emp#floor向下取整 #对日期数据的函数: SELECT NOW() #当前时间 SELECT YEAR('1999-1-1') SELECT YEAR( NOW() )#当前年 SELECT MONTH( NOW() ),DAY( NOW() )#当前月,当前日 #hour时 minute分 second秒 SELECT HOUR( NOW() ),MINUTE( NOW() ),SECOND( NOW() ) #生成一个32位的随机数 SELECT UUID() #\表示转义符号,把'当做普通的字符在使用而不是字符串的标记 SELECT 'xi\'an'
三,条件查询
–1,基础语法
#条件查询 #1.去重distinct SELECT DISTINCT loc FROM dept #查询部门地址 #2.where连接查询的条件 #select 字段名 from 表名 where 字段名=字段值 #练习1:查询编号为1的部门信息 SELECT * FROM dept WHERE deptno=1 #练习2:查询编号>1的部门信息 SELECT * FROM dept WHERE deptno>1 SELECT * FROM dept WHERE deptno<2 SELECT * FROM dept WHERE deptno!=1 SELECT * FROM dept WHERE deptno<>1 #表示!=,同上 #练习3:查询名称是research的部门编号 SELECT deptno FROM dept WHERE dname='research' #练习4:查询地址在二区编号为3的部门名称 SELECT dname FROM dept WHERE loc='二区' AND deptno=3 #并且关系 #练习5:查询部门名称是accounting/research的部门地址 SELECT loc FROM dept WHERE #dname='accounting' or dname='research'#或者关系 dname IN('accounting','research')#in子句in(a,b),同上 #练习6:查询编号是1 2 3的部门信息 SELECT * FROM dept WHERE deptno IN(1,2,3) #3.like--模糊查询,%通配符0~n个字符,_通配符1个字符 #练习1:查询名字包含a的员工信息 SELECT * FROM emp WHERE ename LIKE '%a%' #包含a #ename LIKE 'a_' #a后只有一个,了解
一,MySQL数据的备份
–1,用工具直接备份就行
1,如果是SQL,直接ctrl s保存就行2,也可以把表或者数据库一整个导出–右键–导出–以SQL转储文件…
–2,练习
#练习SQL语句: #练习1:查询部门地址在二区的部门名称 SELECT dname FROM dept WHERE loc='二区' #练习2:查询部门地址在二区名字里有o的部门编号 SELECT deptno FROM dept WHERE loc='二区' AND dname LIKE '%o%' #练习3:查询名字以l开头的员工岗位并去重 SELECT DISTINCT job FROM emp WHERE ename LIKE 'l%' #练习4:查询15年到19年入职的员工姓名和岗位 SELECT ename,job FROM emp WHERE #year(hiredate)>=2015 and YEAR(hiredate)<=2019 hiredate>='2015-1-1' AND hiredate<='2019-12-31' #练习5:查询副总的年薪 SELECT sal*12+IFNULL(comm,0)*12 FROM emp WHERE job='副总'
二,条件查询
–1,null
#1.null的数据用is /is not关键字来过滤 #练习1:查询没有奖金的员工信息 SELECT * FROM emp WHERE comm IS NULL #练习2:查询有奖金的员工信息 SELECT * FROM emp WHERE comm IS NOT NULL
–2,between and
#练习3:查询工资5000~10000的员工信息 SELECT * FROM emp WHERE #sal>=5000 and sal<10000 sal BETWEEN 5000 AND 10000 #[5000,10000] #练习4:查询2019年入职的员工姓名 SELECT ename FROM emp WHERE #hiredate between '2019-1-1' and '2019-12-31' YEAR(hiredate)=2019
–3,limit分页
#练习5:展示前两条员工数据 SELECT * FROM emp LIMIT 2 #只取前n条 SELECT * FROM emp LIMIT 0,2 #从0+1的数据开始,总共展示2条 #练习6:查询岗位是员工的第一条记录 SELECT * FROM emp WHERE job='员工' LIMIT 0,1#limit通常放最后
–4,order by
#4.order by排序,按照字典顺序排,默认是升序ASC #练习7:按照工资排序 SELECT * FROM emp ORDER BY sal DESC #按数值降序 #练习8:按照名字排序 SELECT * FROM emp ORDER BY ename DESC #按字母降序 #练习9:按照岗位排序 SELECT * FROM emp ORDER BY job ASC #按汉字对应的编号升序 #练习10:查询15年到19年入职的员工信息只取前两条并按照工资升序排 SELECT * FROM emp WHERE YEAR(hiredate) BETWEEN 2015 AND 2019 #区间[2015,2019] ORDER BY sal #排序,默认的升序 LIMIT 2 #分页,只取前两条,通常放最后
–5,统计案例
#统计需求 #练习1:统计每个员工的年薪 SELECT sal,comm,sal*16+IFNULL(comm,0)*16 FROM emp #练习2:统计19年以前入职的员工信息 SELECT * FROM emp WHERE YEAR(hiredate)<2019
三,聚合函数–1,概述基础函数:upper lower length concat substr replace ifnull now()/date()/year()…聚合函数:把一个字段的值聚合起来,进行获取最大值,最小值,平均数,求和,求个数…max() min() sum() avg() count()
–2,测试
#聚合函数max min sum avg count #最大值 最小值 求和 求平均数 SELECT MAX(sal),MIN(sal),SUM(sal),AVG(sal) FROM emp #求总记录数 SELECT COUNT(*) FROM emp#低效 SELECT COUNT(1) FROM emp#高效 SELECT COUNT(sal) FROM emp#了解,不推荐 SELECT COUNT(comm) FROM emp#按照字段统计时不统计null #练习1:统计名字里包含a的总记录数 SELECT COUNT(1) FROM emp WHERE ename LIKE '%a%' #练习2:统计19年入职的员工里的最高薪 SELECT MAX(sal) FROM emp WHERE YEAR(hiredate)=2019 #练习3:统计2号部门的平均薪资 SELECT AVG(sal) FROM emp WHERE deptno=2 #练习4:统计2号部门一年的工资支出总数 SELECT SUM(sal)*12 FROM emp WHERE deptno=2
四,分组
把表里的所有数据 按照 合理的维度 分成不同的组
–1,group by
#分组:使用group by #练习1:统计每个部门的平均薪资 SELECT AVG(sal),deptno FROM emp GROUP BY deptno #按照部门分组 #练习2:统计每个部门的最高薪资 SELECT MAX(sal),deptno FROM emp #口诀1:查询结果中出现了混合列,包括着聚合列和非聚合列,必须分组 GROUP BY deptno #口诀2:通常按照非聚合列分组 #练习3:统计每年入职的总人数 SELECT YEAR(hiredate),COUNT(1) FROM emp GROUP BY YEAR(hiredate) #练习4:统计每个岗位的平均薪资 SELECT AVG(sal),job FROM emp GROUP BY job
–2,having
把分组后的数据还想继续过滤,使用group by的固定搭配having
#having #练习5:统计每个岗位的平均薪资,而且只要>=10000的 SELECT AVG(sal) a,job FROM emp #where AVG(sal)>=10000 #注意:::where里不能用别名,也不能出现聚合函数 GROUP BY job #按照非聚合列分组 HAVING a>=10000 #分组后的过滤,a是别名 #练习6:统计每年入职的人数,而且只要19年的 SELECT YEAR(hiredate) ,COUNT(1) FROM emp WHERE YEAR(hiredate)=2019 GROUP BY YEAR(hiredate) #分组 #having a=2019 #分组后的过滤 # where比having 高效,因为执行时机要早一些
五,事务–1,概述1,数据库事务用来保证 多个SQL 要么全成功,要么全失败.英文叫transaction.MySQL数据库会自动管理事务,Oracle数据库需要程序员管理事务.MySQL也允许程序员手动管理事务2,事务的四大特征:ACID原子性: 把多条SQL看做一个原子密不可分,要么全成功,要么全失败一致性: 保证数据守恒,将来广泛的应用到分布式系统里隔离性: MySQL数据库可以支持高并发,可能会有数据安全的隐患,也有复杂的隔离级别持久性: 对数据库的操作增删改,有持久影响3,隔离级别:read uncommitted读未提交:性能好,但是安全性差read commited读已提交:是Oracle数据库默认的隔离级别,性能较差,但是安全性较好repeatable read可重复读:是MySQL数据库默认的隔离级别,性能再差一点,但是安全性特别好Serializable串行化:性能非常差,但是安全性比较好也可以查:SELECT @@tx_isolation;
–2,测试窗口1:
mysql> use cgb210901; #使用数据库,准备往表里插入数据 mysql> start transaction; #开启事务start transaction mysql> insert into g values(null,'jack',20);#多条执行增删改的SQL mysql> commit;#提交事务commit,不提交的话别人查不到的,没有持久影响
窗口2:
mysql> use cgb210901; mysql> select * from g; #窗口1不执行commit,这里永远查不到的
一,SQL练习
–1,测试
#练习1:依次按照多个条件排序,asc升序,desc降序 SELECT * FROM emp ORDER BY sal DESC,ename ASC SELECT * FROM emp ORDER BY deptno DESC,ename ASC #练习2:统计每个岗位的员工人数 SELECT job,COUNT(1) FROM emp #什么时候必须需要分组?查询时出现了混合列 #按照啥分组?按照非聚合列分组 GROUP BY job #练习3:统计每个部门包含re的部门编号 SELECT deptno FROM dept WHERE dname LIKE 're%' #以re开始的 GROUP BY loc #合理的分组 #练习4:统计每年入职的员工的最高薪资,只要>5000的 SELECT MAX(sal) a,YEAR(hiredate) b FROM emp GROUP BY b #分组,除了where里不能用别名其他位置都行 #having里可用聚合函数where不能 HAVING a>5000 #分组后过滤 #练习5:查询所有员工的最高薪-用分页 SELECT MAX(sal) FROM emp SELECT sal FROM emp ORDER BY sal DESC LIMIT 1 #创建user表(id,name,pwd),并插入数据 CREATE TABLE USER( id INT PRIMARY KEY AUTO_INCREMENT,#主键自增 NAME VARCHAR(20), pwd VARCHAR(10) ) INSERT INTO USER VALUES(NULL,'jack',"123") INSERT INTO USER VALUES(NULL,'rose',"456") #对上面SQL中使用的事务进行优化,因为上面的SQL需要两个事务的开启和关闭 #下面这种SQL也叫作批量插入的功能,高效,多次插入使用同一个事务 INSERT INTO USER VALUES (NULL,'tony',"123"),(NULL,'jerry',"456")
二,字段约束
–1,默认约束
哪个字段添加了默认约束,从此字段值的就有了默认值
#默认约束:给字段设置默认值而不是默认的null,使用default CREATE TABLE a( id INT PRIMARY KEY AUTO_INCREMENT, sex VARCHAR(10) DEFAULT '男'#默认约束 )
–2,检查约束
哪个字段添加了检查约束,从此,字段值必须符合检查的条件才可以
#检查约束:使用check,了解 CREATE TABLE b( id INT PRIMARY KEY AUTO_INCREMENT, age INT, CHECK(age<200 AND age>0)#检查约束 #数据要满足检查条件才可以 )
! --3,外键约束
使用明确的一段代码表示,两个表之间的关系
#外键约束:先创建外键+再使用外键 CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT, sex CHAR(10) DEFAULT '男'#默认约束 ) CREATE TABLE tb_user_address( user_id INT PRIMARY KEY, address VARCHAR(200), #foreign key(当前表的主键名) references 对方表(对方的主键) FOREIGN KEY(user_id) REFERENCES tb_user(id)#1.创建外键 ) #2.使用外键 #约束的情况1:子表的主键值 必须 取自 主表的主键值 #约束的情况2:主表的记录不能随便删,要保证没有被子表使用才可以删
三,多表联查
–1,准备表和数据
#多表联查: #1.课程表 CREATE TABLE courses( cno VARCHAR(5) NOT NULL, cname VARCHAR(10) NOT NULL, tno VARCHAR(3) NOT NULL, PRIMARY KEY (cno) #单独设置主键 ); #2.得分表 CREATE TABLE scores( sno VARCHAR(3) NOT NULL, cno VARCHAR(5) NOT NULL, degree NUMERIC(10,1) NOT NULL, PRIMARY KEY (sno, cno) #联合主键,了解 ); #3.学生表 CREATE TABLE students( sno VARCHAR(3) NOT NULL, sname VARCHAR(4) NOT NULL, ssex VARCHAR(2) NOT NULL, sbirthday DATETIME, class VARCHAR(5), PRIMARY KEY (sno)#主键 ); #4.老师表 CREATE TABLE teachers( tno VARCHAR(3) NOT NULL, tname VARCHAR(4), tsex VARCHAR(2), tbirthday DATETIME, prof VARCHAR(6), depart VARCHAR(10), PRIMARY KEY (tno) ); #5.插入数据 INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,'1977-09-01',95033); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,'1975-10-02',95031); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,'1976-01-23',95033); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,'1976-02-20',95033); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,'1975-02-10',95031); INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,'1974-06-03',95031); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,'易天','男','1958-12-02','副教授','计算机系'); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,'王旭','男','1969-03-12','讲师','电子工程系'); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (825,'李萍','女','1972-05-05','助教','计算机系'); INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,'陈冰','女','1977-08-14','助教','电子工程系'); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('6-166' ,'模拟电路' ,856); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('6-106' ,'概率论' ,831); INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,831); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (103,'3-245',86); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (105,'3-245',75); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (109,'3-245',68); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (103,'3-105',92); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (105,'3-105',88); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (109,'3-105',76); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (101,'3-105',64); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (107,'3-105',91); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (108,'3-105',78); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (101,'6-166',85); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (107,'6-106',79); INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (108,'6-166',81);
–2,方式1:笛卡尔积
#多表联查,三种方式: #方式1:笛卡尔积,用逗号连接多张表 SELECT * FROM dept,emp #产生了大量的结果集 SELECT * FROM dept,emp #逗号隔开表 #描述两张表的关系 表名.字段名 WHERE dept.deptno = emp.deptno #练习1:查询部门名称和员工表的所有数据 SELECT dept.dname,emp.* FROM dept,emp #逗号隔开表名 WHERE dept.deptno=emp.deptno #表关系 #练习2:查询部门的所有和员工的名字,只要部门名称叫accounting的 SELECT dept.*,emp.ename FROM dept,emp #逗号隔开表名 WHERE dept.deptno=emp.deptno #表关系 AND dept.dname='accounting' #业务条件 #练习3:查询所有部门和员工的数据,条件是部门编号>1的 SELECT * FROM dept,emp WHERE dept.deptno=emp.deptno#表关系 AND emp.deptno>1 #业务条件 #练习4:查询易天老师能讲的课程名称 SELECT coursesame FROM teachers,courses WHERE courses.tno=teachers.tno #表关系 AND teachers.tname='易天' #业务条件 #练习5:查询计算机导论课程的总分 SELECT SUM(degree) FROM courses,scores WHERE courseso=scoreso #表关系 AND coursesame='计算机导论' #业务条件
–3,方式2:连接查询
#方式2:连接查询,用join连接多张表 SELECT * FROM dept JOIN emp #用join连接多张表 SELECT * FROM dept JOIN emp ON dept.deptno=emp.deptno #表关系 #练习1:查询部门名称和员工表的所有数据 SELECT dept.dname,emp.* FROM dept JOIN emp ON dept.deptno=emp.deptno#表关系 #练习2:查询部门的所有和员工的名字,只要部门名称叫accounting的 SELECT dept.*,emp.ename FROM emp JOIN dept ON dept.deptno=emp.deptno #表关系 WHERE dept.dname='accounting' #业务条件 #练习3:查询所有部门和员工的数据,条件是部门编号>1的 SELECT * FROM dept JOIN emp ON dept.deptno=emp.deptno #表关系 WHERE emp.deptno>1 #业务条件 #练习4:查询易天老师能讲的课程名称 SELECT coursesame FROM courses JOIN teachers ON courses.tno=teachers.tno #表关系 WHERE teachers.tname='易天' #业务条件 #练习5:查询计算机导论课程的总分 SELECT SUM(scores.degree) FROM courses JOIN scores ON courseso=scoreso #表关系 WHERE coursesame='计算机导论' #业务条件 #测试 三种连接的区别???? #有两种连接查询:内连接和外连接(左外连接,右外连接) #inner join:取两张表的交集 #left join:左边表的所有和右边满足条件的 #right join:右边表的所有和左边满足条件的 #内连接:取交集,取左右表都满足条件的 SELECT * FROM dept INNER JOIN emp ON dept.deptno=emp.deptno #左连接:取左表的所有和右表满足条件的不满足的都是null SELECT * FROM dept LEFT JOIN emp ON dept.deptno=emp.deptno #右连接:取右表的所有和左表满足条件的不满足的都是null SELECT * FROM emp RIGHT JOIN dept ON dept.deptno=emp.deptno #连接查询的效率:小表驱动大表, #把结构简单或者数据量少的表放在前面作为左表 #因为左表会查所有数据,右表只查满足了条件的那些数据
–4,方式3:子查询
在这里插入代码片
SQL的作业:
用两种多表联查的方式完成以下练习:
练习1:查询research部门的所有员工姓名和工资练习2:查询jack所在的部门信息练习3:查询总监的部门信息练习4:查询李军的平均分练习5:查询陈冰能讲的课程名
一,多表联查
–1,方式3:子查询
也叫嵌套查询,把上次的查询结果,当这次查询的条件来用
#方式3:子查询:要分析第一次查啥,第二次查啥 #练习1:查询计算机导论课程的总分 #第一次查:根据cname查cno- 3-105 SELECT cno FROM courses WHERE cname='计算机导论' #第二次查:根据cno查degree SELECT SUM(degree) FROM scores WHERE cno='3-105' #改成子查询:嵌套查询 SELECT SUM(degree) FROM scores WHERE cno=( SELECT cno FROM courses WHERE cname='计算机导论' ) #练习2:查询易天老师能讲的课程名称 #第一次查:根据tname查tno 804 SELECT tno FROM teachers WHERE tname='易天' #第二次查:根据tno查cname SELECT cname FROM courses WHERE tno=804 #改造 (子查询) SELECT cname FROM courses WHERE tno=( SELECT tno FROM teachers WHERE tname='易天' ) #练习3:查询accounting部门的员工的名字 SELECT ename FROM emp WHERE deptno IN( SELECT deptno FROM dept WHERE loc='二区' ) #练习4:查询高于平均工资的员工信息 SELECT * FROM emp WHERE sal>( SELECT AVG(sal) FROM emp #平均工资 )
–练习1:查询research部门的所有员工姓名和工资
#练习1:查询research部门的所有员工姓名和工资 #方式3:子查询 SELECT emp.ename,emp.sal FROM emp WHERE deptno=( SELECT deptno FROM dept WHERE dname='research' ) #方式1:笛卡尔积 SELECT emp.ename,emp.sal FROM emp,dept WHERE emp.deptno=dept.deptno#表关系 AND dept.dname='research'#业务条件 #方式2:连接查询 SELECT emp.ename,emp.sal FROM dept INNER JOIN emp ON emp.deptno=dept.deptno#表关系 WHERE dept.dname='research'#业务条件
–练习2:查询research部门的所有员工姓名和工资
#练习2:查询jack所在的部门信息 #方式3:子查询 SELECT * FROM dept WHERE deptno=( SELECT deptno FROM emp WHERE ename='jack' ) #方式1:笛卡尔积 SELECT dept.* FROM dept,emp WHERE emp.deptno=dept.deptno#表关系 AND emp.ename='jack'#业务条件 #方式2:连接查询 SELECT dept.* FROM dept JOIN emp ON emp.deptno=dept.deptno#表关系 WHERE emp.ename='jack'#业务条件
–练习3:查询总监的部门信息
#练习3:查询总监的部门信息 #方式1:笛卡尔积 SELECT dept.* FROM dept,emp WHERE emp.deptno=dept.deptno#表关系 AND emp.job='总监'#业务条件 #方式2:连接查询 SELECT dept.* FROM dept JOIN emp ON emp.deptno=dept.deptno#表关系 WHERE emp.job='总监'#业务条件 #方式3:子查询 SELECT dept.* FROM dept WHERE deptno=( SELECT deptno FROM emp WHERE job='总监' )
–练习4:查询李军的平均分
#练习4:查询李军的平均分 #方式3:子查询 SELECT AVG(degree) FROM scores WHERE sno=( SELECT sno FROM students WHERE sname='李军' ) #方式1:笛卡尔积 SELECT AVG(scores.degree) FROM students,scores WHERE students.sno=scores.sno#表关系 AND students.sname='李军'#业务条件 #方式2:连接查询 SELECT AVG(scores.degree) FROM students JOIN scores ON students.sno=scores.sno#表关系 WHERE students.sname='李军'#业务条件
–练习5:查询陈冰能讲的课程名
#练习5:查询陈冰能讲的课程名 #方式3:子查询 SELECT coursesame FROM courses WHERE tno=( SELECT tno FROM teachers WHERE tname='陈冰' ) #方式1:笛卡尔积 SELECT coursesame FROM teachers,courses WHERE teachers.tno=courses.tno #表关系 AND teachers.tname='陈冰'#业务条件 #方式2:连接查询 SELECT coursesame FROM teachers JOIN courses ON teachers.tno=courses.tno #表关系 WHERE teachers.tname='陈冰'#业务条件
二,数据库的扩展–1,索引概述好处是: 提高查询效率 坏处是: 本身是单独的空间来存储分类:1,单值索引:一个索引只包含一列2,唯一索引:一个索引只包含一列,值不能重复3,复合索引:一个索引包含多个列
单值索引create index 索引名 on 表名(字段名)–一个索引只包含一个列
#索引:创建索引+使用索引 #1.查看索引 SHOW INDEX FROM emp #2.创建 单值索引:一个索引包含一列 CREATE INDEX nameindex ON emp(ename) #3.使用索引,发起select语句 SELECT * FROM emp WHERE ename='jack' #4.检查SQL的执行效率(观察用没用索引) EXPLAIN#解释说明SQL的执行计划/性能(观察possible keys的值) SELECT * FROM emp WHERE ename='jack' #练习: CREATE INDEX jobindex ON emp(job)#单值索引 SHOW INDEX FROM emp#查看索引 EXPLAIN SELECT * FROM emp WHERE job='员工'#检查是否使用了索引
唯一索引
create unique index 索引名 on 表名(字段名)一个索引只包含一个列,列的值不能重复
#5.创建 唯一索引:一个索引包含一列,值要唯一 CREATE UNIQUE INDEX locindex ON dept(loc) #添加失败,因为loc的值有重复的 CREATE UNIQUE INDEX dnameindex ON dept(dname) SHOW INDEX FROM dept#查看索引 #使用索引 EXPLAIN SELECT * FROM dept WHERE dname='research'
复合索引
create index 索引名 on 表名(字段名1,字段名2,字段名3…)一个索引包含多个字段,用时要遵循最左原则,否则复合索引失效失效的情况:按照 2 3 23 ,没有包含最左边的
#6.创建 复合索引: CREATE INDEX fuheindex ON emp(ename,job,deptno) SHOW INDEX FROM emp #用时可能会让复合索引失效--必须遵循最左原则(必须包含着最左边的) EXPLAIN SELECT * FROM emp WHERE ename='jack' #生效 EXPLAIN SELECT * FROM emp WHERE job='总监' #失效 EXPLAIN SELECT * FROM emp WHERE ename='jack' AND job='副总' #生效 EXPLAIN SELECT * FROM emp WHERE job='副总'AND ename='jack'#生效
删除索引
alter table 表名 drop index 索引名show index from 表名使用explain关键字检查,SQL中是否使用了索引(检查SQL的执行性能)
#7.删除索引 SHOW INDEX FROM emp ALTER TABLE emp DROP INDEX jobindex
总结缺点:索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引
–2,视图概念是一个特殊的表,存了上次查询的结果.
测试
#视图:创建视图+使用视图 #练习:查询名字里有a的员工信息 SELECT * FROM emp WHERE ename LIKE '%a%' #1.创建视图:create view 视图名 as select语句 CREATE VIEW empview AS SELECT * FROM emp WHERE ename LIKE '%a%' #2.使用视图 SELECT * FROM empview #好处:提高了SQL的复用性+屏蔽了业务表的复杂性+数据共享 #坏处:是一张单独的表存了业务表的数据造成了数据重复+无法优化
–3,SQL优化1, 用字段名称代替*2, where里: 尽量用and不用or , 尽量用=不用!= <> , 条件越精确越好 ,3, 表设计:表里的索引不要超过5个 , 给where后或者order by经常用的字段加索引 ,复合索引要遵循最左特性不然就失效了 , 索引表及时删掉多余的索引用varchar代替char , 用数字代替字符串 , 用默认值代替null4, 批量处理:批量查,批量的删,最好使用分页详情见课件:数据库从入门到精通03_cgblpx的博客-CSDN博客
–4,三范式数据库的专业术语,用来设计表要遵循的原则,范式NF分为六大范式,通常只要遵循前三大范式就可以了第一范式1NF: 表里的字段 不可分割,是指字段的值就是最小单位简而言之,第一范式就是无重复的列第二范式2NF: 基于第一范式的基础上产生的,指表里都应该设计主键/主关键字/主属性每行都应该围绕着主键来 描述数据总之,第二范式就是非主属性完全依赖于主关键字第三范式3NF: 基于第二范式的基础上产生的,是指表里的字段之间尽量不要产生依赖,总之,第三范式就是属性不依赖于其它非主属性
一,JDBC
–1,概述sun公司提供的一套 java操作数据库的标准专门用来完成 java 和 数据库 交互的技术,全称是: java database connectivity
–2,使用步骤1, 提供了丰富的工具类jar包,项目中导入jar包2, 连接数据库: 端口号3306 库名cgb2109 用户名root 密码root3, 写SQL4, 处理数据库返回给java的结果–3,导入jar包1,选用哪个版本的jar包,要看你安装的数据库的版本
2,导入jar包
1, 复制粘贴到工程里2, 选中jar包,右键-add as libarary… ok
–4,入门案例
package cn.tedu.jdbc; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; //测试jdbc public class Test1 { //junit单元测试:@Test public void 没有参数 @Test public void get() throws Exception { //1,注册驱动 --参数是类的全路径 Class.forName("com.mysql.jdbc.Driver");//5版本的jar包 //Class.forName("com.mysql.cj.jdbc.Driver");//8版本的jar包 //2,连接数据库,并返回了数据库的连接Connection String url = "jdbc:mysql://localhost:3306/cgb2109"; //遵循的协议://本机ip地址:端口号/数据库名 Connection c = DriverManager.getConnection(url,"root","root"); //3,获取传输器 Statement s = c.createStatement(); //4,执行SQL语句 //需求:利用java查询数据库中dpet表的所有数据 ResultSet r = s.executeQuery("select * from dept");//执行查询的SQL语句 //s.executeUpdate()执行增删改的SQL语句 //5,处理结果 while( r.next() ){//next()判断有没有数据 //getXxx()获取不同类型的数据 // r.getInt(1);//根据列的编号获取列的值 int a=r.getInt("deptno");//根据列名获取列的值 String b = r.getString("dname"); String d = r.getString(3); System.out.println(a+b+d); } //6,释放资源 r.close();//结果集 s.close();//传输器 c.close();//连接器 } }
–5,总结
二,JDBC的练习
–1,查询courses表的所有数据
package cn.tedu.jdbc; import org.junit.Test; import java.sql.*; //测试jdbc public class Test1 { //需求:查询courses表的所有数据 @Test public void get2() throws Exception{ //1,注册驱动 --参数是类的全路径 Class.forName("com.mysql.jdbc.Driver"); //2,连接数据库,并返回了数据库的连接Connection String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url,"root","root"); //3,获取传输器 Statement s = c.createStatement(); //4,执行SQL ResultSet r = s.executeQuery("select * from courses");//查询SQL //5,处理结果 while(r.next()){//判断有没有数据 //表里有三列,循环三次就行了 for (int i = 1; i <4 ; i++) { //获取数据getXxx()--getObject()更通用可以获取任意类型的数据 Object a = r.getObject(i);//i是列的索引1 2 3..列 System.out.println(a);//打印每列的值 } } //6,释放资源 r.close(); s.close(); c.close(); } }
–2,向dept表中插入数据
//需求:向dept表中插入数据 @Test public void add() throws Exception{ //1,注册驱动 --参数是类的全路径 Class.forName("com.mysql.jdbc.Driver"); //2,连接数据库,并返回了数据库的连接Connection // String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8"; String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";//简写 Connection c = DriverManager.getConnection(url,"root","root"); //3,获取传输器 Statement s = c.createStatement(); //4,执行SQL int rows = s.executeUpdate( "insert into dept values(null,'java开发',\"北京\")"); //5,处理结果 //executeQuery查询,会把结果返回给ResultSet需要遍历,,, //executeUpdate增删改,会返回对数据库的影响行数,,,通常不处理 //6,释放资源 s.close(); c.close(); }
–3,模拟用户登录
1, 让用户输入用户名 和 密码
2, 在数据库里 准备表
CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `name` varchar(20) default NULL, `pwd` varchar(10) default NULL, PRIMARY KEY (`id`) )
3, 利用JDBC查库,发起select语句
select * from user where name=‘jack’ and password=‘123’
package cn.tedu.jdbc; import org.junit.Test; import java.awt.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; //模拟用户登录 public class Test2 { //模拟用户登录 @Test public void login() throws Exception{ //1,注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2,连接数据库 String url="jdbc:mysql:///cgb2109?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); //3,获取传输器 Statement s = c.createStatement(); //4,执行SQL String sql="select * from user where name='jack' and pwd='123'"; ResultSet r = s.executeQuery(sql); //5,处理结果 if( r.next() ){//判断有数据吗?如果有数据就可以登录 System.out.println("登录成功!"); }else{//没数据,重新输入或去注册 System.out.println("登录失败,请重新输入或去注册!"); } //6,释放资源 r.close(); s.close(); c.close(); } }
一,SQL攻击
–1,模拟SQL攻击的现象
//出现了问题:SQL攻击://1,本质上就是因为SQL中出现了特殊符号#,#号在SQL中是注释的意思(测试时使用固定的用户名jack’#)//2,Statement传输器在执行SQL时遇到了SQL拼接,把#当做了注释用!!
package cn.tedu.jdbc; import org.junit.Test; import java.awt.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner; //模拟用户登录 public class Test2 { //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入 public static void main(String[] args) throws Exception{ //1,注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2,连接数据库 String url="jdbc:mysql:///cgb2109?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); //3,获取传输器 Statement s = c.createStatement(); //4,执行SQL System.out.println("请输入用户名:"); String username = new Scanner(System.in).nextLine(); System.out.println("请输入密码:"); String password = new Scanner(System.in).nextLine(); //拼接字符串: 一对儿双引号中间一对儿加号 再中间看你了 "+???+" // String sql="select * from user where name='jack' and pwd='123'"; String sql="select * from user where name='"+username+"' and pwd='"+password+"'"; ResultSet r = s.executeQuery(sql); //5,处理结果 if( r.next() ){//判断有数据吗?如果有数据就可以登录 System.out.println("登录成功!"); }else{//没数据,重新输入或去注册 System.out.println("登录失败,请重新输入或去注册!"); } //6,释放资源 r.close(); s.close(); c.close(); } }
–2,解决方案
package cn.tedu.jdbc; import org.junit.Test; import java.awt.*; import java.sql.*; import java.util.Scanner; //模拟用户登录 public class Test2 { //解决了问题:SQL攻击: //1,本质上就是因为SQL中出现了特殊符号#,当普通字符用而不是注释 //2,PreparedStatement 传输器在执行SQL时遇到了SQL拼接时直接写?占位符 //PreparedStatement好处:SQL简单,安全(解决SQL攻击),高效 //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入 public static void main(String[] args) throws Exception{ //1,注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2,连接数据库 String url="jdbc:mysql:///cgb2109?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); //3,获取传输器 // Statement s = c.createStatement();//SQL攻击问题 //4,执行SQL System.out.println("请输入用户名:"); String username = new Scanner(System.in).nextLine(); System.out.println("请输入密码:"); String password = new Scanner(System.in).nextLine(); // String sql="select * from user where name='"+username+"' and pwd='"+password+"'"; //SQL骨架,?叫占位符 String sql="select * from user where name=? and pwd=?"; //准备执行预编译的SQL //PreparedStatement好处:SQL简单,安全(解决SQL攻击),高效 PreparedStatement s = c.prepareStatement(sql); //设置SQL中的参数 s.setObject(1,username);//给第1个?设置用户名 s.setObject(2,password);//给第2个?设置用户名 ResultSet r = s.executeQuery(); //5,处理结果 if( r.next() ){//判断有数据吗?如果有数据就可以登录 System.out.println("登录成功!"); }else{//没数据,重新输入或去注册 System.out.println("登录失败,请重新输入或去注册!"); } //6,释放资源 r.close(); s.close(); c.close(); } }
–3,练习PreparedStatement
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; //需求:利用新的传输器,向dept表里插入数据 public class Test3 { public static void main(String[] args) throws Exception{ //1,注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2,获取连接 String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); //3,传输器 String sql ="insert into dept values(null,?,?)";//SQL骨架 PreparedStatement p = c.prepareStatement(sql); //设置SQL中的参数--给第几个?设置啥值 p.setObject(1,"php开发部"); p.setObject(2,"北京"); //4,执行SQL p.executeUpdate();//执行增删改的SQL,返回影响行数 //5,处理结果 //6,释放资源 p.close(); c.close(); } }
–4,扩展: 程序优化
JDBC的前两步,重复的写了很多次,优化这种现象来提高代码的复用性/高内聚.
1,创建工具类
1,提供工具类2,提供方法(封装JDBC的前两步)
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; //封装了注册驱动,获取连接. //目的:获取连接,并返回给调用者 public class JDBCUtils { /**目的:获取连接,并返回给调用者 */ static public Connection get() throws Exception{ //1,注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2,获取连接 String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); return c; //返回给调用者 } }
2,改造测试类
3,调用类里的方法
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; //需求:利用新的传输器,向dept表里插入数据 public class Test3 { public static void main(String[] args) throws Exception{ //TODO 利用工具类里封装好的方法 Connection c = JDBCUtils.get(); //3,传输器 String sql ="insert into dept values(null,?,?)";//SQL骨架 PreparedStatement p = c.prepareStatement(sql); //设置SQL中的参数--给第几个?设置啥值 p.setObject(1,"php开发部"); p.setObject(2,"北京"); //4,执行SQL p.executeUpdate();//执行增删改的SQL,返回影响行数 //5,处理结果 //6,释放资源 c.close(); p.close(); } }
3,总结
二,HTML–1,概述是超文本标记语言.网页中的元素类型可以超过文本内容标记语言: HTML中提供了大量标记/标签,开始标签和结束标签
–2,入门案例1,右键-新建项目-输入项目名称-创建2,右键-新建-HTML文件-输入文件名-创建3,保存文件-运行-运行到浏览器–选择一个能用的直接测试
<!DOCTYPE html> <!--是文档声明行,用来声明这是一个HTML文件 --> <html> <!-- HTML文件里的根元素--> <head> <!-- 网页中的头部分,优先于body加载,用来设置网页的属性--> <meta charset="utf-8"> <!-- 设置网页的编码 --> <title>你好,HTML</title> <!-- 设置网页的标题 --> </head> <body><!-- 网页的体部分,放展示的数据 --> hell o html~ hello html~ <br></br> <!-- br标签是换行 表示一个空格 --> hello html~ hello html~ hello html~ hello html~ </body> </html>
三,HTML的常见标签
–1,概述
1,输入框: 单选多选2,图片3,按钮4,视频5,超链接
–2,标题,列表,图片标签
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 标题标签</title> </head> <body> <!-- 3.图片标签 src属性用来指定图片的位置(先保证图片资源和网页在同一级目录) width属性用来指定图片的宽度,单位是像素px height属性用来指定图片的高度,单位是百分比 --> <img src="logo.png" width="30px" height="10%"/> <img src="logo.png" width="30px" height="10%"/> <!-- 2.列表标签 有序列表orderlist: ol是定义列表 li定义列表项 无序列表unorderlist: ul是定义列表 li定义列表项 --> <ul> <li>31省区市新增本土确诊65例</li> <li>神十三航天员圆满完成出舱任务</li> </ul> <ol> <li>31省区市新增本土确诊65例</li> <li>神十三航天员圆满完成出舱任务</li> </ol> <!-- 1.标题标签 h1大~h6小 自动换行 --> <h1>hello</h1> <h2>hello</h2> <h3>hello</h3> <h4>hello</h4> <h5>hello</h5> <h6>hello</h6> </body> </html>
–3,超链接,输入框标签
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 超链接标签</title> </head> <body> <!-- 2.input输入框 --> 密码输入框:<input type="password" /> 普通输入框:<input type="text" /> 数字输入框:<input type="number" /> 日历输入框:<input type="date" /> 日历输入框:<input type="week" /> 单选框:<input type="radio" />男 多选框:<input type="checkbox" />迪丽热巴 普通按钮: 没有提交数据的功能,只能点点 <input type="button" value="注册"/> <button>登录</button> 提交按钮:把用户在浏览器输入的数据提交给后端的java程序处理 <input type="submit"/> <button type="submit">提交</button> <br /> <!-- 1.超链接标签 href属性表示可以被点击 target属性表示用什么方式打开 默认值是_self当前窗口,_blank是在新窗口打开 --> <a href="http://www.baidu/" target="_blank">百度一下</a> <!-- 锚定:回到固定位置 --> <a name="top">我是顶部</a> <h1>如何套取富婆的欢心</h1> <h1>如何套取富婆的欢心</h1> <h1>如何套取富婆的欢心</h1> <h1>如何套取富婆的欢心</h1> <a href="#top">点我,回去顶部</a><!--通过#获取name属性的值--> </body> </html>
–4,表格标签
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 表格标签</title> </head> <body> <!-- 1.准备表格 结构:table里包含行tr,tr里包含列td 属性:border设置边框,width宽度,bgcolor背景色 cellspacing单元格的距离 colspan是列合并:把多个列合并成一个大列,值是指合并几个 rowspan是行合并:把多个行合并成一个大行,值是指合并几个 --> <table border="1px" width="500px" cellspacing="0px" bgcolor="greenyellow"> <tr> <td colspan="2">11</td> <td>13</td> </tr> <tr> <td>21</td> <td>22</td> <td rowspan="2">23</td> </tr> <tr> <td>31</td> <td>32</td> </tr> </table> </body> </html>
四,作业
制作两个表格
一, 表单标签
–1,用户注册表单
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 表单</title> </head> <body> <!-- 表单标签,用来提交数据 --> <form> <table bgcolor="pink" border="1px" cellspacing="0px"> <tr> <td align="center" colspan="2"> <h1>注册表单</h1> </td> </tr> <tr> <td>用户名:</td> <td> <input type="text" /> </td> </tr> <tr> <td>密码:</td> <td> <input type="password" /> </td> </tr> <tr> <td>确认密码:</td> <td> <input type="password" /> </td> </tr> <tr> <td>昵称:</td> <td> <input type="text" /> </td> </tr> <tr> <td>邮箱:</td> <td> <input type="email" /> </td> </tr> <tr> <td>性别:</td> <td> <input type="radio" />男 <input type="radio" />女 </td> </tr> <tr> <td>爱好:</td> <td> <input type="checkbox" />篮球 <input type="checkbox" />足球 <input type="checkbox" />乒乓球 </td> </tr> <tr> <td>城市:</td> <td> <!-- select是定义下拉框,option是下拉选项 --> <select> <option>-请选择-</option> <option>北京</option> <option>上海</option> <option>广州</option> </select> </td> </tr> <tr> <td>头像:</td> <td> <input type="file" /> </td> </tr> <tr> <td>验证码:</td> <td> <input type="text" /> <img src="a.png" /> <button>点我换一张</button> </td> </tr> <tr> <td>自我描述:</td> <td> <!-- textarea是文本域,用来写大段文字的 --> <textarea>在这儿写信息...</textarea> </td> </tr> <tr> <td colspan="2" align="center"> <button type="submit">提交</button> <button>重置</button> </td> </tr> </table> </form> </body> </html>
–2,提交数据的细节处理
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 表单</title> </head> <body> <!-- 表单标签,用来提交数据 1,标签:form表单,table表格,tr行,td列,th表头,h1标题, select是下拉框,option是下拉选项,textarea文本域 2,属性:type="file"是浏览文件,type="email"是邮箱,align是元素的位置 3,提交数据的要求:必须用form标签+必须有submit按钮+必须有name属性 提交的数据都在地址栏:被拼接在了?之后 http://127.0.0.1:8848/cgb2109/test6.html?user=rose&pwd=123 name属性的值=浏览器上输入的值 4,name用来收集用户从浏览器填的数据,value用来设置提交的值 5,数据提交的方式!!!: get和post get方式: 默认的就是get方式,数据拼接在地址栏中,缺点是不安全,长度受限 post方式:好处是安全,数据大小没有要求,但是数据不在地址栏展示了 6,method属性用来设置数据的提交方式默认是get, action属性用来指定是哪段java程序来处理这次提交的数据 --> <form method="post" action="#"> <table bgcolor="pink" border="1px" cellspacing="0px"> <tr> <td align="center" colspan="2"> <h1>注册表单</h1> </td> </tr> <tr> <td>用户名:</td> <td> <input type="text" name="user"/> </td> </tr> <tr> <td>密码:</td> <td> <input type="password" name="pwd"/> </td> </tr> <tr> <td>确认密码:</td> <td> <input type="password" name="repwd"/> </td> </tr> <tr> <td>昵称:</td> <td> <input type="text" name="nick"/> </td> </tr> <tr> <td>邮箱:</td> <td> <input type="email" name="mail"/> </td> </tr> <tr> <td>性别:</td> <td> <input type="radio" name="sex" value="1"/>男 <input type="radio" name="sex" value="0"/>女 </td> </tr> <tr> <td>爱好:</td> <td> <input type="checkbox" name="hobby" value="1"/>篮球 <input type="checkbox" name="hobby" value="2"/>足球 <input type="checkbox" name="hobby" value="3"/>乒乓球 </td> </tr> <tr> <td>城市:</td> <td> <!-- select是定义下拉框,option是下拉选项 --> <select name="city"> <option value="">-请选择-</option> <option value="1">北京</option> <option value="2">上海</option> <option value="3">广州</option> </select> </td> </tr> <tr> <td>头像:</td> <td> <input type="file" /> </td> </tr> <tr> <td>验证码:</td> <td> <input type="text" /> <img src="a.png" /> <button>点我换一张</button> </td> </tr> <tr> <td>自我描述:</td> <td> <!-- textarea是文本域,用来写大段文字的 --> <textarea>在这儿写信息...</textarea> </td> </tr> <tr> <td colspan="2" align="center"> <button type="submit">提交</button> <button>重置</button> </td> </tr> </table> </form> </body> </html>
–3,其他标签
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 其他标签</title> </head> <body> <!--0. 都可以包括各种数据,效果不同. 每个div独占一行, 每个p独占一行,多个span会在一行 --> <div>你好</div> <div>你好</div> <div>你好</div> <p>hello</p> <p>hello</p> <p>hello</p> <span>你好</span> <span>你好</span> <span>你好</span> <!-- 1.音频 controls属性必须有的,用来作为控制器--> <audio controls="controls"> <!-- 指定资源的位置 --> <source src="jay.mp3"></source> </audio> <!-- 2.视频 controls属性必须有的,用来作为控制器--> <video controls="controls"> <source src="b.mp4"></source> </video> </body> </html>
二,练习学生信息系统
–1,效果
–2,代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>学生信息管理系统MIS</title> </head> <body> <!-- 完成网页的制作,总结: 1,标签:form表单可以提交数据,table表格,tr行,td列,h1标题,input输入框, select下拉框,option下拉选项,button按钮,br换行 2,属性:method是form提交数据的方式,默认是get,数据在地址栏 action是form提交的数据交给哪个程序处理,#是没人处理 name是提交数据时的key,placeholder是输入框的提示, checked是默认选中,value是提交的数据的值 --> <form method="post" action="#"> <table> <tr> <td> <h1>学生信息管理系统MIS</h1> </td> </tr> <tr> <td>姓名:</td> </tr> <tr> <td> <input type="text" name="user" placeholder="输入姓名.."/> </td> </tr> <tr> <td>年龄:</td> </tr> <tr> <td> <input type="number" name="age" placeholder="输入年龄.."/> </td> </tr> <tr> <td> 性别:(单选框) <input type="radio" name="sex" value="1" checked="checked"/>男 <input type="radio" name="sex" value="0"/>女 </td> </tr> <tr> <td> 爱好:(多框) <input type="checkbox" name="hobby" value="ppq" checked="checked"/>乒乓球 <input type="checkbox" name="hobby" value="ps"/>爬山 <input type="checkbox" name="hobby" value="cg"/>唱歌 </td> </tr> <tr> <td> 学历:(下拉框) <select name="edu"> <option value="1">本科</option> <option value="2">专科</option> <option value="3">小学</option> </select> </td> </tr> <tr> <td> 入学日期:<br /> <input type="date" name="intime"/> </td> </tr> <tr> <td> <input type="submit" value="保存"/> <input type="reset" value="取消"/> </td> </tr> </table> </form> </body> </html>
三,CSS
–1,概述
CSS全称是层叠样式表,主要用来修饰HTML网页的CSS代码可以出现的位置:1,行内CSS2,内部CSS3,外部CSS语法: 选择器 { 属性名:属性值; }
–2,入门案例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 css</title> <!-- 2.内部CSS --> <style> /* 语法: 选择器 { 属性名:属性值;样式2; } */ /* 练习:把所有的p元素都设置红字 */ p{ color:red; } /* 练习:把所有的div元素都设置粉字 */ div{ color: pink; } </style> </head> <body> <!-- 1.行内CSS(优先级高),效果只作用在这一行. 属性名:属性值; color修饰文字的颜色,font-size修饰字号 --> <div style="color:green;font-size:20px;">我是div1</div> <div style="color:green;font-size:20px;">我是div2</div> <p>我是p1</p> <p>我是p2</p> <a>我是a1</a> <a>我是a2</a> </body> </html>
四,选择器!!!
方便的选中网页中的一些元素分类:简单选择器 , 复杂选择器
–1,标签名选择器
根据标签的名字,选中元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 css的选择器</title> <style> /* 1.标签名选择器:按照标签的名字选中元素 */ /* 练习0:给网页设置背景色 */ body{ background-color:#d0e4fe; } /* 练习1:把a的文字改成绿色 */ a{ color: green; } /* 练习2:把div加个边框颜色 */ div{ text-align:center;/* 文字居中 */ border: 1px solid red;/* 边框的宽度 实线 边框的颜色 */ border-radius:15px; /* 圆角边框 */ } /* 2.标签名选择器:按照标签的名字选中元素 */ </style> </head> <body> <a>我是a1</a> <a>我是a2</a> <div>我是div1</div> <div>我是div2</div> </body> </html>
–2,class选择器
使用步骤: 给元素添加class属性 + 通过.选中有class属性的元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 css的选择器</title> <style> /* 1.标签名选择器:按照标签的名字选中元素 */ /* 练习0:给网页设置背景色 */ body{ background-color:#d0e4fe; } /* 练习1:把a的文字改成绿色 */ a{ color: green; } /* 练习2:把div加个边框颜色 */ div{ text-align:center;/* 文字居中 */ border: 1px solid red;/* 边框的宽度 实线 边框的颜色 */ border-radius:15px; /* 圆角边框 */ } /* 2.class选择器:先给元素添加class属性+通过.选中元素 */ /* 练习1:把div的字号变大 */ .a{/* 选中class=a的所有元素,class的值可以相同 */ font-size: 25px;/* 字号 */ font-family: "宋体";/* 字体 */ } </style> </head> <body> <a>我是a1</a> <a>我是a2</a> <div class="a">我是div1</div> <div class="a">我是div2</div> </body> </html>
–3,id选择器
按照id属性的值来选中元素.步骤: 给元素添加id属性 + 通过#获取id属性的值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 css的选择器</title> <style> /* 1.标签名选择器:按照标签的名字选中元素 */ /* 练习0:给网页设置背景色 */ body{ background-color:#d0e4fe; } /* 练习1:把a的文字改成绿色 */ a{ color: green; } /* 练习2:把div加个边框颜色 */ div{ text-align:center;/* 文字居中 */ border: 1px solid red;/* 边框的宽度 实线 边框的颜色 */ border-radius:15px; /* 圆角边框 */ } /* 2.class选择器:先给元素添加class属性+通过.选中元素 */ /* 练习1:把div的字号变大 */ .a{/* 选中class=a的所有元素,class的值可以相同 */ font-size: 25px;/* 字号 */ font-family: "宋体";/* 字体 */ } /* 3.id选择器:先给元素添加id属性(值必须唯一)+通过#获取id的值 */ /* 练习1:把div1添加蓝色圆角边框 */ #b{/* 获取网页中id=b的元素 */ border:1px solid blue;/* 边框的宽度 实线 颜色 */ border-radius: 10px;/* 边框圆角 */ } /* 综合练习:给按钮添加背景色,选择器有好几种,优先使用id选择器选择高效 */ #c{ background-color: blue;/* 背景色 */ border: 1px dashed red;/* 边框的宽度 虚线 颜色 */ color: white;/* 文字的颜色 */ } </style> </head> <body> <a>我是a1</a> <a>我是a2</a> <div class="a" id="b">我是div1</div> <div class="a">我是div2</div> <button id="c">按钮</button> </body> </html>
–4,分组选择器
–5,属性选择器
五,作业
美化学生管理系统
一,作业
–1,美化学生管理系统
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>学生信息管理系统MIS</title> <style> .a{ width: 300px;/* 宽度 高度 */ height: 30px; } #btn1{ /* 背景色 文字的颜色 宽度 高度 */ background-color: #0000FF; border-color: #0000FF; color: white; width: 50px; height: 30px; font-size: 15px; } #btn2{ /* 背景色 文字的颜色 宽度 高度 */ background-color: hotpink; border-color: hotpink; color: white; width: 50px; height: 30px; font-size: 15px; } </style> </head> <body> <!-- 完成网页的制作,总结: 1,标签:form表单可以提交数据,table表格,tr行,td列,h1标题,input输入框, select下拉框,option下拉选项,button按钮,br换行 2,属性:method是form提交数据的方式,默认是get,数据在地址栏 action是form提交的数据交给哪个程序处理,#是没人处理 name是提交数据时的key,placeholder是输入框的提示, checked是默认选中,value是提交的数据的值 --> <form method="post" action="#"> <table> <tr> <td> <h1>学生信息管理系统MIS</h1> </td> </tr> <tr> <td>姓名:</td> </tr> <tr> <td> <input class="a" type="text" name="user" placeholder="输入姓名.."/> </td> </tr> <tr> <td>年龄:</td> </tr> <tr> <td> <input class="a" type="number" name="age" placeholder="输入年龄.."/> </td> </tr> <tr> <td> 性别:(单选框) <input type="radio" name="sex" value="1" checked="checked"/>男 <input type="radio" name="sex" value="0"/>女 </td> </tr> <tr> <td> 爱好:(多框) <input type="checkbox" name="hobby" value="ppq" checked="checked"/>乒乓球 <input type="checkbox" name="hobby" value="ps"/>爬山 <input type="checkbox" name="hobby" value="cg"/>唱歌 </td> </tr> <tr> <td> 学历:(下拉框) <select name="edu"> <option value="1">本科</option> <option value="2">专科</option> <option value="3">小学</option> </select> </td> </tr> <tr> <td> 入学日期:<br /> <input type="date" name="intime"/> </td> </tr> <tr> <td> <input id="btn1" type="submit" value="保存"/> <input id="btn2" type="reset" value="取消"/> </td> </tr> </table> </form> </body> </html>
二,CSS选择器
–1,分组选择器,属性选择器
分组选择器:选择器1,选择器2,选择器3{声明样式}属性选择器:根据属性选中元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 高级选择器</title> </head> <body> <style> /* 1.分组选择器:选择器1,选择器2,选择器3{声明样式} */ div,#a,.b{ /* 通过多种选择器选中多个元素 */ font-size: 30px;/* 字号 */ text-indent: 20px;/* 文本缩进 */ } /* 2.属性选择器:根据属性选中元素 */ [type]{/* 只要有type属性的就会被选中 */ background-color: #0000FF; } [type='text']{/* 只要type属性等于'text'的 */ background-color: #FF0000; } input[type="password"]{/*只要input,而且type属性等于'password'的 */ background-color: #FF69B4; } </style> <input type="text" placeholder="姓名"/> <input type="password" placeholder="密码"/> <div>我是div1</div> <div>我是div2</div> <div>我是div3</div> <p id="a">我是p1</p> <p class="b">我是p2</p> <p class="b">我是p3</p> <span>我是span1</span> <span>我是span1</span> <span>我是span1</span> </body> </html>
三,盒子模型
–1,概述
CSS把HTML里的元素看做是一个一个的盒子.内边距padding: 一个盒子里的现象,内容和边框的距离外边距margin: 盒子和盒子间的距离边框border:是指盒子可以设置边框
–2,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 小票</title> <style> /* 统一网页的风格 */ body{ width: 300px;/* 宽度 */ } /* 加大字号 */ .a{ font-size: 30px; } /* 文字居中 */ .b{ /* text-align:center ; */ margin-left: 80px;/* 左 内边距 */ } /* 设置首行缩进 */ #readme{ text-indent: 30px; } /* 设置图片居中 */ img{ margin-left: 20px; } /* 设置水平线: 宽度 虚线 红色*/ hr{ border:1px dashed red; } </style> </head> <body> <div>顾客联</div> <div class="a">请您留意取餐账单号</div> <div class="b">自取顾客联</div> <div>永和大王(北二环西路店)</div> <div>010-62112313</div> <div class="b">--结账单--</div> <div class="a">账单号:P00000009</div> <div>账单类型:食堂</div> <div>人数:1</div> <div>收银员:张静</div> <div>开单时间:2018-04-17 07:24:11</div> <div>结账时间:2018-04-17 07:24:22</div> <hr /> <table> <tr> <td>数量</td> <td>品项</td> <td>金额</td> </tr> <tr> <td>1</td> <td> 油条豆浆套餐<br /> 1X--油条<br /> 1X--现磨豆浆(热/甜) </td> <td>7.00</td> </tr> </table> <hr /> <table> <tr> <td width="180px">支付宝花呗一元早餐</td> <td>-3.00</td> </tr> <tr> <td>合计</td> <td>4.00</td> </tr> <tr> <td>支付宝</td> <td>1.00</td> </tr> <tr> <td>支付宝补贴</td> <td>3.00</td> </tr> </table> <hr /> 打印时间:2018-04-17 07:24:22 <hr /> <div id="readme"> 根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天有效,扫描时请保持小票平整。 </div> <div> <img src="2.png"/> </div> <div>官网:www.yonghe</div> <div>加盟热线:86-21-60769397 或 86-21-60769002</div> </body> </html>
四,HTMLCSS综合案例
–1,小票
创建1.css文件
/* 统一网页的风格 */ body{ width: 300px;/* 宽度 */ } /* 加大字号 */ .a{ font-size: 30px; } /* 文字居中 */ .b{ /* text-align:center ; */ margin-left: 80px;/* 左 内边距 */ } /* 设置首行缩进 */ #readme{ text-indent: 30px; } /* 设置图片居中 */ img{ margin-left: 20px; } /* 设置水平线: 宽度 虚线 红色*/ hr{ border:1px dashed red; }
改造html文件,引入css文件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 小票</title> <!-- link把外部CSS文件引入到这个网页中 rel是指文件的类型(stylesheet是固定值是样式表) href是指定文件的位置 --> <link rel="stylesheet" href="1.css"/> </head> <body> <div>顾客联</div> <div class="a">请您留意取餐账单号</div> <div class="b">自取顾客联</div> <div>永和大王(北二环西路店)</div> <div>010-62112313</div> <div class="b">--结账单--</div> <div class="a">账单号:P00000009</div> <div>账单类型:食堂</div> <div>人数:1</div> <div>收银员:张静</div> <div>开单时间:2018-04-17 07:24:11</div> <div>结账时间:2018-04-17 07:24:22</div> <hr /> <table> <tr> <td>数量</td> <td>品项</td> <td>金额</td> </tr> <tr> <td>1</td> <td> 油条豆浆套餐<br /> 1X--油条<br /> 1X--现磨豆浆(热/甜) </td> <td>7.00</td> </tr> </table> <hr /> <table> <tr> <td width="180px">支付宝花呗一元早餐</td> <td>-3.00</td> </tr> <tr> <td>合计</td> <td>4.00</td> </tr> <tr> <td>支付宝</td> <td>1.00</td> </tr> <tr> <td>支付宝补贴</td> <td>3.00</td> </tr> </table> <hr /> 打印时间:2018-04-17 07:24:22 <hr /> <div id="readme"> 根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天有效,扫描时请保持小票平整。 </div> <div> <img src="2.png"/> </div> <div>官网:www.yonghe</div> <div>加盟热线:86-21-60769397 或 86-21-60769002</div> </body> </html>
–2,用户注册
创建2.css文件
/* 1.修饰input框 宽度高度 内边距 外边距 字号 */ .a{ width: 330px; height: 40px; } /* 2.修饰提示文字 字号 颜色 缩进 */ .b{ font-size: 5px; color: gray; text-indent: 10px; } /* 3.立即注册的按钮 背景色 字的颜色 字号 边框的颜色 居中*/ button{ background-color: red; border-color: red; color: white; text-align: center; width: 330px; height: 50px; font-size:25px ; } /* 4.居中的用户注册 */ h1{ /* text-align: center; */ margin-left: 100px; }
创建html文件,并引入2.css文件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>用户注册</title> <!-- 引入外部的css文件 --> <link rel="stylesheet" href="2.css"/> </head> <body> <form> <table> <tr> <td> <h1>用户注册</h1> </td> </tr> <tr> <td> <input class="a" type="text" placeholder="用户名" name="user"/> </td> </tr> <tr> <td class="b">支持中文、字母、数字、“-”、“_”的组合,4-20个字符</td> </tr> <tr> <td> <input class="a" type="password" placeholder="设置密码" name="pwd"/> </td> </tr> <tr> <td class="b">建议使用数字、字母和符号两种以上的组合,6-20个字符</td> </tr> <tr> <td> <input class="a" type="password" placeholder="确认密码" name="repwd"/> </td> </tr> <tr> <td class="b">两次密码输入不一致</td> </tr> <tr> <td> <input class="a" type="number" placeholder="验证手机" name="tel"/> 或 <a href="#">验证邮箱</a> </td> </tr> <tr> <td> <input type="checkbox" /> 我已阅读并同意 <a href="#">《京淘用户注册协议》</a> </td> </tr> <tr> <td> <button type="submit">立即注册</button> </td> </tr> </table> </form> </body> </html>
五,Git–1,概述完成版本控制,可以实时上传代码到码云服务器上.日常操作:1,上传: add -> commit -> pushadd : 把即将上传的资源,从工作空间添加到本地索引commit: 把已经添加了索引的文件,从本地索引提交到本地仓库push: 把本地仓库的 推送到 Gitee上2,下载: clone/pullclone: 把Gitee上的代码下载到你的电脑里
–2,准备工作安装Git(下一步下一步就行了)去码云注册账号(记住账号密码,并激活邮箱)
一,Git–1,概述常见命令,在本地仓库执行!!! :add: 添加, 把即将上传的资源从工作空间添加到本地索引commit: 提交, 把本地索引的资源 提交给本地仓库push: 推送, 把本地仓库的资源 上传到远程仓库clone: 下载, 把远程仓库的资源 下载到你电脑上
–2,准备工作安装Git(下一步下一步就行了)去码云注册账号(记住账号密码,并激活邮箱)
–3,Git日常操作1,远程仓库:需要登录Gitee网站,在网站上创建仓库(右上角的加号–新建仓库–输入仓库名字选成开源–创建)
2,第一次上传::::在本地仓库要执行Git命令(除了touch命令不用执行)
git config --global user.name "cgblpx" #配置了全局注册的账号 git config --global user.email "2250432165@qq" #配置了全局注册的邮箱 mkdir cgb2109 #在本地仓库中创建文件夹 cd cgb2109 #进入指定的文件夹 git init #初始化了git环境 在本地仓库中自己创建文件1.txt #即将上传这个资源 git add . # 添加即将上传的全部资源(资源的名字) git commit -m "first commit" #把即将上传的资源提交到本地仓库 git remote add origin https://gitee/你的账号/你的仓库名.git #把本地仓库和远程仓库挂载 git push -u origin master #把资源从本地仓库上传到远程仓库 第一次上传必须输入账号密码! 成功后的提示: Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Writing objects: 100% (3/3), 206 bytes | 103.00 KiB/s, done.
Git
3,下载::::
直接从Gitee网站下载压缩包,或者使用clone命令来下载
#把指定账号的指定仓库的资源下载到你的电脑里 E:\workspace\gitee\cgb201901>git clone https://gitee/cgblpx/cgb201901.git
4,不是第一次上传::::
在本地仓库要执行Git命令(除了touch命令不用执行)
git add . # 添加即将上传的全部资源(资源的名字) git commit -m "first commit" #把即将上传的资源提交到本地仓库 git push -u origin master #把资源从本地仓库上传到远程仓库
二,Javascript–1,概述简称是js,是一种脚本语言,只能在浏览器中执行特点:直译式,不需要编译的过程.js是一种弱类型的语言,用来提高网页与用户的交互性事件驱动: 指JS代码以什么方式来触发执行基于对象: JS也有类似于OOP的思想,可以自己new对象脚本语言: 只能在特定场景执行的语言,JS只能在浏览器来执行JS的出现的位置:行内JS,内部JS,外部JS
–2,入门案例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 js的入门案例</title> <!-- js可以让网页动起来,基于对象,事件驱动,脚本语言 --> <!-- 2.js代码可以出现的位置:内部JS --> <script> alert(100); </script> </head> <body> <!-- 1.js代码可以出现的位置:行内JS --> <!-- 事件驱动: js代码什么方式会被触发执行--> <!-- 点击时弹框 --> <div οnclick="alert('您点击了一个div元素')">我是div1</div> <!-- 鼠标路过时弹框 --> <div οnmοuseenter="alert('您路过了一个div元素')">我是div2</div> <!-- 双击时弹框 --> <div οndblclick="alert('您双击了一个div元素')">我是div3</div> </body> </html>
三,JS语法
–1,数据类型和变量
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 数据类型</title> <script> //2,变量: 变量类型 变量名=变量值 var b = 10;//number b = 20; //number b = 1.6;//number b = true;//boolean alert(b);//true //练习:交换变量的值(首尾相连) var c = 10; var d = 20; var e = c; c = d; d = e; alert(c+","+d)//20,10 //1,数据类型:number string boolean null undefined //+两个作用:加法运算 和 拼接字符串 alert(2.4+3.6);//结果是number类型的,6 //在js中,字符串可以用单引号或者双引号引起来 alert("10"); alert('你好');//单引号也可以表示字符串 alert("10"+10);//1010 alert("10"+10+20);//101020 alert(10+20+"10");//3010 //boolean类型 alert(false); alert(true); alert(null); alert(undefined);//未被定义 var a ; alert(a);//undefined </script> </head> <body> </body> </html>
–2,运算符
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 js的运算符</title> <script> //TODO java的面试题:a=a+1; a+=1的区别??? //5,运算符typeof:用来获取数据的类型 //alert弹出框 //输出结果到控制台,f12找到浏览器里的控制台 console.log(100); console.log(typeof 100);//输出100的类型,number console.log(typeof "100");//输出100的类型,string console.log(typeof "100"+100);//输出100的类型拼接100数字,string100 //4,三元运算符: 求两个数里的大值 var e = 10; var f =5; var g = e > f ? e : f ;//记录大的值 alert(g); //3,比较运算符,描述的成立就是true,不成立就是false alert(1!=="1");//true alert(1==1);//true alert(1=="1");//true,==只比值 alert(1==="1");//false,===比类型和值 alert(1===1);//true,类型和值都是一样的 //2,复合赋值运算符 %= var d = 10; alert(d%=3);//1 // d %= 3 相当于: d = d % 3; //1,算术运算符 / % ++ -- alert(5/2);//2.5,js是弱类型的语言 alert(5%2);//取余数,1 var a=10; var b=10; var c = a+++b;//++优先级高于+,所以先结合的是a++然后再+b alert(c);//20 // alert(a++);//10 // alert(++b);//11 a = a++;//把a++的结果交给a保存 alert(a);//10 b = ++b;//把++b的结果交给b保存 alert(b);//11 </script> </head> <body> </body> </html>
四,JS语句
–1,分支结构
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 js的语句</title> <script> //2.switch...case //根据用户指定的值,提示今天是星期几 var day = prompt('请输入数据:') ; console.log(typeof day);//浏览器收到的都是string switch(day){ //break结束循环,结束case的结构 case '1' :console.log("今天是星期一");break; case "2" :console.log("今天是星期二");break; case "3" :console.log("今天是星期三");break; case "4" :console.log("今天是星期四");break; case "5" :console.log("今天是星期五");break; case "6" :console.log("今天是星期六");break; case "7" :console.log("今天是星期日");break; } //1.if...else var a = 3; //===要求类型和值都一样才是true if(a==="3"){//false console.log('ok'); }else{ console.log('no ok'); } //练习:判断成绩,判断成绩所属的等级 // 80~100(包括80,也包括100) 优秀 // 60~80(包括60,但不包括80) 中等 // 0~60(包括0,但不包括60) 不及格 // 其他值 输入有误 var b = 98; if(b>=80 && b<=100){ console.log("优秀"); }else if(b>=60 && b<80){ console.log("中等"); }else if(b>=0 && b<60){ console.log("不及格"); }else{ console.log("输入有误") } </script> </head> <body> </body> </html>
–2,循环结构
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 js的循环语句</title> <script> //2,while循环 while(循环条件){ 循环体 } //练习1:假如你有1亿,每天花一半,能花多少天 var money = 100000000;//定义变量,记录钱 var days = 0;//定义变量,记录天数 while(money>1){ money = money/2;//花钱 days++;//天数++ } console.log("1亿能花"+days+"天~~"); //1,for循环 //练习1:打印1~10 for(var i=1;i<=10;i++){ console.log(i); } //练习2:求1~100里偶数的和 var sum = 0 ;//定义变量,记录和 for (var i = 1; i <=100; i++) { if(i % 2 == 0){//偶数 sum = sum + i ;//修改变量的值 } } console.log("1~100的偶数和是: "+sum); </script> </head> <body> </body> </html>
[(cgb2109-day11_cgblpx的博客-CSDN博客)]
通过script标签引入JS代码
js概念名词解释:
事件驱动:在JS中,大部分情况下都是通过事件触发驱动函数执行的,从而实现特定的功能。(比如点击div将内容替换为时间、当鼠标滑过元素,元素就有翻转的动态。)
脚本语言:在网络前端开发环境下,用于嵌入在客户端浏览器中的一段小程序。
特点和优势
特点:
(1)JS是一门直译式的语言,直接执行的就是源代码.
是一边解释一边执行,没有编译的过程(不像Java需要提前编译为class文件再运行).
(2)JS是一门弱类型的语言,没有严格的数据类型.
优势:
(1)良好的交互性
(2)一定的安全性(JS被强制的要求,不能访问浏览器以外的东西,只能访问浏览器和浏览器内部的资源)
(3)跨平台性(Java语言具有跨平台性,是因为有虚拟机)
JS数组用于在单个的变量中存储多个值(其实就是一个容器)。
JS中的数组可以存储例如:数值、字符串、布尔值、undefined、null、对象、函数等
JS数组的声明方式
var arr1 = new Array();//声明一个空数组var arr2 = new Array("abc", "hello", true);//声明一个具有初始值的数组alert(arr2.length);//3
var arr4 = [];//声明一个空数组alert(arr4.length);//0
arr4 = ["abc", "hello", true];//声明一个具有初始值的数组alert(arr4);
js中o是下标,但是java中是数组
for(var o in c){ console.log(o) }JS函数:使用了关键词 function
java中:
for(类型 数组 ,数组名称)
alert()
js函数两种方式:
方式一:通过function关键字声明函数
声明:function 函数名称([参数列表]){ 函数体 }
调用: 函数名称([参数列表])
function sum(){
var num=0;
var a=[1,2,3,4,5,6,7,8,9,10]; for(var i in a){ num+=a[i]; } console.log(num); }
按钮:<button οnclick="sum();">点我求和</button>
方式二:通过函数直接量声明函数
声明:var 函数名称 = function([参数列表]){ 函数体 }调用: 函数名称([参数列表]);
<script> function tostring(a){ 参数不需要加var var s=" "; 这里string类型,需要写成var for(var i in a){ s+=a[i]+" "; } return s; } var arr=new Array("1","2"); var sum=tostring(arr); console.log(sum) </script>
js对象
<div onlclick="b()">一下</div>
<div οndblclick="a()">点我,两下,触发函数</div>
内置对象
String/Array/Number/Math/JSON…
拼串
var c=a.concat("world") console.log(c)
全转大写
var r=a.toUpperCase() console.log(r)
substring()截取方法,包括左边,不包括右边
math中的方法
console.log(Math.PI);console.log(Math.random());console.log(Math.round(2.8));
js中获取随机数只能是0到1
自定义对象
(1)方式一:
声明对象:function Person(){}创建对象:var p1 = new Person();设置属性:p1.name = "张飞"; p1.age = 18;设置方法:p1.run = function() { alert(this.name+" : "+this.age); }
调用方法:p1.run()调用范围小,只能被p1对象调用
(2)方式二:
var 对象名 ={“k”,“v”,特征2,特征3}
k的双引号可以去掉,属性之间是逗号。属性如果是string不能省双引号,数字可以省
var s={ "pinpai":"黄大发", price:function(){ console.log("....") } } console.log(s) console.log(s.pinpai) console.log(s.price) s.price();
Dom树:
是用来利用js代码,操作html每个元素的
dom用一套api来快速的通过js代码获取元素
Document对象
--获取对象: window.document,window.可以省略--调用方法: getElementById("元素的id的属性的值")--返回1个元素 getElementsByName("元素的name属性的值")--返回多个元素(用数组) getElementsByClassName("元素的class属性的值")--返回多个元素(用数组) getElementsByTagName("元素的标签名的值")--返回多个元素(用数组)write()--向文档写 HTML 表达式 或 JavaScript 代码title--返回网页的标题id--设置或返回元素的idinnerHTML--设置或返回元素的内容
<script> function get(){ //window.document; var x=document.getElementById("a"); console.log(x); } </script>
<body> <button οnclick="get()">按钮</button> <div id="a">我是div1</div > <div id="b">我是div2</div> <span class="c">我是span1</span> <span class="c">我是span2</span> </body>
一,JS的数组
–1,概述
1,特点: 长度可变,数据类型可以存的非常丰富.2,创建:
var a = new Array(1,2,3,4.1); var a = [1,2,3,4.1];
3,遍历:
//i是下标,a[i]是数据 for(var i=0;i<a.length;i++){} for(var i in a){}
–2,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 js数组</title> <script> //JS数组的特点:存的数据类型丰富,也有下标0,也有length,随时改长度 //1.创建数组的方式一: var a = new Array(); console.log(a); console.log(a.length);//获取数组的长度 var b = new Array(1,1.1,true,'hello'); console.log(b); console.log(b.length); console.log(b[2]); console.log(b[3]); console.log(b[4]);//undefined!!! //2.创建数组的方式二: var c = []; console.log(c.length);//0 c = [1,1.1,true,'abc']; console.log(c.length);//4 c[99]=true; console.log(c); console.log(c.length);//100 //3.遍历数组 for(var i=0;i<c.length;i++){ //i是下标,c[i]是通过下标获取c数组里的数据 console.log(c[i]); } //java的foreach:for (Object o : y) {o是数据} for (var o in c) {//forin,o是下标 console.log(c[o]); } </script> </head> <body> </body> </html>
二,JS函数
–1,概述
和java里的方法一样,也是有()的标记,也可以有参数列表,也可以有返回值
//定义函数 function a(参数名){ return b; } var a = function(参数名){return b; } //调用a函数,并传入参数,并用c记录返回值 var c = a(传参);
–2,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 js函数</title> <script> //练习: 设计函数,并提供返回值和参数列表 //需求:打印指定数组中的所有数据 function tostring(a){ var s = "";//定义变量,记录数据拼接后的字符串 for(var i in a){//i是下标,a[i]是数据 //把每个数据拼接成字符串,空格隔开 s = s + a[i]+" "; } return s;//把结果返回给调用者 } //调用函数,并准备参数arr,并用result接受函数返回来的结果 var arr = new Array("abc",1.1,"jack",666); var result = tostring(arr); console.log(result); //练习: 设计函数,并提供返回值(通过return返回结果) var x = function(){ return "hello js";//把结果返回给调用者 } //调用了x(),并用y保存了函数的返回值 var y = x(); console.log(y); //2,创建JS函数方式2: //创建 var get = function(){ console.log('get()被调用!'); } //调用 get(); //练习:统计1~10的偶数个数(使用数组和函数) var count = function(){ var a =[1,2,3,4,5,6,7,8,9,10]; var b = 0;//记录个数 for(var i in a){//i是下标,a[i]表示数组里的数据 if(a[i] % 2 == 0){//判断数据a[i]是不是偶数 b++;//求个数 } } console.log(b); } count(); //1,创建JS函数方式1: //创建 function save(){ console.log('save()被调用成功!'); } //调用 save(); //练习:统计1~10的总和(使用数组和函数) function sum(){ var a =[1,2,3,4,5,6,7,8,9,10];//创建数组 var b = 0;//定义变量,记录和 for(var i in a){//forin遍历数组,i是下标 //把每个数据a[i]求和 b = b + a[i]; } console.log(b); } </script> <style> /* 给按钮添加背景色 */ button{ background-color: pink; border-color: pink; } </style> </head> <body> <!-- 单击按钮,触发了js中定义好的sum() --> <button οnclick="sum();">点我,求和</button> </body> </html>
–3,!!!自定义对象
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>测试 自定义js对象</title> <script> //!!!!! 创建JS对象的方式2: //语法: var 对象名={k:"v",k:"v",k:function(){}} //改造Person2对象 var person2={ name:"jack", study:function(){ console.log('study()已被调用'); } } //调用对象的属性--要么打印要么赋值 console.log(person2.name); //调用对象的函数 person2.study();
//改造Car2对象 var car2 = { pinpai:"黄大发" , price:9.9 } console.log(car2); //调用对象的属性 console.log(car2.pinpai); console.log(car2.price); //创建JS对象的方式1: //练习:创建Car对象,设计属性和函数并完成调用! function Car(){} var c = new Car(); console.log(c); //设置属性并调用 c.pinpai="黄大发"; c.price=9.9; console.log(c); console.log(c.pinpai); console.log(c.price); //设置函数并调用 c.run=function(x){ return x+10; } var y = c.run(100); console.log(y); //1,声明对象 function Person(){} //2,创建对象 var p = new Person(); console.log(p); //3,设置属性 p.name="jack"; console.log(p); //4,设置函数 p.study=function(){ console.log(100); } //5,调用属性 console.log(p.name); //6,调用函数 p.study(); </script> </head> <body> </body> <html/>
四,DOM
–1,概述
是用来 利用JS代码,操作HTML的每个元素的利用document对象,
–2,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 DOM</title> <!-- DOM就是用一套API来快速的通过js代码获取元素 --> <script> function get(){ //1,获取id="a"的元素的内容 //获取document对象 //按照id获取元素getElementById("id属性的值") var x = document.getElementById("a"); console.log(x); } </script> </head> <body> <button οnclick="get()">按钮</button> <div id="a">我是div1</div> <div id="b">我是div2</div> <span class="c">我是span1</span> <span class="c">我是span2</span> </body> </html>
一,DOM
–1,用法
第一步:获取document对象, window.document,其中window可以省略不写第二步:使用对象的属性和函数
getElementById()--按照id属性的值,来获取元素,只能获取一个 getElementsByName()--按照name属性的值,来获取元素,获取多个,并存入数组 getElementsByClassName()--按照class属性的值,来获取元素,获取多个,并存入数组 getElementsByTagName()--按照标签名的值,来获取元素,获取多个,并存入数组 innerHTML属性---获取内部的内容 innerText属性---获取内部的内容 注意:innnerhtml可以识别标签,innertext不能识别标签
–2,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 DOM</title> <!-- DOM就是用一套API来快速的通过js代码获取元素 --> <script> function get(){ //1,获取id="a"的元素的内容 //获取document对象 //按照id获取元素getElementById("id属性的值") var x = document.getElementById("a"); console.log(x); var y = x.innerHTML;//获取元素的内容 console.log(y); //2,获取id="b"的元素的内容 并修改???? var z = document.getElementById("b").innerHTML; console.log(z); z='我变了...'; console.log(z); //3,修改id="a"的元素的内容 document.getElementById("a").innerHTML="我也变了"; //4,获取我是span1--按照class的值获取 var a = document.getElementsByClassName("c"); console.log(a);//按照class获取到了数组 var b = a[0].innerHTML;//按照下标操作元素 console.log(b); //5,获取我是span1--按照标签名的值获取 // 按照标签名span获取到一个数组 下标 获取内容 var c = document.getElementsByTagName("span")[0].innerHTML; console.log(c); //6,修改我是span2的内容 //了解:innerHTML和innerText的区别?前者可以解析HTML代码,后者不能 document.getElementsByClassName("c")[1].innerHTML="<h1>我是渣渣辉</h1>"; // document.getElementsByClassName("c")[1].innerText="<h1>我是渣渣辉</h1>"; } </script> </head> <body> <button οnclick="get()">按钮</button> <div id="a">我是div1</div> <div id="b">我是div2</div> <span class="c">我是span1</span> <span class="c">我是span2</span> </body> </html>
二,!!!JSON
1,概述
是一种轻量级的数据交换格式,本质就是一个字符串.用来 规定浏览器和服务器之间 数据交换的一个格式.
–2,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 json</title> <script> //1,创建json字符串 var a ='"name":"jack"';//注意语法!! console.log(a); console.log(a.length);//求长度 console.log(a.concat(100));//拼接 //2,创建json对象--为了方便的操作字符串 var b = '{"name":"jack","age":"20"}'; console.log(b); console.log(b.length);//获取字符串的长度 //js对象--为了方便的解析对象的属性 var b2 = {name:"jack",age:20}; console.log(b2.name);//获取属性的值 //3,创建json数组 var c = '[{"name":"jack","age":"20"},{"name":"rose","age":"18"}]'; console.log(c.length); console.log(c.concat(100)); //TODO 需求:解析c里面每个属性的值 //解决方案:把json字符串转成js对象,否则就只能一点一点截取字符串啦! //利用js的内置对象JSON,完成json字符串和js对象的互转 //parse(): json字符串->js对象:为了方便的调用对象的属性 var obj = JSON.parse(c); console.log(obj); console.log(obj[0].name);//jack console.log(obj[0].age);//20 console.log(obj[1].name);//rose console.log(obj[1].age);//18 //stringify(): js对象->json字符串:为了方便的操作字符串 //定义JS对象 var person={name:"jack",age:20}; //利用工具变成json字符串 var str = JSON.stringify(person); console.log(str); console.log(str.length); var y = str.substring(9,13); console.log(y);//jack </script> </head> <body> </body> </html>
三,Vue
–1,概述
是一个轻量级的前端框架.封装了HTML CSS JS的代码.特点:1, 是一个轻量级的 渐进式的框架, 按需配置2, 实现了数据驱动/双向绑定 和 组件化的思想(高内聚)3, vue框架可以避免了DOM的API
4, 遵循了MVVM设计模式,实现前端代码的松耦合
M是Model,是指数据
V是View,是指视图VM是ViewModel,是指在指定视图里渲染指定数据
–2,入门案例
把vue.js导入到你的项目中
创建HTML文件,并引入vue.js
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 vue框架</title> <!-- 1.引入vue.js来用vue框架的核心功能 src用来指定js文件的位置 --> <script src="vue.js"></script> </head> <body> <!-- 2.准备解析vue的数据 {{message}}是插值表达式,用来获取message的值 --> <div id="app"> {{message}} </div> <!-- 3.给第二步准备数据 --> <script> var a={ message:"hello vue~" } //1,创建Vue对象 new Vue({ //el挂载点,意思是,把数据挂载到指定位置 el:"#app",//利用CSS的id选择,选中了网页中的元素 //data是vue为挂载点准备好的数据 data:a }) </script> </body> </html>
测试
总结
–3,练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>练习 vue开发步骤</title> <!-- 1.引入vue.js --> <script src="vue.js"></script> </head> <body> <!-- 2.准备数据渲染区,插值表达式获取属性的值--> <div id="app"> 姓名:{{name}} 年龄:{{age}} </div> <!-- 3.创建Vue对象 --> <script> new Vue({ el:"#app" , //挂载点 data:{ //给挂载点准备数据 name:"jack" , age:20 } }) </script> </body> </html>
四,Vue的基础语法
–1,运算符&函数
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 vue的运算符</title> <!-- 1.引入vue.js --> <script src="vue.js"></script> </head> <body> <!-- 2.准备数据渲染区 创建Vue对象 --> <div id="app"> 加减乘除运算: {{3+2}} {{3-2}} {{3*2}} {{3/2}} {{3%2}} 三元运算符: {{ age > 18 ? "成年人" : "未成年" }} 字符串的常见操作:{{str}} {{str.length}} {{str.concat(100)}} 调用函数: {{ show() }} {{ print(100) }} {{add(1,2)}} </div> <!-- 3.创建Vue对象 --> <script> new Vue({ //指定挂载点的位置,每个Vue对象必须有这个el属性!!! el:"#app", data:{ //给数据渲染区准备数据 age:10, str:"hello" }, methods:{ //准备函数 //函数名:函数的声明 show:function(){ console.log("show()调用成功!"); }, print:function(a){ console.log("print()调用成功"+a); }, add:function(a,b){ console.log(a+b); } } }) </script> </body> </html>
一,Vue的基础语法
–1,解析类型丰富的data
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 vue解析复杂的数据</title> <script src="vue.js"></script> </head> <body> <div id="app"> {{name}} <h1>解析vue对象的数据:</h1> <h1>姓名:{{person.name}} 年龄:{{person.age}} </h1> <h1>解析vue数组的数据:</h1> <h2>{{hobby}} {{hobby[0]}} {{hobby[1]}} </h2> <!-- 数组名[下标].属性名 目的是来获取每个对象中属性对应的值 --> <h2>{{persons[0].name}} {{persons[1].age}}</h2> </div> <script> var vm = new Vue({ el:"#app", data:{ name:"jack", //对象名:对象的多个特征 person:{ name:"rose", age:20 }, //数组 hobby:["篮球","足球"], //数组 persons:[ { name:"jack" , age:20 }, { name:"rose" , age:10 } ] } }) </script> </body> </html>
–2,data的三种写法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>vue里data的三种写法</title> <script src="vue.js"></script> </head> <body> <div id="a"> {{msg}} {{hobby[0]}} </div> <script> new Vue({ el:"#a", //通过函数,设置返回值--vue项目中组件化的使用 // data:function(){ data(){//效果同上,是上面代码的简写形式 //必须返回js对象 return { msg:"hello vue", hobby:[1,2,3] } } }) </script> </body> </html>
二,Vue的指令
–1,概述
就是Vue框架提供的一些有特殊意义的代码,都有v-的前缀常见的指令: v-if v-for v-on …使用方式: 在开始标签处,添加新的属性,有v-的前缀的标识
–2,v-model & v-cloak
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 vue指令</title> <script src="vue.js"></script> <style> /* 语法: 选择器{样式1;样式2;...} */ [v-cloak]{/* 选中有指定属性的元素 */ display: none; /* 隐藏 */ } </style> </head> <body> <!-- 2.v-cloak指令:解决插值表达式的闪现问题 --> <div class="a" v-cloak> {{address}} {{address}} {{address}} <!-- 1.v-model指令:双向绑定,是指V和M的数据可以实时同步 address值是指你的数据要和哪个属性进行绑定. 可以获取也可设置属性的值 --> <input type="text" v-model="address"/> </div> {{address}} <script> new Vue({ el:".a", data(){ return{ address:"北京" } } }) </script> </body> </html>
–3,v-if & v-show & v-for
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 vue指令</title> <script src="vue.js"></script> </head> <body> <div id="app"> <h1>{{name}}</h1> <!-- 3.v-text和v-html 指令 都是用来获取属性值的, 区别是:前者无法解析HTML标签只能当做一个普通文本展示 后者可以解析数据中出现的HTML标签 --> <h1 v-text="name"></h1> <h1 v-html="name"></h1> <!--4.v-if指令,判断条件满足时就展示元素,不满足就不展示 了解:v-if和v-show区别?都可以判断,不满足时前者干脆不会解析元素 后者会解析这个元素但是结合css代码来隐藏style="display: none;" --> <div v-if="age>18">年成人</div> <div v-show="age>18">年成人</div> <!--5.v-if指令的复杂使用 if...else if...else语法同java--> <div v-if="salary>20000">金领</div> <div v-else-if="salary>10000">白领</div> <div v-else>屌丝</div> <!--6.v-for指令用来循环遍历,通常用来遍历数组,语法类似forin, i是获取遍历得到的数据,in是固定语法,hobby是数组名,index是下标 --> <div v-for="i in hobby">{{i}}</div> <div v-for="i,index in hobby">{{i}}--{{index}}</div> </div> <script> new Vue({ el:"#app", data(){ return{ name:"<p>tony</p>", age:10, person:{ salary:10000 }, hobby:["吃","喝","王者","Anglelababa"] } } }) </script> </body> </html>
–4,v-on & v-bind
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测 vue指令</title> <script src="vue.js"></script> </head> <body> <!-- 0.是HTML的元素 --> <button οnclick="alert(1)">按钮1</button> <a href="https://www.baidu/">百度一下</a> <div id="app"> <!-- 1.v-on指令:给元素绑定不同的事件,可以简写成@ --> <button v-on:click="show()">按钮2</button> <button v-on:dblclick="print(100)">按钮3</button> <button @click="add(1,2,3)">按钮4</button> <!-- 问题:跳转时404,没有把url当变量,而是直接把整体当做跳转路径 --> <a href="{{url}}">百度一下1</a> <!-- 2.v-bind指令:把url当变量,去获取了变量的值进行跳转 v-bind:href可以简写成:href,意思是后面出现的url是变量不是字符串 --> <a v-bind:href="url">百度一下2</a> <a :href="url">百度一下3</a> </div> <script> new Vue({ el:"#app", data:{ url:"http://www.baidu/" }, methods:{ //函数名:函数声明(参数列表){函数体} show:function(){ console.log(100) } , print:function(a){ console.log(a); }, //函数名(参数列表){函数体},是上面函数的简写方式 add(a,b,c){ console.log(a+b+c); } } }) </script> </body> </html>
三,Vue组件Component
–1,概述
好处:可以提高前端代码的复用性.使用步骤:1,定义组件: 全局组件 + 局部组件2,使用组件: 就像使用HTML的标签一样
–2,全局组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 Component组件</title> <!-- 1.组件是vue.js的核心功能,先导入vue.js --> <script src="vue.js"></script> </head> <body> <!-- 2.在数据渲染区 --> <div id="app"> <!-- 3.2,使用组件,就像使用HTML的标签一样 --> <Person></Person> </div> <div id="a"> <Person></Person> </div> <!-- 3.创建Vue对象 --> <script> //全局组件:作用范围是可多个Vue对象使用,可以在所有的渲染区使用 //3.1,创建全局组件--1是组件名2是组件内容 // Vueponent(1,2) Vueponent('Person',{ // template:组件具体要啥内容 template:"<h1>姓名:jack,年龄:20</h1>" }) new Vue({ el:"#app" }) new Vue({ el:"#a" }) </script> </body> </html>
–3,局部组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 局部组件</title> <script src="vue.js"></script> </head> <body> <div id="app"> <Car></Car><!-- 2.使用了局部组件 --> <Student></Student><!--使用了全局组件--> </div> <div id="a"> <Student></Student><!--使用了全局组件--> </div> <script> //全局组件 Vueponent('Student',{ template:'<h1>这是一个全局组件</h1>' }) //局部组件:只能当前对象(在指定的数据渲染区)使用 new Vue({ el:"#a" }) new Vue({ el:"#app", //1.创建局部组件 components:{ //组件名:组件的内容 Car:{ template:"<p>这就是Car组件!</p>" } } }) </script> </body> </html>
一,Vue组件的练习
–1,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 组件</title> <!-- 自己写一个全局组件和局部组件 --> <script src="vue.js"></script> </head> <body> <div id="app1"> <!-- 1,使用组件 --> <Com1></Com1> <Com2></Com2> <Com10></Com10> <Com20></Com20> </div> <div id="app2"> <!-- 1,使用组件 --> <Com1></Com1> <Com10></Com10> </div> <script> /* 2.创建全局组件,在全局使用 */ Vueponent('Com1',{ template:'<h1>你好Com1</h1>' }) Vueponent('Com10',{ template:'<ol><li>我是元素1</li><li>我是元素2</li></ol>' }) new Vue({ el:"#app1", /* 3.创建局部组件:只能在局部(id=app1的位置)使用 */ components:{ 'Com2':{ template:'<h1>你好Com2</h1>' }, 'Com20':{ template:'<button style="background-color: red;">按钮1</button>' } } }) new Vue({ el:"#app2" }) </script> </body> </html>
二,Vue路由Router
–1,概述
基于Vue组件化的思想,从用户发起一个请求,一直到展示指定组件,这个过程就是Vue路由负责的使用步骤: vue.js + vue-router.js 引入到网页中
–2,测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 Vue路由</title> <!-- 1.引入js文件,注意顺序! --> <script src="vue.js"></script> <script src="vue-router.js"></script> </head> <body> <!-- 2.准备数据渲染区,即将展示组件的功能 --> <div id="app"> <!-- 3.4,点击不同的元素,即将路由到不同的组件 --> <router-link to="/home">主页</router-link> <router-link to="/help">帮助页</router-link> <!-- 3.5,展示组件的内容 --> <router-view></router-view> </div> <!-- 3.创建Vue对象 --> <script> //3.3,创建组件,让路由动态匹配 var home={ template:'<h1>我是主页..</h1>' } var help={ template:'<h1>我是帮助页..</h1>' } //3.2,创建路由的细则 //VueRouter表示vue路由的对象,routes属性用来描述细则 var router=new VueRouter({ //属性名:属性值 routes:[ //根据不同的请求,路由到不同的组件 //path:访问路径,component:组件名称 {path:"/home",component:home} , {path:"/help",component:help} ] }) new Vue({ el:"#app", //3.1,设置路由功能 // router:router //key 和value一样时,可以简写 router//同上,简写形式 }) </script> </body> </html>
–3,总结
–4,练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>练习路由</title> <script src="vue.js"></script> <script src="vue-router.js"></script> </head> <body> <div id="app"> <router-link to="/runoob">runoob</router-link> <router-link to="/w3c">w3c</router-link> <router-view></router-view> </div> <script> var runoob={ template:"<a href='http://www.runoob'>http://www.runoob</a>" } var w3c={ template:"<a href='http://www.w3school'>http://www.w3school</a>" } var router=new VueRouter({ routes:[ {path:"/runoob", component:runoob}, {path:"/w3c", component:w3c} ] }) new Vue({ el:"#app", router }) </script> </body> </html>
三,Vue的ajax
–1,概述
可以避免刷新整个网页,而实现了局部刷新的效果,异步访问的.提高了网页的动态性,提高了网页的响应速度.在Vue框架中,封装了Ajax的复杂语法,技术命名叫axios,使用步骤: 导入vue.js + axios.js 文件语法: axios.get(java程序的访问方式).then( a => { console.log(a); } )
-2.测试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 axios的语法</title> <!-- 1.导入js文件: vue.js核心 + vue-router.js是路由 + axios.js使用vue封装好的Ajax技术 --> <script src="vue.js"></script> <script src="axios.min.js"></script> </head> <body> <div id="app"> <button @click="show()">按钮</button> </div> <script> //Vue的属性:el挂载点 + data数据区 + methods方法区 //components局部组件 + router创建路由 new Vue({ el:"#app" , methods:{ show(){ //vue提供的对象,get函数是指即将发起一个get请求 //参数是一段java程序的访问方式 //当程序访问成功时,then函数是vue自动调用的函数 axios.get('http://www.baidu/').then( //a记录着java程序的返回值return //=>叫箭头函数 a => { //在函数体重,处理返回的结果 console.log(a.data); } ) } } }) </script> </body> </html>
四,Vue-cli
–1,概述
npm:包管理器,npm命令会去指定的网址下载/安装好多的包(文件夹结构)webpack:自动化构建项目的命令,可以自动下载项目相关的资源(html css js 图片),而且可以自动压缩,打包.
–2,安装vue-cli
1,安装原因
为了能够成功的使用vue项目,必须先安装vue-cli脚手架
2,安装nodejs.mis的应用程序
(win7系统只能装nodejs13的,win10系统装nodejs14), 双击下一步下一步就可以了.
3,验证nodejs是否安装:
C:\Users\WangYiBo>node -v v14.17.5
4,安装脚手架:
C:\Users\WangYiBo>npm config get registry #第一次获取,会是一个国外的网址,即将下载的非常慢,不好,必须修改! C:\Users\WangYiBo>npm config set registry https://registry.npm.taobao #就是把npm的默认网址改成淘宝的! C:\Users\WangYiBo>npm install vue-cli -g #安装vue脚手架,本质上是去npm下载了好多包,原则是一路没有遇到飘红的ERR,只有黄色的WARN没关系,遇到飘红就重新执行这个命令(也许要多次执行) C:\Users\WangYiBo>vue -V #查看vue-cli的版本 2.9.6 C:\Users\WangYiBo>where vue #查看下载的位置 (npm文件夹有20M左右)
五,创建Vue项目!!
1,首先创建一个文件夹,用来存放下载好的vue项目资源
2,在这个文件夹处,执行命令来下载
3,开始下载:
E:\workspace\vue>vue init webpack jt #准备下载jt项目 #下载一些项目需要的资源,但是要进行一些配置,参考下图选择yes或者no
4,检查:
原则还是一路没有遇到飘红的ERROR还有提示信息: Project initialization finished!
5,启动项目
E:\workspace\vue>cd jt #进入项目所在的文件夹 E:\workspace\vue\jt>npm run dev #启动项目(在哪个项目执行这个命令就启动哪个项目)
6,访问项目
六,在项目中添加自己的资源
1,用Hbuilder打开你下载好的项目.
文件-打开目录-浏览项目位置-打开
2,目录结构
3,在vue项目中添加自定义组件
在src/components文件夹里,创建组件
<template> <div> {{msg}} </div> </template> <script> //表明 这个组件可以导出 export default{ name:'Person',//组件名 data(){ return{ msg :'hello vue project~' } } } </script> <style> </style>
在src/App.vue文件里,注册组件
<template> <div id="app"> //3,使用自定义的组件 <Person></Person> </div> </template> <script> //1.导入指定的自定义组件 ,路径要求必须有./ import Person from './components/Person.vue' export default { name: 'App', components:{ //2.添加组件 Person //使用第一步导入成功的组件名 } } </script> <style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
测试
1,进入项目所在的文件夹里,运行启动命令来启动项目 : npm run dev2,打开浏览器访问: http://localhost:8080 ,观察有没有展示你自定义组件的内容
更多推荐
第二阶段1
发布评论