成都网站建设设计

将想法与焦点和您一起共享

mysql45讲怎么样,mysql45讲pdf

MySQL:脏页刷盘

InnoDB在处理更新语句时,先写内存再写redo log,并不会立即将数据页的更新落地到磁盘(WAL机制),这就会产生升内存数据页和磁盘数据页的数据不一致的情况,这种数据不一致的数据页称为 脏页 ,当脏页写入到磁盘(这个操作称为flush)后,数据一致后称为干净页。

创新互联建站服务项目包括泗洪网站建设、泗洪网站制作、泗洪网页制作以及泗洪网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,泗洪网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到泗洪省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

第3种是系统空闲不会有性能问题,第4种是要关闭了不考虑性能问题。第1和2的情况flush脏页会产生系统性能问题。

此时整个系统不能再更新了,更新数会降为0,所以这种情况要尽量避免。

InnoDB缓冲池(buffer pool)中的内存页有三种状态:

当一个SQL语句要淘汰的脏页数量太多,会导致语句执行的响应时间显著边长。

InnoDB为了避免出现上述两种情况,需要有控制脏页比例的策略,控制的主要参考因素就是:脏页比例和redo log写盘速度。

需要告诉InnoDB的磁盘读写能力(IOPS)让引擎全力flush脏页,磁盘的IOPS可以通过fio工具测试。

如果 innodb_io_capacity 参数设置的不合理,比如远远低于磁盘实际的IOPS,InnoDB会认为IO性能低,刷脏页速度会很慢,甚至低于脏页的生成速度,导致脏页累计影响查询和更新性能。

为了兼顾正常的业务请求,InnoDB引擎控制按照磁盘IOPS的百分比来刷脏页,具体流程如下:

脏页比例计算:

Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total

SQL语句如下:

在准备flush一个脏页时,如果相邻的数据页也是脏页,会把这个脏页一起flush,而且对这个新的脏页还可能有相邻的脏页导致连锁flush。

InnoDB使用 innodb_flush_neighbors 参数控制这个行为,值为1会产生上述连锁flush的情况,值为0则不会找相邻页。

找相邻页flush的机制虽然可以减少很多随机IO,但会增加一次flush时间,导致flush时的SQL语句执行时间变慢。

现在基本都使用的SSD这种IOPS比较高的硬盘,建议将 innodb_flush_neighbors 参数设为0,提高flush的速度。

flush会占用IO资源影响了正在执行的SQL语句,本来正常情况下执行很快的一条语句,突然耗时大大增加,造成业务抖动。要尽量避免这种情况,需要合理的设置 innodb_io_capacity 的值,并且多关注脏页比例,不要让脏页比例经常接近75%。

【极客时间】 MySQL实战45讲:第12节

Mysql45题

数据准备:

学生表 Student:

科目表 Course

教师表 Teacher

成绩表 SC

45题预览:

题目

1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

1.1 查询同时存在" 01 "课程和" 02 "课程的情况

1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ) 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况

2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

3.查询在 SC 表存在成绩的学生信息

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

4.1 查有成绩的学生信息

5.查询「李」姓老师的数量

6.查询学过「张三」老师授课的同学的信息

7.查询没有学全所有课程的同学的信息

8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

10.查询没学过"张三"老师讲授的任一门课程的学生姓名

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息

13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

14.查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为=60,中等为:70-80,优良为:80-90,优秀为:=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次

16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺

17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比

18.查询各科成绩前三名的记录

19.查询每门课程被选修的学生数

20.查询出只选修两门课程的学生学号和姓名

21.查询男生、女生人数

22.查询名字中含有「风」字的学生信息

23.查询同名同性学生名单,并统计同名人数

24.查询 1990 年出生的学生名单

25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

30.查询不及格的课程

31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名

32.求每门课程的学生人数

33.假设成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

34.假设成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

36.查询每门功成绩最好的前两名

37.统计每门课程的学生选修人数(超过 5 人的课程才统计)。

38.检索至少选修两门课程的学生学号

39.查询选修了全部课程的学生信息

40.查询各学生的年龄,只按年份来算

41.按照出生日期来算,当前月日 出生年月的月日则,年龄减一

42.查询本周过生日的学生

43.查询下周过生日的学生

44.查询本月过生日的学生

45.查询下月过生日的学生

详细

1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

理清思路:

(1)学生信息和课程分数分布对应于student表和sc表

所以,我们需要把它们关联起来

(2)需要比较同一学生的不同成绩,所以需要再关联成绩表sc

(3)利用where进行筛选

