• MYSQL


    MySql

    CMD下Mysql的启动,链接,退出

    Mysql启动

    1.手动:cmd->services.msc->启动MySql

    开启,关闭服务下两种在管理员权限下运行:

    2.net stop mysql(停止服务)

    3.net start mysql(开始服务)

    Mysql登录

    本机mysql -uroot -proot(mysql -u用户 -p密码)

    远程mysql -hip -u链接目标的密码

    通用:mysql --host=ip --user=root --password=连接目标的密码

    举例:mysql --host=127.0.0.1 --user=root --password=root

    Mysql退出

    本机 exit

    远程 quit


    Mysql目录结构

    安装目录

    数据目录

    Mysql语法

    1.sql语句可以单行或多行书写,以;结尾

    2.语句不区分大小写,关键字可以大写

    3.单行注释与多行注释

    单行:-- 注释内容,# 注释内容(注意--后跟一个空格,#可以不跟)

    多行:/* */(与JAVA一样);

    Mysql命令分类


    DDL

    1.操作数据库CRUD,增删改查

    C:create创建

    创建数据库:        create database 数据库名字

                                 create database if not exists 数据库名字;(如果存在就不创建了)

                                  create database 数据库名字 character set gbk;

    创建表:create 表名(列名1 数据类型1

                                           列名2 数据类型2,

                                            ......

                                                   列名 n,数据类型n)                        //最后一列不加逗号;

    复制表:create table 表名 like 表名

    R:Retrieve 查询

    查询所有的数据库的名称:show databases

    查询某个数据库中的所有表名称:show tables

    查询表结构:desc 表名

    U:Update 修改

    修改数据库的字符集:alter database 数据库名称 character set 字符集名

    修改表名        alter table 表名 rename to 新的表名

    修改表 的字符集               alter table 表名 character set 字符集格式;

    添加一列:alter table 表名 add 列名 数据类型

    修改列的名称和类型:

            修改名称和类型 alter table 表名 change 列名 新列名  数据类型

            修改类型 alter table 表名 modify 列名 新数据类型

    D:delete删除

    删除数据库:        drop database 数据库名称

                                 drop database if exists 数据库名称

    删除表:    drop table 表名

                          drop table if exists 表名

    删除列:alter table 表名 drop 列名

    使用数据库

    查询当前正在使用的数据库:select database();

    使用数据库:                                use 数据库名称;



    Mysql里的数据类型

     图形化编写MySQL

    DML:增删改表中数据

    添加数据

    insert into 表名(列名1,列名2...列名n)values(值1,值2.....值n)

    INSERT INTO ss(id NAME,age) VALUES(1,'mike',18);

    省略列名将会给所有列添加值;但必须全部添加,否则会报错;

    除了数字类型,其他类型需要使用引号(单双均可)引起来;

    查询数据

    select * from 表名(查询表中所有数据)

    SELECT * FROM ss;

    删除数据

    delete from 表名[where 条件],不加where将删除表中所有记录;

    SELECT * FROM ss;

    清空表:truncate table 表名(首先删除表,再创建一个一模一样的空表);

    修改数据

    update 表名 set 列名1=值1,列名2=值2 [where 条件];不加任何条件会修改所有记录;

    DQL

    查询语句:

    select 

            字段列表

    from 

            表明列表

    where

            条件列表

     group by

            分组字段

    having 

            分组之后的条件

    order by

            排序

    limit

            分页

     基础查询

    1.查询多个字段

    select 字段名1 as 别名,字段名2....from 表名;

    2.去除重复:使用distinct

    select DISTINCT 字段名1,... FROM student4;

    3.计算列

    select 字段名1 +字段名2....from 表名;

    排除null:select 字段名3,字段名1 +ifnull(字段名2,代替值)....from 表名;计算1,2的和;

    4.起别名

    在列后使用as,as可以省略;

    SELECT NAME AS 数学,math  +IFNULL(english,0)AS 总分 FROM student4;
     

    条件查询

    运算符:

    >,<,>=,<=,=,!=,<>

    between ... and...

    in,like is null,and ,or ,not;

    1. SELECT *FROM student4;
    2. #大于20
    3. SELECT * FROM student4 WHERE age>20;
    4. #大于等于20
    5. SELECT * FROM student4 WHERE age>=20;
    6. #等于20
    7. SELECT * FROM student4 WHERE age=20;
    8. #不等于20
    9. SELECT * FROM student4 WHERE age!=20;
    10. #不等于20
    11. SELECT * FROM student4 WHERE age<>20;
    12. #小于20
    13. SELECT * FROM student4 WHERE age<20;
    14. #小于等于20
    15. SELECT * FROM student4 WHERE age<=20;
    16. #20~40岁之间
    17. SELECT * FROM student4 WHERE age BETWEEN 20 AND 40;
    18. SELECT * FROM student4 WHERE age>=20 AND age<=40;
    19. #查询22岁,19岁,25岁的信息;或者
    20. SELECT*FROM student4 WHERE age=22 OR age=19 OR age=25;
    21. SELECT*FROM student4 WHERE age IN (22,19,23,25);
    22. #查询null:null不能使用比较符来判断;使用is判断
    23. SELECT*FROM student4 WHERE age IS NULL;
    24. SELECT*FROM student4 WHERE age IS NOT NULL;
    模糊查询:like;类似正则表达式;

    格式:

    举例

    1. #查询姓马的人
    2. SELECT NAME FROM student4 WHERE NAME LIKE '马%';
    3. #查询第二个字是马的人
    4. SELECT NAME FROM student4 WHERE NAME LIKE '_化%';
    5. #查询姓名是三个字的人;
    6. SELECT NAME FROM student4 WHERE NAME LIKE '__';
    7. #查询姓名中包含马的人
    8. SELECT NAME FROM student4 WHERE NAME LIKE'%德%';

    排序查询

    语法:order by 子句

            order  by 排序字段1 排序方式1,排序字段2 排序方式2......

    排序方式:升序(ASC)默认,DESC 降序;
    多条件排序:如果有多个排序条件,则当前一个条件值一样时,才会判断第二条件;

    1. #按照数学成绩排名,如果数学成绩一样则按照英语成绩排名
    2. UPDATE student4 SET math=99 WHERE age=18; -- 修改
    3. SELECT *FROM student4;
    4. SELECT *FROM student4 ORDER BY math ASC,english ASC;
    5. 数学是第一条件,英语是第二条件
    聚合函数

    将一列数据作为整体进行纵向的计算;

    count :计算个数

    max:计算最大值

    min:计算最小值

    sum:计算和

    avg:计算平均值

    注意:聚合函数计算时排除null, 一般选择主键作为count的参数;

    1. SELECT COUNT(NAME)FROM student4;
    2. SELECT COUNT(IFNULL(NAME,0))FROM student4;
    3. SELECT MAX(math)FROM student4;
    4. SELECT SUM(math)FROM student4;
    5. SELECT SUM(IFNULL(english,0))FROM student4;
    6. SELECT AVG(english)FROM student4;
    分组查询

    语法:group by 分组字段,注意分组后查询的字段(select 之后的内容):聚合函数或者分组字段;

    1. #按照性别分组,分别查询男,女同学的平均分
    2. SELECT sex,AVG(math)FROM student4 GROUP BY sex;
    3. 复合语句:
    4. #按性别分组,分别查询男女的平均分,要求:分数低于70的人,不参与分组;
    5. SELECT sex,COUNT(id)FROM student4 WHERE math>50 GROUP BY sex;

    分组之后继续划分: having子句,写在:“group by 分组字段”之后;

    1. #按性别分组,分别查询男女的平均分,要求:分数低于70的人,不参与分组,分组之后人数要大于两个人;
    2. SELECT sex,COUNT(id)FROM student4 WHERE math>50 GROUP BY sex HAVING COUNT(id)>2;
    3. SELECT sex AS 性别 ,COUNT(id) AS 人数 FROM student4 WHERE math>50 GROUP BY sex HAVING 人数>2;
    分页查询

    语法:limit 开始的索引,每一页查询的条数;该语句是方言操作;

    SELECT *FROM student4 LIMIT 0,3;从0开始,每一页显式3条数据

    运行后结果:

    开始的索引的计算公式:开始的索引=(当前页码-1)*查询条数;


    约束

    概念:对表中的数据进行限定,保证数据的正确性,有效性和完整性;

    分类:

    主键约束:primary key         含义:非空且唯一,此外一张表只能有一列为主键

    非空约束:not null                某一列的值不能为null;

    唯一约束:unique                 某一列的值不能重复,可以为null,但只能有一个为null;

    外键约束:foreign key          设计多张表的操作

    非空约束添加方式

    1.创建表时在列的后面加not null;

    2.创建表后在后续修改列时添加或删除;即修改列命令:

            修改名称和类型 alter table 表名 change 列名 新列名  数据类型

            修改类型 alter table 表名 modify 列名 新数据类型

    1. 1.创建表时在列的后面加not null
    2. CREATE TABLE stu1(
    3. id INT,
    4. NAME VARCHAR(20)NOT NULL -- name为非空;
    5. );
    6. 2.后续修改列时添加或删除;即修改列命令
    7. ALTER TABLE stu1 MODIFY NAME VARCHAR(20);
    8. ALTER TABLE stu1 MODIFY NAME VARCHAR(20) not null;
    唯一约束添加方式

    1.创建表时添加

    2.创建表后在后续修改时添加或删除,注意:添加与非空约束一样,使用修改列命令,但删除使用drop index +列名的形式,即删除列的形式。

    删除唯一约束:alter table 表名 drop index 列名

    添加唯一约束: alter table 表名 modify 列名 新数据类型(在原数据类型后加上unique)

    1. CREATE TABLE stu1(
    2. id INT,
    3. phone_number VARCHAR(20) UNIQUE-- 手机号应该是唯一的,
    4. );
    5. INSERT INTO stu1(id,phone_number)VALUES(1,13839897109);
    6. #删除约束
    7. ALTER TABLE stu1 DROP INDEX phone_number;-- 使用删除索引的形式,才能删除唯一约束
    8. ALTER TABLE stu1 MODIFY phone_number VARCHAR(20);#无法删除唯一约束
    9. #添加约束,与非空约束一样,使用修改列命令
    10. ALTER TABLE stu1 MODIFY phone_number VARCHAR(20) UNIQUE;
     主键约束添加方式

    1.创建表时添加主键

    2.创建表后在后续修改时添加或删除;

    创建后删除:alter table 表名 drop primary key

    创建后添加:alter table 表名 modify 列名 新数据类型(在原数据类型后加primary key)

    1. #创建时添加主键
    2. CREATE TABLE stu2 (
    3. id INT PRIMARY KEY ,-- id是主键;
    4. NAME VARCHAR(20)
    5. );
    6. SELECT *FROM stu2;
    7. #创建后删除主键
    8. ALTER TABLE stu2 MODIFY id INT PRIMARY KEY;
    9. #创建后添加主键
    10. ALTER TABLE stu2 DROP PRIMARY KEY;
    主键约束-自动增长

    1.创建表时,添加主键约束,并完成主键自增长;

    2.创建表后,添加或删除自动增长;

    删除:alter table 表名 modify 列名 新数据类型(原数据类型,不加auto_increment和primary_key)

    添加:alter table 表名 modify 列名 新数据类型(原有数据类型后加auto_increment);

    1. #创建时添加自动增长
    2. CREATE TABLE stu3 (
    3. id INT PRIMARY KEY AUTO_INCREMENT,#给id添加主键约束
    4. NAME VARCHAR(20)
    5. );
    6. SELECT *FROM stu3;
    7. #创建后删除
    8. ALTER TABLE stu3 MODIFY id INT;
    9. #创建后添加
    10. ALTER TABLE stu3 MODIFY id INT AUTO_INCREMENT;
    外键约束添加方式

    1.创建表时添加外键约束,语法:

    create table 表名(

    ......

    外键列,

    constraint 外键名 foreign key (外键列名称) references 主表名称(主表列名称);

    );

    外键名:本表明_主表名_fk

    2.创建表后在后续修改时添加或删除外键约束

    删除语法:alter table 表名 drop foreign key 外键名

    添加外键:alter table  表名 add constraint 外键名 foreign key (外键列名称) references 主表名称(主表列名称)

    级联操作:改变主表的内容,本表的内容也会改变;

    级联更新,更新主表会影响本表,

    级联删除,删除主表部分信息会删除本表包含主表被删除信息的行;

    级联更新:

    alter table  表名 add constraint 外键名 foreign key (外键列名称) references 主表名称(主表列名称)on update cascade

    级联删除:

    alter table  表名 add constraint 外键名 foreign key (外键列名称) references 主表名称(主表列名称)on delete cascade

    级联删除是指在删除主表中的数据时,相应的在关联表中也会将相关数据一并删除的操作。例如,在删除stu表中id为2的学生时,由于sc表中有对应的成绩记录,级联删除会将stu表和sc表中对应的数据一起删除。

    级联更新是指在更新主表中的数据时,相应的在关联表中也会将相关数据一并更新的操作。例如,在stu表中将id为3的学生更改为id为6时,由于sc表中有对应的成绩记录,级联更新会将stu表和sc表中对应的数据一起更新。

    以上是在创建表时通过外键约束使用ON DELETE CASCADE和ON UPDATE CASCADE来实现级联删除和级联更新的示例。在创建stu表和sc表时,通过设置FOREIGN KEY (sid) REFERENCES stu(sid) ON DELETE CASCADE ON UPDATE CASCADE,当stu表中的数据被删除或更新时,sc表中相应的数据也会被删除或更新。

    1. CREATE TABLE namer(
    2. id INT PRIMARY KEY AUTO_INCREMENT,
    3. NAME VARCHAR(32)
    4. );
    5. DROP TABLE namer;
    6. INSERT INTO namer(id,NAME)VALUES(1,"董事部"),(2,"财务部"),(3,"研发部");
    7. SELECT *FROM namer;
    8. CREATE TABLE stu6(
    9. id INT PRIMARY KEY AUTO_INCREMENT,
    10. NAME VARCHAR(21),
    11. pid INT,
    12. CONSTRAINT stu6_namer_fk FOREIGN KEY (pid)REFERENCES namer(id)
    13. );
    14. DROP TABLE stu6;
    15. INSERT INTO stu6(id ,NAME,pid)VALUES(1,"小王",1),(2,"小张",1),(NULL,"小李",3);
    16. SELECT *FROM stu6;
    17. #删除外键
    18. ALTER TABLE stu6 DROP FOREIGN KEY stu6_namer_fk;
    19. #添加外键,设置级联更新
    20. ALTER TABLE stu6 ADD CONSTRAINT stu_namer_fl FOREIGN KEY(pid) REFERENCES namer(id) ON UPDATE CASCADE ON DELETE CASCADE;

     数据库设计-多表设计

    多表间的关系

    一对一:人和身份证

    一对多(多对一):部门和员工

    多对多:学生和课程

    一个学生有许多课程,一个课程有许多课程选择

    一对多:添加外键来实现

    员工与部门属于一对多,在员工内设置外键与部门的主键关联。

    1. #一对多;员工与部门
    2. CREATE TABLE dep(
    3. id INT PRIMARY KEY AUTO_INCREMENT,
    4. NAME VARCHAR(20) UNIQUE
    5. );
    6. INSERT INTO dep(id,NAME)VALUES(1,"财务部"),(2,"销售部");
    7. SELECT *FROM dep;
    8. CREATE TABLE emp(
    9. id INT PRIMARY KEY AUTO_INCREMENT,
    10. NAME VARCHAR(20),
    11. dept_id INT,
    12. CONSTRAINT emp_dep_fk FOREIGN KEY (dept_id) REFERENCES dep (id) ON UPDATE CASCADE ON DELETE CASCADE
    13. );
    14. INSERT INTO emp(id,NAME,dept_id) VALUES(1,"mike",1),(2,"nike",2);
    15. SELECT *FROM emp;
    多对多:借助中间表

    中间表至少包含两个字段,两个字段作为两张表的外键,分别指向两张表的主键。

     一对一:加唯一约束的外键

    一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。外键需要有唯一约束。

    旅游线路关系实现:

    三张表:旅游线路分类1,旅游线路2,用户3,1与2之间是一对多,2与3之间是多对多,使用中间表实现,添加外键时不使用constraint 外键名,直接用

    foreign key (外键列名称) references 主表名称(主表列名称)

    否则会添加失败;代码如下:
    ​​​​

    1. #旅游线路分类,
    2. #cid 分类主键,自动增长
    3. #分类名称,非空,唯一,字符串100
    4. CREATE TABLE fenlei(
    5. id INT PRIMARY KEY AUTO_INCREMENT,
    6. cname VARCHAR(100) NOT NULL UNIQUE
    7. );
    8. INSERT INTO fenlei(cname)VALUES ('周边游'),('出境游'),('国内游'),('泰澳游');
    9. SELECT *FROM fenlei;
    10. DROP TABLE fenlei;
    11. #旅游线路表
    12. /*
    13. rid 旅游线路主键,自动增长
    14. rname 旅游线路名称非空,唯一,字符串 100
    15. price 价格
    16. rdate 上架时间,日期类型
    17. cid 外键,所属分类
    18. */
    19. CREATE TABLE tab_route(
    20. rid INT PRIMARY KEY AUTO_INCREMENT,
    21. rname VARCHAR(100) NOT NULL UNIQUE,
    22. price INT,
    23. rdate DATE,
    24. cid INT,
    25. FOREIGN KEY (cid) REFERENCES fenlei(id)
    26. );
    27. DROP TABLE tab_route;
    28. INSERT INTO tab_route VALUES
    29. (NULL, '【厦门+鼓浪屿+南普陀寺+曾厝垵 高铁 3 天 惠贵团】尝味友鸭面线 住 1 晚鼓浪屿', 1499,
    30. '2018-01-27', 1),
    31. (NULL, '【浪漫桂林 阳朔西街高铁 3 天纯玩 高级团】城徽象鼻山 兴坪漓江 西山公园', 699, '2018-02-22', 3),
    32. (NULL, '【爆款¥1699 秒杀】泰国 曼谷 芭堤雅 金沙岛 杜拉拉水上市场 双飞六天【含送签费 泰风情 广州往返 特价团】', 1699, '2018-01-27', 2),
    33. (NULL, '【经典•狮航 ¥2399 秒杀】巴厘岛双飞五天 抵玩【广州往返 特价团】', 2399, '2017-12-23',2),
    34. (NULL, '香港迪士尼乐园自由行 2 天【永东跨境巴士广东至迪士尼去程交通+迪士尼一日门票+香港如心海景酒店暨会议中心标准房 1 晚住宿】', 799, '2018-04-10', 4);
    35. SELECT * FROM tab_route;
    36. #用户表
    37. /*
    38. uid 用户主键,自增长
    39. username 用户名长度 100,唯一,非空
    40. password 密码长度 30,非空
    41. name 真实姓名长度 100
    42. birthday 生日
    43. sex 性别,定长字符串 1
    44. telephone 手机号,字符串 11
    45. email 邮箱,字符串长度 100
    46. */
    47. CREATE TABLE tab_user(
    48. uid INT PRIMARY KEY AUTO_INCREMENT,
    49. username VARCHAR(100)NOT NULL UNIQUE,
    50. PASSWORD VARCHAR(30)NOT NULL,
    51. NAME VARCHAR(100),
    52. birthday DATE,
    53. sex CHAR(1) DEFAULT '男',
    54. telephone VARCHAR(11),
    55. email VARCHAR(100)
    56. );
    57. -- 添加用户数据
    58. INSERT INTO tab_user VALUES
    59. (NULL, 'cz110', 123456, '老王', '1977-07-07', '男', '13888888888', '66666@qq.com'),
    60. (NULL, 'cz119', 654321, '小王', '1999-09-09', '男', '13999999999', '99999@qq.com');
    61. SELECT * FROM tab_user;
    62. #创建收藏表
    63. /*
    64. 创建收藏表 tab_favorite
    65. rid 旅游线路 id,外键
    66. date 收藏时间
    67. uid 用户 id,外键
    68. rid 和 uid 不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
    69. */
    70. CREATE TABLE tab_favorite(
    71. rid INT,
    72. DATE DATETIME,
    73. uid INT,
    74. #创建复合主键
    75. PRIMARY KEY(rid,uid),
    76. FOREIGN KEY(rid) REFERENCES tab_route(rid),
    77. FOREIGN KEY(uid) REFERENCES tab_user(uid)
    78. );
    79. DROP TABLE tab_favorite;
    80. -- 增加收藏表数据
    81. INSERT INTO tab_favorite VALUES
    82. (1, '2018-01-01', 1), -- 老王选择厦门
    83. (2, '2018-02-11', 1), -- 老王选择桂林
    84. (3, '2018-03-21', 1), -- 老王选择泰国
    85. (2, '2018-04-21', 2), -- 小王选择桂林
    86. (3, '2018-05-08', 2), -- 小王选择泰国
    87. (5, '2018-06-02', 2); -- 小王选择迪士尼
    88. SELECT * FROM tab_favorite;

    数据库设计范式:数据库设计原则

     归纳:

    1.每一列都是不可分割的原子数据项

    2.非码属性必须完全依赖于码(消除非主属性对主码的部分函数依赖)

    3.消除传递依赖(任何非主属性不依赖于其他非主属性);

     总结:

    数据库的设计必须遵循以上三条,否则就要使用外键创立另外的表;工作中也使用以上三条来验证数据库的合理性。


    数据库的备份和还原方式
    1.命令行方式(不常用)

    备份语法:mysqldump -u用户名 -p密码 数据库的名称 > 保存的路径

    还原语法:

    1.登录数据库          

    2.创建数据库        

    3.使用数据库                

    4.执行文件        

    2.图形化界面方式
    多表查询

    语法:

    select 

    列名列表

    from 

    表名列表

    where......

    注意:要完成多表查询,就必须消除笛卡尔积所有的无用数据。 (笛卡尔积:两个集合A,B的所有集合情况)

    多表查询分类
    内连接查询方式

    隐式内连接:使用where条件消除无用的数据;

    显示内连接:select 字段列表 from 表名1 inner join 表名2 on 加入条件

    #内连接需要确定从哪些表查询,查询条件是什么,查询哪些字段(列)

    1. #隐式内连接
    2. SELECT
    3. t1.`name`,t1.`gender`,t2.`name`
    4. FROM
    5. emp1 t1,dept t2 #用 t1 代替emp1,t2代替dept
    6. WHERE
    7. t1.`dept_id`=t2.`id`;
    8. #显式内连接
    9. SELECT * FROM emp1 INNER JOIN dept ON emp1.`dept_id`=dept.`id`;
    10. #内连接需要确定 从哪些表查询,查询条件是什么,查询哪些字段(列)
    外连接查询

    1.左外连接:select 字段列表 from 表1 left outer join 表2 on 条件

    2.右外连接   select 字段列表 from 表1 right outer join 表2 on 条件

    内连接,左外连接,右外连接的区别

    左外连接查询的是左表所有数据以及交集部分。内连接只查询交集部分,右外连接查询的是右表所有数据以及交集部分;

    左右表是按照书写时先后顺序来区分的,如表1是左表,表2是右表;

    子查询

    概念:查询中嵌套查询,称嵌套查询为子查询

    1. #查询工资最高的员工信息
    2. #1.查询最高的工资是多少
    3. SELECT MAX(salary)FROM emp1;
    4. #2.查询员工信息,并且工资等于9000的员工
    5. SELECT *FROM emp1 WHERE emp1.`salary`=9000;
    6. #一条语句完成
    7. SELECT *FROM emp1 WHERE emp1.`salary`=(SELECT MAX(salary)FROM emp1);
    子查询的情况1:查询结果是单行单列的

    子查询可以作为条件,使用运算符去判断如>,<>=,<= ,=;

    1. #查询员工工资小于平均工资的人
    2. SELECT * FROM emp1 WHERE emp1.`salary`<(SELECT AVG(salary) FROM emp1);
    子查询的情况2:查询结果是多行单列的

    查询的结果是多行单列的,可以使用运算符in 来判断

    1. #查询财务部所有员工信息
    2. #1查询财务部的id
    3. SELECT id FROM dept WHERE NAME="财务部" OR NAME="市场部";
    4. #2查询id=财务部的员工的信息
    5. SELECT * FROM emp1 WHERE dept_id=3 OR dept_id=2;
    6. #复合语句
    7. SELECT *FROM emp1 WHERE dept_id IN (2,3);
    8. SELECT *FROM emp1 WHERE dept_id IN (SELECT id FROM dept WHERE NAME="财务部" OR NAME="市场部");
    子查询的情况3:查询结果是多行多列的

    多行多列的子查询可以作为一张虚拟表进行表的查询

    1. #查询员工入职日期是2011-11-11以后的员工信息和部门信息
    2. #员工信息
    3. SELECT *FROM emp1 WHERE emp1.`join_date`>'2011-11-11';
    4. SELECT
    5. *
    6. FROM
    7. dept t1,(SELECT *FROM emp1 WHERE emp1.`join_date`>'2011-11-11') t2
    8. WHERE
    9. t1.`id`=t2.dept_id;

    事务

    如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。

    事务的步骤:

    1.开启事务 start transaction

    2.核心语句(sql语句)

    3.回滚        rollback

    4.提交        commit

    首先在语句开头写下 start transaction ,之后书写要执行的语句,在末尾写下rollback和commit;类似于try,catch语句;

    示例:张三给李四转账500:查询张三账户余额是否大于五百->张三账户余额 -500->李四账户余额+500.如果张三账户-500后程序崩溃了,此时张三账户减少,李四账户没有增加,就会出现问题,为避免这一问题,引入事务管理

    1. CREATE TABLE account(
    2. id INT PRIMARY KEY AUTO_INCREMENT,
    3. NAME VARCHAR(10),
    4. balance DOUBLE
    5. );
    6. INSERT INTO account(NAME,balance) VALUES("张三",1000),('李四',1000);
    7. SELECT *FROM account;
    8. #开启事务
    9. START TRANSACTION;
    10. UPDATE account SET balance =balance+500 WHERE NAME='张三';
    11. UPDATE account SET balance =balance+500 WHERE NAME='李四';
    12. #没有问题,提交
    13. COMMIT;
    14. #有问题,回滚
    15. ROLLBACK;
    16. #设当张三账号上-500 元,服务器崩溃了。李四的账号并没有+500 元,数据就出现问题了。
    17. #我们需要保证其中一条 SQL 语句出现问题,整个转账就算失败。
    18. #只有两条 SQL 都成功了转账才算成功。这个时候就需要用到事务
    修改默认提交方式       

     set  @@autocommit = 0

    查看事务的默认提交方式

    select @@autocommit ; -- 1代表自动提交,0代表手动提交

    自动提交与手动提交的区别

    自动提交与手动提交的区别:自动提交下所有的修改都是有效的,而手动提交下如果没有提交,那么所有的修改都是临时的,再关闭程序后,数据库将恢复修改前的状态。每次修改都必须写入commit。Mysql默认的是自动提交,可以通过上述两个命令修改提交方式。

     事务的四大特征

    原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败

    持久性:事务提交或回滚后,事务会持久化的保存数据

    隔离性:多个事务之间相互独立。

    一致性:事务操作前后,数据总量不变。

    事务的隔离级别

    概念:多个事务之间是隔离的,相互独立的。如果多个事务操作同一批数据,会引发一些问题,设置不同的隔离级别就可以解决这些问题。

    多个事务操作同一批数据引发的问题:

    脏读:一个事务读到另一个事务没有提交的数据

    不可重复读(虚读):同一个事务中,两次读取到的数据不一样

    幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条事务,则第一个事务查询不到自己的修改。

    隔离级别:

    read uncommitted:读未提交                                        不commit也会显示修改后的结果

    产生的问题:脏读 ,不可重复读,幻读

    read committed:读已提交                                (Orcale默认)修改方commit后会显示结果;

    产生的问题:不可重复读,幻读

    repeatable committed:可重复读                (Mysql默认)两边同时commit,才会显示修改后的结果

    产生的问题:幻读

    serializable :串行化                                            直接给数据库加锁,修改方commit后才会显示结果

    可以解决所有问题;

    注意:隔离界别从小到大安全性越来越高,但效率越来越低;

    隔离级别表格:
    隔离级别效果
    read uncommitted读未提交不commit也会显示修改后的结果
    read committed读已提交修改方commit后会显示结果;
    repeatable committed可重复读两边同时commit,才会显示修改后的结果
    serializable串行化 直接给数据库加锁,修改方commit后才会显示结果

    注意:隔离界别从小到大安全性越来越高,但效率越来越低;

    隔离级别就是为了不同线程操纵同一内存单元而出现的。

    数据库设置隔离级别    

    set global transaction isolation level 级别字符串;

    数据库查询隔离级别:

    select @@tx_isolation;

    带设置隔离级别的sql语句流程

    设置级别(set global transaction isolation level 级别字符串; 只有关闭后再开才会有效)

    开启事务(start transaction,                                                 两边同时开才有效)

    进行操作(日常语句)

    commit (提交,不同隔离级别的区别就在于commit是否提交,是否同时提交)


    DCL管理用户,授权

    管理用户
    添加用户
    1. #创建用户
    2. CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
    3. CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY '123';
    删除用户
    1. #删除用户
    2. DROP USER '用户名'@'主机名';
    3. DROP USER 'zhangsan'@'localhost';
    修改用户密码
    1. #修改密码
    2. SET PASSWORD FOR '用户名'@'主机名'=PASSWORD('新密码');
    3. UPDATE USER SET PASSWORD=PASSWORD('新密码')WHERE USER='用户名';
    4. UPDATE USER SET PASSWORD=PASSWORD('12334')WHERE USER='lisi';
    5. SET PASSWORD FOR 'lisi'@'%'=PASSWORD('456');
    查询用户
    1. #查询用户
    2. #切换mysql数据库
    3. USE mysql;
    4. #查询user
    5. SELECT*FROM USER;
    6. # 通配符 %表示可以在任意主机使用用户登录数据库
    mysql中忘记用户密码处理步骤
    mysql中忘记用户密码处理步骤
    1.cmd--> net stop mysql   停止mysql服务(需要在管理员权限下运行)
    2。使用无验证方式启动mysql服务 :mysqld --skip-grant-tables(执行后,在新打开的窗口中输入mysql就能开启mysql服务)

    3.使用sql语句修改密码:

    use mysql

    update user set password =password('密码') where user='用户名'

    4.关掉窗口->打开任务管理器->结束掉mysql进程->再打开mysql服务->在管理员权限下打开cmd ,之后输入net start mysql
    5.输入新密码即可
    授权
    查询用户权限
    1. #查询权限
    2. SHOW GRANTS FOR '用户名'@'主机名';
    3. SHOW GRANTS FOR 'lisi'@'%';
    授予权限
    1. #授予权限
    2. GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
    3. GRANT SELECT ON db3.`account` TO 'lisi'@'%'; #授予lisi 对db3.account表select 的权限
    4. #授予lisi 对所有表所有权限;使用通配符,所有权限:ALL 所有库的所有表:*.*
    5. GRANT ALL ON *.* TO 'lisi'@'%';#之后lisi可以对所有表使用所有命令
    撤销权限
    1. #撤销权限
    2. REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
    3. #撤销lisi 对所有表所有权限;使用通配符,所有权限:ALL 所有库的所有表:*.*
    4. REVOKE UPDATE ON *.* TO 'lisi'@'%';#之后lisi不能对任何表进行任何操作

    JDBC概念

    jdbc步骤:
    导入jar包

    在模块下新建文件夹(Dierctory),将jar文件复制到文件夹中,右键jar文件,选择Add as library

    注册驱动

    Class.forName("com.mysql.jdbc.Driver");将Driver类的代码块加载入内存;

    获取数据库连接对象 Connection

    定义sql
    获取执行sql语句的对象Statement
    执行sql,接受返回结果
    处理结果
    释放资源
    1. public static void main(String[] args) throws ClassNotFoundException, SQLException {
    2. //导入jar包
    3. //注册驱动
    4. //新建一个文件夹lib,将jar包拖动到文件夹中
    5. //选中lib右键,单击 add as library
    6. Class.forName("com.mysql.jdbc.Driver");
    7. //获取数据库连接对象 Connection
    8. Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root","root");
    9. //三个参数:要链接的数据库,用户名,密码
    10. //定义sql
    11. String sql="update account set balance =500 where id=1";
    12. //获取执行sql语句的对象Statement
    13. Statement stmt=conn.createStatement();
    14. //执行sql,接受返回结果
    15. int count= stmt.executeUpdate(sql);
    16. //处理结果
    17. System.out.println(count);
    18. //释放资源
    19. stmt.close();
    20. conn.close();
    21. }
     JDBC类详解
    DriverManager 驱动管理对象

    功能:注册驱动   注册与给定的驱动程序 DriverManager

    Class.forName("com.mysql.jdbc.Driver");将Driver类的代码块加载入内存;通过查看源码,发现com.mysql.jdbc.Driver类存在静态代码块,该语句将使用mysql接口。注意mysql5之后的驱动jar包可以省略注册驱动的步骤

    1. static {
    2. try {
    3. java.sql.DriverManager.registerDriver(new Driver());
    4. } catch (SQLException E) {
    5. throw new RuntimeException("Can't register driver!");
    6. }
    7. }

    总的来说 Class.forName("com.mysql.jdbc.Driver");是第一步,任何使用mysql的程序都需要

    获取数据库链接

    获取数据库连接的方法:

     方法各参数的意义:

    url:指定连接的路径(网络连接电脑的ip地址,端口),有固定语法(jdbc:mysql//ip地址:端口号/数据库名称)例子:"jdbc:mysql://localhost:3306/db3",即连接ip地址为本机,端口为3306,名为db3的数据库。

    注意:如果连接的是本机的mysql服务器,且mysql服务默认端口为3306.则url可以简写为:"jdbc:mysql:///数据库名称",即省略掉ip名和端口号;

    user:用户名

    password:密码


    Connection 数据库连接对象 

            功能:

                    1.获取执行sql的对象

                            Statement createStatement();

                            PreparedStatement prepareStatement(String sql);

                    2.管理事务:封装相关对象来开启,回滚,关闭事务

                            开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务;

                            关闭事务 commit();

                            回滚事务:rollback();

    Statement执行sql的对象

            1.执行sql:boolean execute(String sql)  执行sql语句,可能返回多个结果(不常使用);

            2.int executeUpdate(String sql):执行DML(insert,update,delete)语句,DDL语句(create,alter ,drop语句),返回值是影响的行数(通过返回行数判断DML执行是否成功,小于0说明失败);

            3.ResultSet executeQuery(String sql)执行DQL语句(select语句)常用

    ResultSet结果集对象

            封装查询语句的结果方法:

                    next();游标向下移动一行,用来获取数据

         getXxx();获取数据Xxx代表数据类型next()会指向一行,getXxx()获取该行某个类型的元素;

       getXxx(int)传入列的编号,得到列的值,参数为列所在编号,从1 开始,如1代表第一列的数据,

        getXxx(String)传入列的名称,得到列的值

    注意:使用步骤:

    1.游标向下移动,根据next()的返回值判断是否有数据(next返回值是boolean类型的)

    2.获取数据

    1. public class jdbcdemo5 {
    2. public static void main(String[] args) {
    3. Connection conn=null;
    4. Statement stmt=null;ResultSet rest=null;
    5. try {
    6. //注册驱动
    7. Class.forName("com.mysql.jdbc.Driver");
    8. //获取连接
    9. conn= DriverManager.getConnection("jdbc:mysql:///db3","root","root");
    10. //获取执行sql的对象
    11. stmt=conn.createStatement();
    12. //sql语句
    13. String sql="select * from account";
    14. rest= stmt.executeQuery(sql);
    15. //处理结果
    16. //让游标向下移动一行;
    17. while(rest.next()){
    18. //获取数据
    19. int id= rest.getInt(1);
    20. String name= rest.getString("name");
    21. double balance= rest.getDouble(3);
    22. System.out.println(id+"---"+name+"---"+balance);
    23. }
    24. } catch (ClassNotFoundException e) {
    25. throw new RuntimeException(e);
    26. }catch (SQLException e) {
    27. throw new RuntimeException(e);
    28. }
    29. finally{
    30. if(rest!=null){
    31. try {
    32. rest.close();
    33. } catch (SQLException e) {
    34. throw new RuntimeException(e);
    35. }
    36. }
    37. if(conn!=null){
    38. try {
    39. conn.close();
    40. } catch (SQLException e) {
    41. throw new RuntimeException(e);
    42. }
    43. }
    44. if(stmt!=null){
    45. try {
    46. stmt.close();
    47. } catch (SQLException e) {
    48. throw new RuntimeException(e);
    49. }
    50. }
    51. }
    52. }
    53. }

    抽取JDBC工具类,抽取重复代码,简化书写

    注册驱动

    抽取一个方法获取连接对象

    需求:不想传递参数(麻烦),还得保证工具类的通用性

    释放资源

    1. public class jdbc_utils {
    2. private static String url;
    3. private static String user;
    4. private static String password;
    5. private static String driver;
    6. static {
    7. //读取资源文件,获取值
    8. try {
    9. //创建Properties,将字符串读入内存,
    10. Properties pro=new Properties();
    11. //获取src路径下的文件的方式--->ClassLoader 类加载器,可以将src下的资源加载如内存;使用反射
    12. //反射:从当前对象获取信息,进而使用
    13. ClassLoader classLoader= jdbc_utils.class.getClassLoader();
    14. URL res= classLoader.getResource("jdbc.properties");//传递的是文件名,返回URL对象
    15. String path= res.getPath();
    16. pro.load(new FileReader(path));
    17. //从文件中获取数据,赋值
    18. url=pro.getProperty("url");
    19. user=pro.getProperty("user");
    20. password=pro.getProperty("password");
    21. driver=pro.getProperty("driver");
    22. //注册驱动
    23. Class.forName(driver);
    24. } catch (IOException e) {
    25. throw new RuntimeException(e);
    26. } catch (ClassNotFoundException e) {
    27. throw new RuntimeException(e);
    28. }
    29. }
    30. //获取连接,返回连接对象
    31. //通过配置文件解决:不想传递参数,还得保证工具类的通用性的需求;
    32. public static Connection getConnection() throws SQLException {
    33. return DriverManager.getConnection(url,user,password);
    34. }
    35. //释放资源
    36. public static void close(Statement stmt, Connection conn){
    37. if(stmt!=null){
    38. try {
    39. stmt.close();
    40. } catch (SQLException e) {
    41. throw new RuntimeException(e);
    42. }
    43. }
    44. if(conn!=null){
    45. try {
    46. conn.close();
    47. } catch (SQLException e) {
    48. throw new RuntimeException(e);
    49. }
    50. }
    51. }
    52. //释放资源
    53. public static void close(Statement stmt, Connection conn, ResultSet res){
    54. if(stmt!=null){
    55. try {
    56. stmt.close();
    57. } catch (SQLException e) {
    58. throw new RuntimeException(e);
    59. }
    60. }
    61. if(conn!=null){
    62. try {
    63. conn.close();
    64. } catch (SQLException e) {
    65. throw new RuntimeException(e);
    66. }
    67. }
    68. if(res!=null){
    69. try {
    70. res.close();
    71. } catch (SQLException e) {
    72. throw new RuntimeException(e);
    73. }
    74. }
    75. }
    76. }

    PreparedStatement执行sql的对象

    sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题;

            解决sql注入问题:使用preparedStatement对象来解决;使用预编译sql可以解决sql注入问题

    预编译sql:参数使用?作为占位符替代,我们只需给?赋值即可;代码如下:

    1. //定义sql
    2. String sql = " select *from user where username=? and password=? ";
    3. //获取执行sql的对象
    4. pstmt = conn.prepareStatement(sql);
    5. //给?赋值
    6. pstmt.setString(1,username);
    7. pstmt.setString(2,password);
    8. //执行sql语句,查询
    9. rs = pstmt.executeQuery();
    使用jdbc控制事务

    事务指包含多个步骤的业务操作,多个步骤要么同时成功,要么同时失败,jdbc中使用Connection来管理事务

    1.开启事务:setAutoCommit(bollean autocommit):调用该方法设置参数为false,开启事务

                                    建立连接后,就开启事务

    2.提交事务:commit(),try语句的最后

    3.回滚事务:rollback();catch语句中

    代码示例
    1. public static void main(String[] args) {
    2. Connection conn=null;
    3. PreparedStatement pstmt2=null;
    4. PreparedStatement pstmt1=null;
    5. //获取数据库连接
    6. try {
    7. conn= jdbc_utils.getConnection();
    8. //开启事务
    9. conn.setAutoCommit(false);
    10. //定义sql,加钱,减钱
    11. String sql1="update account set balance =balance-? where id=?";
    12. String sql2="update account set balance =balance+? where id=?";
    13. //获取执行sql的对象
    14. pstmt1= conn.prepareStatement(sql1);
    15. pstmt2=conn.prepareStatement(sql2);
    16. //设置参数
    17. pstmt1.setDouble(1,500);
    18. pstmt1.setDouble(2,1);
    19. pstmt2.setDouble(1,500);
    20. pstmt2.setDouble(2,2);
    21. //执行语句
    22. pstmt1.executeUpdate();
    23. pstmt2.executeUpdate();
    24. //提交事务
    25. conn.commit();
    26. } catch (Exception e) {
    27. //回滚
    28. try {
    29. if(conn!=null)
    30. conn.rollback();
    31. } catch (SQLException ex) {
    32. throw new RuntimeException(ex);
    33. }
    34. throw new RuntimeException(e);
    35. }
    36. finally
    37. {
    38. jdbc_utils.close(pstmt1,conn);
    39. jdbc_utils.close(pstmt1,null);
    40. }
    41. }
    jdbc连接池
    数据库连接池

    存放数据库连接的容器,当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户访问数据库时,从容其中获取连接对象,访问完后,将连接对象归还给容器;

    c3p0连接池使用步骤

    1.导入jar包:将图中三个文件复制到同意模块下的文件夹中,并 add as library;

    2.定义配置文件:将 c3p0-config.xml复制到src下

    3.连接池的参数:可以定义自己的连接池参数

    ComboPoolDataSource为空参时将使用默认的连接池,如果传入字符串对象,将使用名为字符串的连接池参数;

     4.创建核心对象,数据库连接池对象 ComboPooledDataSource;

    5.获取连接 getConnection

    注意:如果Connection对象来自连接池,那么close()方法将归还资源而非释放资源。

    1. public class c3p0demo2 {
    2. public static void main(String[] args) throws SQLException {
    3. //获取连接池,使用默认配置
    4. DataSource ds=new ComboPooledDataSource();
    5. //获取连接处,使用指定名称的配置
    6. //获取连接对象
    7. Connection conn=ds.getConnection();
    8. System.out.println(conn);
    9. new c3p0demo2().testNamedConfig();
    10. }
    11. public void testNamedConfig() throws SQLException {
    12. //获取连接处,使用指定名称的配置
    13. DataSource ds=new ComboPooledDataSource("otherc3p0");
    14. for (int i = 0; i <8 ; i++) {
    15. Connection conn=ds.getConnection();
    16. System.out.println(i+" "+conn);
    17. }
    18. }
    19. }
    Druid使用步骤

    1.导入jar包 druid-1.0.9.jar以及数据库驱动jar包,注意要在src的同一模块下导入文件,并add as library

    2.定义配置文件:必须是properties形式的,可以放置在任意的目录下,不必放在src下,但需要手动加载。手动加载代码的方法有两种

    1. Properties pro=new Properties();
    2. /*常规方法,将druid.properties加载近内存
    3. ClassLoader cs= druiddemo1.class.getClassLoader();
    4. URL u=cs.getResource("druid.properties");
    5. String s=u.getPath();
    6. pro.load(new FileReader(s));
    7. */
    8. //新方法,直接获取字节流
    9. InputStream is= druiddemo1.class.getResourceAsStream("druid.properties");
    10. //获取资源的字节流
    11. pro.load(is);

    3.获取数据库连接池对象:通过工厂类来获取 DruidDataSoourceFactory

    1. //获取连接池对象
    2. DataSource ds= DruidDataSourceFactory.createDataSource(pro);

    4.获取连接:getConnection

    1. //获取链接
    2. Connection conn=ds.getConnection();

    整体代码如下:

    1. public static void main(String[] args) throws Exception {
    2. //导入jar包
    3. //定义配置文件
    4. //加载配置文件
    5. Properties pro=new Properties();
    6. /*常规方法,将druid.properties加载近内存
    7. ClassLoader cs= druiddemo1.class.getClassLoader();
    8. URL u=cs.getResource("druid.properties");
    9. String s=u.getPath();
    10. pro.load(new FileReader(s));
    11. */
    12. //新方法,直接获取字节流
    13. InputStream is= druiddemo1.class.getResourceAsStream("druid.properties");
    14. //获取资源的字节流
    15. pro.load(is);
    16. //获取连接池对象
    17. DataSource ds= DruidDataSourceFactory.createDataSource(pro);
    18. //获取链接
    19. Connection conn=ds.getConnection();
    20. System.out.println(conn);
    21. }
     定义jdbc_utils工具类,简化连接池代码

    1.定义一个类jdbc_utils,

    2.提供静态代码块加载配置文件,初始化连接池对象

    3.提供方法:

            获取连接方法

            释放方法

            获取连接池

    1. public class jdbc_utils {
    2. //定义成员变量
    3. private static DataSource ds;
    4. //初始化赋值
    5. static{
    6. try {
    7. //加载配置文件
    8. Properties pro=new Properties();
    9. InputStream is= jdbc_utils.class.getClassLoader().getResourceAsStream("druid.properties");//获取资源的字节流
    10. pro.load(is);
    11. //赋值
    12. ds= DruidDataSourceFactory.createDataSource(pro);
    13. } catch (IOException e) {
    14. throw new RuntimeException(e);
    15. } catch (Exception e) {
    16. throw new RuntimeException(e);
    17. }
    18. }
    19. //获取链接
    20. public static Connection getConnection() throws SQLException {
    21. return ds.getConnection();
    22. }
    23. //释放资源
    24. public static void close(Statement stmt, Connection conn) {
    25. if(stmt!=null){
    26. try {
    27. stmt.close();
    28. } catch (SQLException e) {
    29. throw new RuntimeException(e);
    30. }
    31. }
    32. if(conn!=null){
    33. try {
    34. conn.close();
    35. } catch (SQLException e) {
    36. throw new RuntimeException(e);
    37. }
    38. }
    39. }
    40. //释放资源
    41. public static void close(ResultSet rs, Statement stmt, Connection conn){
    42. if(rs!=null){
    43. try {
    44. rs.close();
    45. } catch (SQLException e) {
    46. throw new RuntimeException(e);
    47. }
    48. }
    49. close(stmt,conn);
    50. }
    51. //获取连接池
    52. public static DataSource getDataSource(){
    53. return ds;
    54. }
    55. }
    Spring jdbc:jdbc template

    Spring 框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

    步骤:

    1.导入jar包:

    2.创建JDBCTemplate对象。依赖于数据源DataSource

    3.调用JDBCTemplate方法来完成CRUD的操作;常用方法如下:

            update():执行DMl语句,增删改语句

            queryForMap():查询结果将结果集封装为map集合

            queryForList():查询结果将结果封装为list集合

            query():查询结果,将结果封装为javabean对象

            queryForObject:查询结果,将结果封装为对象

     

     JavaWeb

    软件架构

    C/S架构 Client/Server 客户端/服务器端

            用户本地有一个客户端程序,远程有一个服务器端程序

            优点:用户体验好

            缺点:开发,安装,部署,维护麻烦

    B/S架构:Browser/Server 浏览器/服务器端

            只需要一个浏览器,用户通过不同的网址(URL),访问不同的服务器端程序

            优点:开发,安装,部署,维护简单

            缺点:应用过大时用户的体验会受到影响;对硬件要求过高。

    注意:JavaWeb是B/S架构

    B/S架构详解:

            静态资源详解

                    使用静态网页开发技术发布的资源。

                    特点:所有用户访问,得到的结果是一样的。如:文本,图片,音频,视频;如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器,浏览器内置了静态资源的解析引擎,可以展示静态资源。

            动态资源详解

                   使用动态网页及时发布的资源

                    特点:所有用户访问,得到的结果可能不一样。如jsp/servlet,php,asp.....如果用户请求的是动态资源,服务器将会执行动态资源,转换为静态资源,再发送给浏览器(因为浏览器只能解析静态资源)。

    静态资源三剑客:HTML,CSS,JavaScript

            HTML:搭建基础网页,展示页面的内容,

            CSS:用于美化页面,完成页面的美化和布局

            JavaScript:控制页面的元素,让页面有一些动态的效果

    HTML

            Hyper Text Markup Language 超文本标记语言

                    超文本:用超链接的方法,将各种不同空间的文字信息组织在一起的网状文

                    标记语言:有标签构成的语言。<标签名称>如html,xml;标记语言不是编程语言。

    HTML语法:文件名.html或.htm

    标签

    1.标签分类:1.围堵标签,如开始标签和结束标签:,围堵标签是可以嵌套的标签

           

                            title

            

           

                            Hello World

           

    2.自闭和标签:开始标签和结束标签在一起,如

    3.在开始标签中可以定义属性,属性有键值对构成,值可以用引号(单,双均可)引起来。

    4.html标签不区分大小写,但是建议使用小写。

    文本标签 和文本有关的标签

    to

                标题标签,格式为:

    xx

        

    ~

    h1~h6的字号不同,其余相同,

                               段落标签,格式为

    xx



    )               换行


                   显示一条水平线,格式:
    或者
    可以设置线的颜色和宽度,粗细,对齐方式分别为红,200,10,左对齐

    水平线的属性有:

    color        颜色

    width        宽度,赋值方式:

                            1.数值,单位是像素(px),width='20',20像素

                            2.百分比,相比于屏幕的大小,

    size        粗细

    align :center,left,right

                    字体加粗 格式:百日衣衫尽

                    字体斜体               白日依山尽

            字体标签(修改字体的字号,大小,风格等)语法:xxxxx

    属性包括:

    color色彩,赋值方式:

    1.red,green,blue;        白日依山尽

    2.RGB(值1 ,值2,值3)白日依山尽

    3.#值1值2值3(00~FF之间,采用16进制)

    白日依山尽

    size大小()赋值方式       

    face:字体(楷体等)

     白日依山尽  

    作用:可以让文本居中

    标签汇总表格
    标签名称作用示例

    to

    标题标签

    xx

     

    段落标签

    xx


     换行单独一个

       
    显示一条水平线
     字体加粗百日衣衫尽
     字体斜体     白日依山尽
     字体标签(修改字体的字号,大小,风格等)  白日依山尽
    可以让文本居中
     白日依山尽  
    特殊字符的显示

    图片标签

    自闭和标签:

    示例:古镇

    src用于指定图片的路径(一般写相对路径 ./代表当前目录如./image/1.jpg,如果不写./则系统默认为当前路径。../代表后退上一级目录,如./代表同一模块下的文件,../则是上一级项目下的文件)

    列表标签
            有序列表

            ol:

            li:

    1. <ol type="A" start="5">
    2. <li>睁眼li>
    3. <li>看手机li>
    4. <li>穿衣服li>
    5. <li>洗漱li>
    6. ol>
            无序列表

            ul:

            li:

    1. <ul type="circle">
    2. <li>睁眼li>
    3. <li>看手机li>
    4. <li>穿衣服li>
    5. <li>洗漱li>
    6. ul>
    链接标签

            重要属性:

    href代表要访问的资源,不仅指网络资源,也可以指内存中的资源

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>链接标签title>
    6. head>
    7. <body>
    8. <a href="https://mp.csdn.net/mp_blog/creation/editor/133555152?not_checkout=1" target="_self">点我a>
    9. <a href="https://mp.csdn.net/mp_blog/creation/editor/133555152?not_checkout=1" target="_blank">点我a>
    10. <a href="./公司简介.html" target="_blank">点我a>
    11. <a href="mailto:1911684644@qq.com">联系我们a>
    12. <a href="https://mp.csdn.net/mp_blog/creation/editor/133555152?not_checkout=1"> <img src="../image/banner_1.jpg">a>
    13. body>
    14. html>
    div和span
    语义化标签 控制文本样式

    提高程序的可读性

    header:

     

    footer:

    表格标签

    HTML标签:表单标签

    1. <form action ="#" method="get">
    2. 用户名:<input nmae="username"><br>
    3. 密码: <input name="password"><br>
    4. <input type="submit" value="登录">
    5. form>

    JavaScript

    语法:  定义变量:var 变量名=初始化值,访问变量:alert(变量名);

    运算符
    运算符作用
    typeof运算符typeof(变量名)
    一元运算符++,--,+(),+,-+,-用于类型转换
    算术运算符+,-,*,/,%
    赋值运算符=,+=,-=
    比较运算符>,<,>=,<=,==,===

    类型相同,直接比较,类型不同,先转换在比较,字符串按照字典顺序比较。运算符返回boolean。

    ===:在比较前,先判断类型,如果类型不一样,直接返回false;即及比较类型,也比较值

    逻辑运算符&&,||,!

    存在短路,即前一个条件可以决定表达式返回值是,就不再计算整个表达式了,直接返回。

    !:其他类型转boolean:

    num转boolean:0,NaN为false,其他为true

    String 转boolean:空字符串为false,其余为true

    null,undefined转boolean:都是false

    对象:所有对象都为true;

    三元运算符?:

    +,-可以帮助类型转换。如String转number,如果字面值不全部是数字,则转为NaN(不是数字的数字)如“123”可以转换为123,但“abc”只能转换为 NaN;

    boolean 转number: true转为1,false转为0;

     示例

    1. <script>
    2. var a=3;
    3. var num=1;
    4. var nm2=1.2;
    5. var num3=NaN;
    6. //输出到页面上
    7. document.write(num+"..."+typeof(num)+"
      "
      );
    8. document.write(nm2+"..."+typeof(nm2)+"
      "
      );
    9. document.write(num3+"..."+typeof(num3)+"
      "
      );
    10. var flag=true;
    11. document.write(flag+typeof (flag)+"
      "
      );
    12. var n=null;
    13. document.write(n+typeof(n)+"
      "
      );
    14. var m=undefined;
    15. document.write(m+typeof(m)+"
      "
      );
    16. var num23=3;
    17. var a=num23++;
    18. document.write(a+" "+num23+"
      "
      );
    19. var acum=+"123";
    20. document.write("124"<124+"
      "
      );
    21. var c=3>4?1:0;
    22. alert(c);
    23. script>
    javascript特殊语法
    javascript特殊语法
    1.javascript语句以;结尾,,若一行只有一条语句,则;可以省略。
    2.变量的定义使用var关键字,也可以不使用,用var定义的是局部变量,不用var定义的是全局变量;
    流程控制语句
    javascript流程控制语句
    if...else
    switch可以接受所有数据类型
    while
    do...while
    for

    实现99乘法表

    1. <style>
    2. td{
    3. border:1px solid ;
    4. }
    5. style>
    6. <script>
    7. var a=1;
    8. switch(a){
    9. case 1:alert("number");break;
    10. case "abc":alert("string");break;
    11. case true:alert("true");break;
    12. case null:alert("null");break;
    13. case undefined:alert("undefined");break;
    14. }
    15. var i=2;
    16. while(i<=100){
    17. a+=i;
    18. i++;
    19. }
    20. alert(a);
    21. for(var oo=1;oo<100;oo++){
    22. a+=oo;
    23. }
    24. document.write("")
    25. var w=0;
    26. for(var j=1;j<=9;j++)
    27. {
    28. document.write("
    29. ");
    30. for(var k=1;k<=j;k++){
    31. document.write("
    32. ");
    33. }
    34. document.write("
    35. ");
    36. }
    37. alert(a)
    38. script>
    39. ")
    40. document.write(i+"*"+j+"="+(k*j)+" $nbsp;$nbsp;");
    41. document.write("
    42. ECMAScript基本语法

      javascript基本对象
      Function 函数对象//创建
              //var fun=new Function(形参列表,方法体);基本不用
              //function 方法名称 (形参列表) { 方法体} 形参列表里可以不写形参的类型
              // // var 方法名=function(形参列表){方法体}; //可以不写var;
      //方法
      //属性 //length:形参的个数
      //特点
              //形参类型,返回类型都可以不写;
              //当函数特征标完全相同时,javascript会出现覆盖,而不会报错;
              //函数前的var可以不写;
              //形参都有默认值,且形参本质是形参数组,即可变参数,因此即使不传参,少传参,多传参,也能调用方法;
              //在方法的声明中有一个隐藏的内置对象(数组),arguments,封装所有的实际参数
              //返回值类型可以不屑,因为只有一种,即var;

      //调用   //方法名称(实际参数列表)

      Array 数组

      //创建
              // var arr=new Array(元素列表)
              // var arr=new Array(默认长度)
              // var arr= [元素列表]

      //方法
              //join(参数)将数组中的元素按分隔符拼接为字符串,参数即分隔符默认为","
              //push()再数组末尾添加元素;

       
      //属性
      //特点
              //JS中,元素的类型是可变的;数组的长度也是可变的;访问越界时会自动扩容;
      Boolean
      Date

      //创建
              //var Date=new Date()//默认是美国时间

      //方法
              //toLocalString():返回date对象对应的本地时间的字符串;
              //getTime():获取从1970/01/01到当前的毫秒值;
       
      //属性
      Math
      Number
      String
      RegExp正则表达式
      Global封装的方法可以直接调用,不需要对象

      Function

      // Function对象:函数()对象
      //创建
              //var fun=new Function(形参列表,方法体);基本不用
              //function 方法名称 (形参列表) { 方法体} 形参列表里可以不写形参的类型
              // // var 方法名=function(形参列表){方法体}; //可以不写var;
      //方法
      //属性
              //length:形参的个数
      //特点
              //形参类型,返回类型都可以不写;
              //当函数特征标完全相同时,javascript会出现覆盖,而不会报错;
              //函数前的var可以不写;
              //形参都有默认值,且形参本质是形参数组,即可变参数,因此即使不传参,少传参,多传参,也能调用方法;
              //在方法的声明中有一个隐藏的内置对象(数组),arguments,封装所有的实际参数
              //返回值类型可以不屑,因为只有一种,即var;
      //调用
              //方法名称(实际参数列表)

      1. var fun1=new Function("a","b","alert(a);");
      2. //fun1(3,4)
      3. function fun2( a, b){
      4. alert(a+b);
      5. }
      6. //fun2(2,3)
      7. fun3=function(a,b){alert(a+b);}
      8. // fun3(4,65)
      9. alert(fun3.length)
      10. function add(){
      11. var sum=0;
      12. for(var i=0;i<arguments.length;i++){
      13. sum+=arguments[i]
      14. }
      15. return sum
      16. }
      17. var sum= add(1,3,4,5,6,7);
       Array数组

      //创建
              // var arr=new Array(元素列表)
              // var arr=new Array(默认长度)
              // var arr= [元素列表]

      //方法
              //join(参数)将数组中的元素按分隔符拼接为字符串,参数即分隔符默认为","
              //push()再数组末尾添加元素;

       
      //属性
      //特点
              //JS中,元素的类型是可变的;数组的长度也是可变的;访问越界时会自动扩容;
       
      1. var arr=new Array(1,2,3,4)
      2. var arr1=new Array(5)
      3. var arr3=[4,5,6,7]
      4. var arr4=[1,"asd",true,null];
      5. document.write(arr+"
        "
        )
      6. document.write(arr3+"
        "
        )
      7. document.write(arr4+"
        "
        )
      8. arr4.push(11);
      9. document.write(arr4.join("--")+"
        "
        )
       Date

      //创建
              //var Date=new Date()//默认是美国时间
      //方法
              //toLocalString():返回date对象对应的本地时间的字符串;
              //getTime():获取从1970/01/01到当前的毫秒值;
      //属性

      1. var data=new Date();
      2. document.write(data+"
        "
        );
      3. document.write(data.toLocaleDateString());
       Math

      /**
      * //方法:
      *         random():产生0~1之间的随机数。
      *        floop():向下取整
      *         cell():向上取整
      *         round():四舍五入
      * //创建
      *         //不用创建,直接使用:Math.方法名();
      * //属性
      *         //PI:圆周率
      */

      1. document.write(Math.PI+"
        "
        );
      2. document.write(Math.round(3.14)+"
        "
        );
      3. document.write(Math.random()+"
        "
        );
       RegExp正则表达式对象

      /**
      * RegExp:
      *         单个字符[]:[a-zA-Z0-9_]
      * 特殊符号代表特殊含义的单个字符:
      *         \d单个数字字符;
      *         \w单个单词字符;
      * 量词符号
      *         *出现0次或多次
      *         ?出现0次或1次
      *         +出现1次或多次
      *         表示数量:{m,n}:m<=数量<=n;{,m}最多m次;{m,}最少m次
      *         6~12位单词:\w{6,12}
      *         \w*出现多次的单词字符;

      *正则对象:
      *         创建:
      *         var reg=new RegExp("正则表达式");
      *         var reg=/正则表达式/
      * 方法
      *         test(参数);验证字符串是否正则符合规则
      *
      * 开始结束符号:
      *         ^:开始
      *         $结尾

      */

      1. var reg=new RegExp("^\\w{6,12}\\d{2,3}$");
      2. var reg2=/\w{6,12}/;
      3. alert(reg)
      4. var flag=reg2.test("wadadwd")
      5. alert(flag );
       Global

      /**
      * 特点:封装的方法可以直接调用,不需要对象
      * 方法:
      *         encodeURI():url编码
      *         decodeURI():url解码
      *         以下两种方法比上两种可编码的字符更多,可以编码网址
      *         encodeURIComponent url编码
      *         decodeURIComponent url解码
      *
      *         parseInt():将字符串转换成数字;将逐一判断每一个字符是否是数字,直到不是数字为止,将前边数字部分转为数字;
      *         如果一个数字也没有,就转换为NaN;
      *         isNaN():判断一个值是否是NaN;NaN六亲不认,NaN参与的==比较全部为false;
      *         eval():计算JavaScript字符串,把他转换为代码来执行(是代码写在字符串里,如“alert(a)”就可以被解析);
      */

      1. var str="你想干什么";
      2. var url=encodeURI(str)
      3. document.write(url+"
        "
        )
      4. var url1=decodeURI(url)
      5. document.write(url1+"
        "
        )
      6. var url23=encodeURIComponent(str)
      7. document.write(url23+"
        "
        )
      8. var url2=decodeURIComponent(url23)
      9. document.write(url1)
      10. var jscode="alert(123)"
      11. eval(jscode);

       事件

      某些组件被执行(点击)了某些操作后去触发某些代码的执行

      如何绑定时间:直接在html标签上,指定事件的属性,属性值就是js代码;

      1. "light" src="../image/image1/banner_1.jpg" onclick="func()">
      2. <img id="light1" src="../image/image1/banner_1.jpg" onclick="func()">
      3. <h1 id="ligh">悔创阿里h1>
      4. <script>
      5. function fun(){
      6. alert('我被点击了');
      7. alert('我又被点击了');
      8. alert('我又又被点击了');
      9. alert('我又又又被点击了');
      10. }
      11. function fun2(){
      12. alert('点击更新');
      13. }
      14. var light= document.getElementById("light");
      15. alert("我要换图片了");
      16. light.src="../image/image1/banner_2.jpg";
      17. alert("我要换内容了")
      18. var ligh=document.getElementById("ligh");
      19. ligh.innerHTML="坦然处之"
      20. document.getElementById("light1");
      21. light1.onclick=fun2;
      22. document.getElementById("light");
      23. light.onclick=fun;
      24. script>
      切换图片
      1. "../image/image1/banner_1.jpg" id="deng" >
      2. <script>
      3. var deng= document.getElementById("deng");
      4. var flag=false;
      5. deng.onclick=function(){
      6. if(flag){
      7. deng.src="../image/image1/banner_1.jpg";
      8. flag=false;
      9. }else{deng.src="../image/image1/banner_3.jpg";flag=true;}
      10. }
      11. script>

       BOM

       Window

      /**
      * 方法:
      * 1.与弹出框有关的方法:最常用的是confirm
      *         alert(),显示带有一段消息和一个确认按钮的警告框
      *         confirm,显示带有一段消息以及确认和取消按钮的对话框,点击确定,取消(方法返回true,false)之后可以根据返回值设置代码,该方法比较常用,
      *         prompt:显示可提示用户输入的对话框,返回值是用户输入的值
      * 2.与打开关闭有关的方法:
      *         open打开一个新的窗口,返回新窗口对象
      *         close:关闭窗口
      * 3.与定时器有关的方法:
      *         setTimeout:指定毫秒数后调用函数或计算表达式
      *                         参数1:要执行的语句(完整的)或者方法对象(不写括号)
      *                 参数2:毫秒值
      *         clearTimeout:取消由setTimeout设置的timeout,
      *属性

              1.获取其他BOM对象

                    history 获取历史记录

                    location

                    Navigator:

                   Screen:  

              2.获取DOM对象

                      document:

                      
      *特点
      *         Window对象不用创建,使用window.方法名()调用方法;也可以直接使用方法名调用方法;
      */

      1. //弹出框相关的方法:
      2. var flag= confirm("您确定要退出吗");
      3. alert(flag)
      4. if(flag){
      5. alert("欢迎下次光临")
      6. }else{
      7. alert("手别抖");
      8. }
      9. var res=prompt("请输入用户名");
      10. alert(res)
      11. //点击就打开窗口
      12. // 与打开关闭窗口有关的方法:
      13. var Btn= document.getElementById("openBtn");
      14. var newwindow;//关闭新窗口;
      15. Btn.onclick=function(){
      16. newwindow=open("https://www.baidu.com");
      17. }
      18. var closeBtn= document.getElementById("closeBtn");
      19. closeBtn.onclick=function(){
      20. newwindow.close();
      21. }
      22. function fun3(){
      23. alert('boom')
      24. }
      25. //一次定时器
      26. var idd= setTimeout("fun3();",1000);//3s后执行代码
      27. //循环定时器,如闹钟
      28. clearTimeout(idd);
      29. setInterval(fun3,1000);
      Location:地址栏对象

      /**
      * Location包含当前窗口的url
      * 方法:
      * reload:重新加载当前网页;
      * 属性
      * href:设置或获取当前窗口的路径
      */

       History:历史记录对象

      当前用户在当前页面访问过的url;

      /**
      * History
      *         属性
      *                 length:返回当前窗口历史列表中的url数量
      *         方法
      *                 back:加载history列表总前一个url
      *                 forward:加载history列表中洗一个url
      *                 go:加载history列表中某个具体页面
      *                         参数:
      *                                 正数 前进几个历史记录
      *                                 负数:后退几个历史记录
      */

      1. <body>
      2. <input type="button" id="btn" value="获取历史记录个数">
      3. <a href="02轮播图.html">轮播图页面a>
      4. <input type="button" id="forward" value="前进">
      5. <script>
      6. var btn=document.getElementById("btn");
      7. btn.onclick=function(){
      8. alert( history.length);
      9. }
      10. var btn1=document.getElementById("forward");
      11. btn1.onclick=function(){
      12. history.forward();
      13. }
      14. script>

       DOM

      功能:控制Html文档的内容(CRUD)

      代码:获取页面标签(元素)对象Element

              document.getElementById("id值")通过元素ID获取元素对象;获取后可以操作Element对象:

      修改属性值;修改标签体内容(标签内的值)注意,此时script代码要写到body的最后。

      1. "light" src="../image/image1/banner_1.jpg">
      2. <h1 id="ligh">悔创阿里h1>
      3. <script>
      4. var light= document.getElementById("light");
      5. alert("我要换图片了");
      6. light.src="../image/image1/banner_2.jpg";
      7. alert("我要换内容了")
      8. var ligh=document.getElementById("ligh");
      9. ligh.innerHTML="坦然处之"
      10. script>

       核心DOM 
      Document文档对象

      1. "div1">div1
      2. <div id="div2">div2div>
      3. <div id="div3">div3div>
      4. <div class="div5">div5div>
      5. <div class="div5">div4div>
      6. <input type="text" name="username">
      7. <script>
      8. var arr= document.getElementsByTagName("div");
      9. alert(arr.length);
      10. var arr1=document.getElementsByClassName("div5");
      11. alert(arr1.length);
      12. var username= document.getElementsByName("username");
      13. alert(username.length);
      14. script>
      Element对象

      1. <a>点我试一试a>
      2. <input type="button" value="设置属性" id="btn_set" >
      3. <input type="button" value="删除属性" id="btn_remove">
      4. <script>
      5. var bt_Set= document.getElementById("btn_set");
      6. bt_Set.onclick=function (){
      7. var element_e= document.getElementsByTagName("a")[0];//反射
      8. element_e.setAttribute("href","https://www.baidu.com");
      9. }
      10. var btn_remove=document.getElementById("btn_remove");
      11. btn_remove.onclick=function (){
      12. var element_e= document.getElementsByTagName("a")[0];//反射
      13. element_e.removeAttribute("href","https://www.baidu.com");
      14. }
      15. script>
      Node节点对象
      1. <div id="div1">div1div>
      2. <div id="div2">div2div>
      3. <script>
      4. var div1=document.getElementById("div1");
      5. div1.onclick=function (){
      6. div1.style.border="1px solid red";
      7. div1.style.width="200px ";
      8. div1.style.fontSize="40px ";
      9. }
      10. var innerHTML= div1.innerHTML
      11. div1.innerHTML+="";
      12. alert(innerHTML);
      13. var div2=document.getElementById("div2");
      14. div2.onclick=function(){
      15. div2.className="d1";
      16. }
      17. script>

      Bootstrap开发框架

      响应式布局

      同一套页面可以兼容不同分辨率的设备

      实现:依赖于栅格系统,将一行平均分成12个格子,可以指定元素占几个格子。

      xml

      xml第一行必须定义文档声明,xml文档中有且仅有一个根标签,标签的属性值必须用引号引起来,标签必须有结束。

       外部约束单独一个文件,内部约束写xml文件里

      http://repo1.maven.org/maven2

       maven中徐娅我们改的

      1. <groupId>com.itheimagroupId>
      2. <artifactId>project-javaartifactId>
      3. <version>1,0version>
      4. <packaging>jarpackaging>
      5. <properties>
      6. <maven.compiler.source>11maven.compiler.source>
      7. <maven.compiler.target>11maven.compiler.target>
      8. properties>
      9. <dependencies>
      10. <dependency>
      11. <groupId>junitgroupId>
      12. <artifactId>junitartifactId>
      13. <version>4.12version>
      14. dependency>
      15. dependencies>

      idea

      首先要设置jdk版本,即SDK选择为11

       其次要配置mavende home path,setting fille,local repository

       

      注意 archetype选择qucikstart,然后自己设置好gropuid,artcifactid,version

       完成;

    43. 相关阅读:
      小目标检测闲谈
      Spring - 单实例Bean 和 多实例Bean 的不同
      浏览器里设置代理的作用
      刷题知识回顾《五》二叉树的最近公共祖先
      AI数字人软件系统开发框架
      如何在USGS下载Landsat 8-9影像(2022年版)
      VUE+websocket编写实现PC web端控制摄像头
      Unity DOTS系列之Aspect核心机制分析
      jmeter压测
      游戏缺失d3dx9_39.dll的5个修复方法,深度解析d3dx9_39.dll文件的作用
    44. 原文地址:https://blog.csdn.net/qq_41790844/article/details/133555152