1.1 查询同时存在" 01 "课程和" 02 "课程的情况

?什么叫做同时存在‘01‘和’02‘课程

?这里是指cid=’01‘ and cid ='02'?

理清思路:同一个学生既选了01课程,又选了02课程

1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

?如何让不存在某课程时显示为null

利用左关联(left join)

?case when--no

1.3 查询不存在" 01 "课程但存在" 02 "课程的情况

思路:找到不存在01课程的记录后,

然后再进行关联(Inner join)找存在02的课程

或者

2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

思路:

成绩在sc表,学生姓名在student表,二者可以通过学生编号sid进行关联。

首先,从sc表中查询平均成绩大于60的学生的信息

ERROR 1111 (HY000): Invalid use of group function

出现这个错就要往group by这里考虑,要记得:group by +having+聚合函数。

一些错误尝试:

成功查询:

接着:通过学生编号sid与student表进行关联

发现结果明显不对,

继续修改:

注意:多个表进行关联时要明确字段的归属表;查询聚合函数的结果时,比如avg(score),最好进行重命名。

存在疑问:

上面两种写法的差别就在于 子查询的avg(score)是否重命名,但是二者的结果明显有差异,想请问是为什么?是不是哪里没注意到?

解答:

mysql对于group by的特殊规定:

如果用了group by,select语句里除了group by后面跟着的列名以外,只能有聚合函数。

如果除了group by后面跟着的列名和聚合函数还有其他列名,sql就会只输出第一行,而且如果是'*',也会只输出第一行记录。

举例说明:

总结:

如果用了group by +聚合函数,那么在查询的时候最好是只查询聚合函数(+group by 后的列名)避免在查询其余字段时只显示一条记录的情况。

注意:聚合函数是一定要查询的。

3.查询在 SC 表存在成绩的学生信息

思路:

(1)首先确定表:sc表和student表

发现名字有重复,

(2)利用group by sid去除重复的学生信息查询,具体如下:

注意:更严谨的写法:

(1)先写查询分组字段的子查询

(2)将(1)中的字段进行嵌套查询

注意:group by是分开写的

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null

(1)确定涉及的表的范围:

student,sc

(2)

思路:

修改:

(2)

(3)

也可以考虑先连接在查询,但还是建议上述这种方式。

4.1 查有成绩的学生信息

(1)首先确定使用的表范围

sc和student

(2)首先获得成绩表上的学生id

(3)根据id去查学生信息

?这个和第三题是完全一样的吗

回答:思路基本一致。

参考答案:

思路是:看学生表上的id是否在sc表的id中(即,判断存在)in/exists

5.查询「李」姓老师的数量

6.查询学过「张三」老师授课的同学的信息

(1)四张表都要用到

(2)四个嵌套

有什么简便方法吗?

回答:参考答案也是逐步嵌套查询实现的。

7.查询没有学全所有课程的同学的信息

(1)关键词:‘所有课程’在course表,‘同学信息’在student表,但是二者需要sid进行关联,所以还需要用到sc表

(2)如何筛选'所有课程’??

利用课程数目来进行限定。

a.course表获取总课程数

b.按照sid分组,对sc表中的课程数进行计数

c.接着从sc中筛选出课程数=3的学生sid

d.查询(3)中对应学生sid的学生信息

8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

(1)关键词:

‘至少有一门课’--课程in学号01同学的课程,‘学号01同学的课程’--course表,‘同学信息’--student表

(2)思路:

a. 01同学学习了什么课程

发现01同学三门课程都学了,所以其余学生只要学习的课程数大于0即可。

b. 学号01之外的学生id有哪些

c. 如何查询其余学生的课程信息,比如cid?

利用其余学生的id进行分组再计数,筛选

出次数大于0的学生id,再根据该id进行学生信息的查询。

9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

(1)确定相关表:

’01号同学学习的课程‘-sc表;

’其他同学的信息‘-student表;

(2)思路:

a. 01号同学学习了哪些课程

发现01同学学了三门课,

b.再查询总共有几门课?

所以,总共有3门课,01同学全部学习了,

c. 查询其余学生中学习课程数目为3的学生id

d. 再跟进相应id在student表中查询学生信息

10.查询没学过"张三"老师讲授的任一门课程的学生姓名

(1)确定相关表:

‘张三老师tid’--teacher;

‘张三老师授课cid’--course;

‘被授课的学生sid’--sc;

‘学生姓名sname’--student;

先找出学习过张三老师课程的学习,再not in即可。

(2)思路:

a.从teacher表中查询张三老师的tid

b.从course表中查询张三老师的授课cid

c. 从sc中查询学习cid=02的学生sid

d.利用not in 查询没学过张三老师课程的学生信息

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

(1)根据关键字确定相关表:

‘不及格课程数2’ score60--sc表,且count(1)3

'姓名'--student 表

(2)思路:

a. 从sc表查询score小于60的sid,并根据sid分组计数

b.内连接得到不及格课程数目大于等于2的sid,sname以及avg_score

12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息

(1)根据关键词确定相关表:

‘01课程分数小于60’ --sc表

‘学生信息’--student

(2)思路及实现:

a.先从sc表查询01课程分数小于60并按分数降序排列的学生信息

b.根据(1)中的sid从student中查询学生信息

13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

(1)根据关键词确定相关表

‘平均成绩’--sc表

(2)思路及实现过程:

a. 先按照平均成绩从高到低显示学生sc

还要显示每个学生的每一科目的成绩吗?

回答:是的,给sc表增加一列avg_score。

14.查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为=60,中等为:70-80,优良为:80-90,优秀为:=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

(1)根据关键词确定相关表:

‘成绩’ --sc;

‘课程name’--course;

(2)思路及实现:

a. 按照cid对sc表进行分组,并进行初步聚合函数的查询

b.继续完善

?如何计算各种率

回答:考察条件计数的技巧 case when

修改成题目要求格式:

15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺

(1)根据关键词确定相关表:

sc表

(2)思路:

借助赋值变量@i实现

a.原始数据增加一列@rank

b.

没有指定关联条件的inner join (笛卡尔积),每一行都会与之进行关联

注意:

案例分析之mysql选错索引

前言

案例取自极客时间《mysql45讲》

案例

模拟执行器分析查询语句

场景复现

奇了怪了,此时没用索引,进行了全表扫描

虽然使用了索引,但是还是扫描了37116行,不妨结合之前的知识分析一下:

1.另一个事务未提交,需要保存之前的数据的数据版本,因此delete10万行数据实际是标记数据,这样每一行数据就有两个数据版本,旧的是delete之前的,新的是标记为delete的,索引a上的数据有两份

2.那还多出来的1万7呢,之前介绍过索引树的叶子节点存的是主键,select * 还要进行回表查询,这里将回表的扫描行数一并算上

为什么会选错索引

选择索引是优化器的工作,优化器要找到最优的执行方案并选择最小的代价去执行,扫描行数是影响执行代价之一(扫描越小,访问磁盘次数越少,消耗CPU资源越少)

mysql执行语句之前需要通过根据信息来统计记录数

这个统计信息就是索引的区分度,即索引上不同的值越多,区分度越高越好(show index t 的 cardinality字段查看),索引的区分度是利用采样统计得到的即取小部分统计信息再乘以整体。

除了使用统计信息,还会计算回表代价(主键不需要回表)

如果是统计信息不对那就修正

另一种场景复现

按理说这是个空集,利用索引a只扫描1000行,利用索引b要扫描50000行,这里优化器竟然选择了索引b!!

mysql又选错了索引

解决办法

2.引导使用a索引

我们知道索引树上的数据是有序的,优化器使用b索引,一方面是认为索引b可以避免排序 ,order by a,b强制按照a,b排序意味着两个都需要排序,因此扫描行数成了影响决策的主要条件

3.删掉索引b

解决mysql选错索引主要有两大方向

1.强制指定索引

2.干涉优化器选择(比如增大limit数量,增加order by ,写成子查询)

MySQL选错索引导致的线上慢查询事故

mysql中走与不走索引的情况汇集(待全量实验)

MySQL表连接之驱动表与被驱动表

众所周知, MySQL的驱动表与被驱动表是优化器自动优化选择的结果 (与表连接的前后顺序等无关),我们可以用explain执行计划来知晓:

如上所示,前面一行t1是驱动表,后面一行t2是被驱动表。那么驱动表与被驱动表的选择是否有规律可循呢?下面是百度搜索两个主流的博文对驱动表与被驱动表的阐释:

1. MySQL连接查询驱动表被驱动表以及性能优化 - 阿伟~ - 博客园 博文A 主要结论:

2. mysql驱动表与被驱动表及join优化_java小小小黑的博客-CSDN博客_mysql驱动表和被驱动表 博文B 其主要结论:

两个帖子的结论是都差不多,而且还给出了例子来佐证。那么网上的结论是否权威?是否有普遍性?是否存在缺陷?

让我们来一起打破砂锅问到底。下面有两张表结构一模一样的表t1,t2:其中t1 100条数据,t2 1000条数据;t1(t2)结构如下:

按照上面博文的结论,left join左边是t2表,应该是驱动表。我们查看下结果:

与 博文B 中观点1相违背(同理观点2也违背),与实际不符,但究竟这是为什么呢?

下面发一张MySQL的执行过程(来源于《MySQL实战45讲》中01讲【一条SQL查询语句是如何执行的】)

so die si ne,原来sql执行的过程是这样呀。等等,不对,这跟刚才SQL又有什么关系,上面left join中t2表还是左边的呀。

我们知道MySQL高版本的性能越来越好,它是不断进行优化迭代的。远古的mysql版本可能还需要人工把小表放在前面,大表放在后面等这些需要人工调优的经验早就已经被解决了。也就是说我们写的语句,MySQL为了追求更好的效率,它在执行器执行前已经帮我们优化了。那么实际优化后的sql如何查看呢?用show warning命令:

其中Message就是优化后实际执行的sql语句,格式化后如下:

优化后left join左连接变成了内连接(inner) join。所以用优化后的sql看,表t1是小表所以作为驱动表,与实际结果相符。

left join 竟然优化成了join,太神奇了,但这是为什么呢?原因在于mysql中null与任何值做等值或者不等值比较的时候都是null,即使是select null=null 也是null。这样where 条件t1.a=t2.a查询条件不会包含t2.a为NULL的行,实际效果其实跟join一样,被优化器智能的优化了。

我们直接看执行计划看实际结果吧:

结果显示t2是驱动表,t1是被驱动表。t2是1000条数据按理说是大表应该是被驱动表,与 博文A , 博文B 的结论又不一致了。

《MySQL实战45讲》中34讲【到底可不可以使用join】已经讲的很透彻了,很深入了,我就不在这里献丑了。啰嗦几句大概就是驱动表是全表扫描不走索引,所以选被驱动表t1可以走索引,不会全表扫描,减少IO次数,性能高。里面对大表小表的总结,简直是精髓,特意在此再次着重强调:

在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表。

按照上面分析,我们先独立思考下MySQL会选择哪张表作为驱动表呢?

表t1,t2在字段a上都有索引不会全表扫描,其中t1.a=5条件过滤后只有一条,很显然嘛,t1数据量少是小表,肯定是驱动表,错不了,再说了前面的红色粗体已经强调了,不会有错的。

有冇搞错?事实又被打脸了。还记得在开篇我们说过的mysql优化器会对sql语句进行优化的吗?下面我们看下执行计划与优化的sql语句:

格式化后的优化SQL如下:

优化后两表t1,t2都走索引,并且都只有一条结果返回,因此都只会扫描一行,数据量一样,所以谁在前面谁就是驱动表,也就是上面sql中表t2。一切都释然,豁然开通!

回头再仔细想想,高,实在是高!仔细深思之后MySQL优化后的句子真让人猛拍大腿。高明之处在于:

1. 本来join连接是个M*N的嵌套循环,优化后变成了M+N的判断,两表不再嵌套判断了。

2. 优化后,两表没有多大必然联系,只需把两表的结果集拼接即可,互不干扰。如果mysql未来可以多线程查询,岂不十分快哉!

小伙伴们还记得我们在上一章 MySQL索引初探 中编码类型不一致发生隐式转换时有时候走索引,有时候索引又失效的问题吗?下面我们选取有代表性的一条记录来分析:

其中表demo_test总共有640条数据,demo_test_ass有3条数据。显然经过过滤条件t.rid1完成后demo_test_ass数据量小,应该作为驱动表。虽然test.c_utf8mb4 = t.c2两字段连接中发生了t.c2字段发生隐式转换,但是实际上并不影响被驱动表test上的c_utf8mb4索引。

好了,本章到此结束,让我们一起 总结一下MySQL驱动表与被驱动表的选取原则 :

หน ง 同等条件,优先选取有索引的表作为被驱动表。 在此介绍一下什么叫同等条件,比如上面的②中的语句。 两表没有其他额外的过滤条件,因此选关联字段有索引的t1作为被驱动表。但是如果加了条件(and t1.id=3),此时t1数据量少,就选取了t2作为被驱动表。

สอง MySQL选择驱动表与被驱动表是基于优化器优化后的,小表是驱动表,大表是被驱动表。 基于优化器优化后开篇的 博文A与B 结论成立。

当然这都是我一家之言,并不是官方结论,目前暂未找到官方确切对于驱动表与被驱动表的解释,请大家踊跃拍砖!

Java学习路线应该如何安排?

我学习Java 已经快四年了,在 Java 学习这条路上也踩过无数次的坑,恰巧有小伙伴问我 Java 学习的路线,我想着趁这次机会分享自己学 Java 的路线,希望给小伙伴们一点帮助,避开路上的一些坑

小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!

所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【111】即可免费获取

首先,我先分享下自己对不同学习方式的理解,小伙伴们可以根据自己情况选择。

看视频系统学习,比如培训机构的课程、MOOC的课程等。看视频的好处就是有老师带着,易于理解和掌握,非常适合初学者。

看书学习,如《Redis设计与实现》、《 Java 并发编程的艺术》,便于了解技术脉络和深入学习知识点。

看博客和源码精进学习。博客的好处是有些知识点会以很通俗的方式讲解出来,我们很好理解。

第一阶段: Java 基础

最开始要学习的是 Java 基础,学习了这部分,就会对 Java 语言有一个初步的了解。其实大部分语言的基础知识都是大同小异,如果之前已经学习过其他语言如C、C++,那学习这部分会更快。

这部分主要学习的内容有:基本程序结构,类与对象,接口,泛型,反射,集合,异常与调试, Java 网络编程, Java I/O和多线程。

学 Java 基础,推荐大家看尚硅谷宋红康老师的 Java 教程,宋老师的课程更适合零基础学员,从 Java 语言起源开始,循序渐进,知识点剖析细致。

除此之外,还可以阅读《 Java 核心技术 卷I》,这本书偏向实用,广度和深度都恰到好处。其中,第7-9章讲述了 Java 的GUI编程, Java 的GUI开发使用并不多,这部分可以先跳过。

网上也有一些不错的文档教程网站,可以辅助学习:

菜鸟教程 Java :Java 教程 | 菜鸟教程

当学完了这部分,就可以做个图书管理系统、学生管理系统这样的小项目了。还记得库森在大二学完这部分,就跟着教程学做了个贪吃蛇游戏,还是蛮有成就感的。

当然,时间有限的小伙伴,可以不用做这块的项目,直接做 Java Web 项目就好了。

第二阶段:数据库

MySQL 和 Oracle 都是广受企业欢迎的数据库,其中 MySQL 是目前应用最广泛的开源关系数据库,对于新手或者校招的小伙伴,我们目前只学习 MySQL 就可以了。

这部分主要学习的内容有:数据库的CRUD操作、JDBC API、数据库特性和数据库连接池。

其中,数据库连接池是为了避免频繁地创建和销毁 JDBC 连接,常见连接池包括 C3P0,Druid 和 HikariCP,目前使用最广泛的是HikariCP。

书籍方面,推荐入门的小伙伴看《MySQL必知必会》,是一本小册子,这本书实践性很强,基本没有什么理论的堆砌,非常适合入门。

如果想要深入学习,可以看《高性能 MySQL》,这本书是MySQL领域的经典之作,不过就是太厚了,面试重点看索引部分就可以了。

除此之外,如果要深入学习MySQL的使用和原理,可以看极客时间的专栏《MySQL实战45讲》,阿里资深技术专家讲解的课程,有很多生产经常遇到的问题,非常有深度。

第三阶段: Java Web

学习 Java Web,我们不仅需要掌握后端 Java 技术,还需要学习些前端知识。

前端有三大基础技术 Html、CSS和 Java Script,初学的话,学习这些就可以了。如果想做出更好的交互式效果,可以再学习Vue和React等前端技术。

后端 Java 技术包括 Servlet、Filter、Listener、Session、Cookie、JSP、EL 表达式和 JSTL 等。

其中,像 JSP 这样比较老的技术,目前在各大互联网公司基本不再使用,已经被 Freemark、Thymeleaf 这样的模板引擎所替代,我们只需要了解基本使用即可。

入门 Java Web,推荐尚硅谷的 Java Web 教程,教程不仅包括前端三大技术,还有后端 Java 技术,最后还会带大家做一个书城项目。

第四阶段:主流框架

这部分我们要学习的主流框架主要有 Spring、Spring MVC 和 MyBatis,俗称 SSM 框架。

曾经的 SSH 框架,即 Struts2、Spring、Hibernate 框架,已经逐渐被 SSM 替代,现在可以不用再学 Struts2 和 Hibernate 框架了。


名称栏目:mysql45讲怎么样,mysql45讲pdf
网站地址:http://chengdu.cdxwcx.cn/article/dssgchc.html