commit e55aa0c74729e085e939599eb20152b9125484fd Author: xuxin <840198532@qq.com> Date: Wed Aug 27 14:47:26 2025 +0800 初始化提交 diff --git a/javaEE/day01/assets/._1667546536590.png b/javaEE/day01/assets/._1667546536590.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667546536590.png differ diff --git a/javaEE/day01/assets/._1667546541068.png b/javaEE/day01/assets/._1667546541068.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667546541068.png differ diff --git a/javaEE/day01/assets/._1667546920773.png b/javaEE/day01/assets/._1667546920773.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667546920773.png differ diff --git a/javaEE/day01/assets/._1667547062232.png b/javaEE/day01/assets/._1667547062232.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667547062232.png differ diff --git a/javaEE/day01/assets/._1667547421140.png b/javaEE/day01/assets/._1667547421140.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667547421140.png differ diff --git a/javaEE/day01/assets/._1667547561387.png b/javaEE/day01/assets/._1667547561387.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667547561387.png differ diff --git a/javaEE/day01/assets/._1667547604517.png b/javaEE/day01/assets/._1667547604517.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667547604517.png differ diff --git a/javaEE/day01/assets/._1667548530745.png b/javaEE/day01/assets/._1667548530745.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667548530745.png differ diff --git a/javaEE/day01/assets/._1667548590602.png b/javaEE/day01/assets/._1667548590602.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667548590602.png differ diff --git a/javaEE/day01/assets/._1667548969631.png b/javaEE/day01/assets/._1667548969631.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667548969631.png differ diff --git a/javaEE/day01/assets/._1667829415386.png b/javaEE/day01/assets/._1667829415386.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667829415386.png differ diff --git a/javaEE/day01/assets/._1667829877388.png b/javaEE/day01/assets/._1667829877388.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667829877388.png differ diff --git a/javaEE/day01/assets/._1667830355701.png b/javaEE/day01/assets/._1667830355701.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667830355701.png differ diff --git a/javaEE/day01/assets/._1667830388905.png b/javaEE/day01/assets/._1667830388905.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667830388905.png differ diff --git a/javaEE/day01/assets/._1667830767033.png b/javaEE/day01/assets/._1667830767033.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667830767033.png differ diff --git a/javaEE/day01/assets/._1667831399156.png b/javaEE/day01/assets/._1667831399156.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667831399156.png differ diff --git a/javaEE/day01/assets/._1667840398324.png b/javaEE/day01/assets/._1667840398324.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667840398324.png differ diff --git a/javaEE/day01/assets/._1667840657590.png b/javaEE/day01/assets/._1667840657590.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667840657590.png differ diff --git a/javaEE/day01/assets/._1667840837334.png b/javaEE/day01/assets/._1667840837334.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667840837334.png differ diff --git a/javaEE/day01/assets/._1667840991261.png b/javaEE/day01/assets/._1667840991261.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667840991261.png differ diff --git a/javaEE/day01/assets/._1667841098321.png b/javaEE/day01/assets/._1667841098321.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667841098321.png differ diff --git a/javaEE/day01/assets/._1667841197255.png b/javaEE/day01/assets/._1667841197255.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667841197255.png differ diff --git a/javaEE/day01/assets/._1667841254716.png b/javaEE/day01/assets/._1667841254716.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667841254716.png differ diff --git a/javaEE/day01/assets/._1667841530244.png b/javaEE/day01/assets/._1667841530244.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667841530244.png differ diff --git a/javaEE/day01/assets/._1667841560582.png b/javaEE/day01/assets/._1667841560582.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667841560582.png differ diff --git a/javaEE/day01/assets/._1667841613795.png b/javaEE/day01/assets/._1667841613795.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667841613795.png differ diff --git a/javaEE/day01/assets/._1667841948519.png b/javaEE/day01/assets/._1667841948519.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667841948519.png differ diff --git a/javaEE/day01/assets/._1667842080252.png b/javaEE/day01/assets/._1667842080252.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667842080252.png differ diff --git a/javaEE/day01/assets/._1667842460626.png b/javaEE/day01/assets/._1667842460626.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667842460626.png differ diff --git a/javaEE/day01/assets/._1667842717310.png b/javaEE/day01/assets/._1667842717310.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667842717310.png differ diff --git a/javaEE/day01/assets/._1667842763662.png b/javaEE/day01/assets/._1667842763662.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667842763662.png differ diff --git a/javaEE/day01/assets/._1667842782985.png b/javaEE/day01/assets/._1667842782985.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667842782985.png differ diff --git a/javaEE/day01/assets/._1667842848699.png b/javaEE/day01/assets/._1667842848699.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667842848699.png differ diff --git a/javaEE/day01/assets/._1667959196932.png b/javaEE/day01/assets/._1667959196932.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667959196932.png differ diff --git a/javaEE/day01/assets/._1667959468972.png b/javaEE/day01/assets/._1667959468972.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667959468972.png differ diff --git a/javaEE/day01/assets/._1667959706875.png b/javaEE/day01/assets/._1667959706875.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667959706875.png differ diff --git a/javaEE/day01/assets/._1667960651248.png b/javaEE/day01/assets/._1667960651248.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667960651248.png differ diff --git a/javaEE/day01/assets/._1667960791586.png b/javaEE/day01/assets/._1667960791586.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667960791586.png differ diff --git a/javaEE/day01/assets/._1667961158808.png b/javaEE/day01/assets/._1667961158808.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667961158808.png differ diff --git a/javaEE/day01/assets/._1667961431464.png b/javaEE/day01/assets/._1667961431464.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667961431464.png differ diff --git a/javaEE/day01/assets/._1667962094874.png b/javaEE/day01/assets/._1667962094874.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667962094874.png differ diff --git a/javaEE/day01/assets/._1667962429330.png b/javaEE/day01/assets/._1667962429330.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667962429330.png differ diff --git a/javaEE/day01/assets/._1667963055406.png b/javaEE/day01/assets/._1667963055406.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667963055406.png differ diff --git a/javaEE/day01/assets/._1667963409639.png b/javaEE/day01/assets/._1667963409639.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667963409639.png differ diff --git a/javaEE/day01/assets/._1667963982363.png b/javaEE/day01/assets/._1667963982363.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667963982363.png differ diff --git a/javaEE/day01/assets/._1667964122701.png b/javaEE/day01/assets/._1667964122701.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667964122701.png differ diff --git a/javaEE/day01/assets/._1667964242932.png b/javaEE/day01/assets/._1667964242932.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667964242932.png differ diff --git a/javaEE/day01/assets/._1667964408590.png b/javaEE/day01/assets/._1667964408590.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667964408590.png differ diff --git a/javaEE/day01/assets/._1667964843623.png b/javaEE/day01/assets/._1667964843623.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667964843623.png differ diff --git a/javaEE/day01/assets/._1667964998343.png b/javaEE/day01/assets/._1667964998343.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667964998343.png differ diff --git a/javaEE/day01/assets/._1667965379132.png b/javaEE/day01/assets/._1667965379132.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667965379132.png differ diff --git a/javaEE/day01/assets/._1667965792608.png b/javaEE/day01/assets/._1667965792608.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1667965792608.png differ diff --git a/javaEE/day01/assets/._1668010269268.png b/javaEE/day01/assets/._1668010269268.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668010269268.png differ diff --git a/javaEE/day01/assets/._1668011121584.png b/javaEE/day01/assets/._1668011121584.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668011121584.png differ diff --git a/javaEE/day01/assets/._1668011306684.png b/javaEE/day01/assets/._1668011306684.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668011306684.png differ diff --git a/javaEE/day01/assets/._1668011501161.png b/javaEE/day01/assets/._1668011501161.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668011501161.png differ diff --git a/javaEE/day01/assets/._1668011569718.png b/javaEE/day01/assets/._1668011569718.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668011569718.png differ diff --git a/javaEE/day01/assets/._1668011893953.png b/javaEE/day01/assets/._1668011893953.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668011893953.png differ diff --git a/javaEE/day01/assets/._1668012052140.png b/javaEE/day01/assets/._1668012052140.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668012052140.png differ diff --git a/javaEE/day01/assets/._1668012259590.png b/javaEE/day01/assets/._1668012259590.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668012259590.png differ diff --git a/javaEE/day01/assets/._1668012492155.png b/javaEE/day01/assets/._1668012492155.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668012492155.png differ diff --git a/javaEE/day01/assets/._1668013517401.png b/javaEE/day01/assets/._1668013517401.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668013517401.png differ diff --git a/javaEE/day01/assets/._1668014394364.png b/javaEE/day01/assets/._1668014394364.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668014394364.png differ diff --git a/javaEE/day01/assets/._1668014566080.png b/javaEE/day01/assets/._1668014566080.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668014566080.png differ diff --git a/javaEE/day01/assets/._1668014985661.png b/javaEE/day01/assets/._1668014985661.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668014985661.png differ diff --git a/javaEE/day01/assets/._1668015339041.png b/javaEE/day01/assets/._1668015339041.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668015339041.png differ diff --git a/javaEE/day01/assets/._1668015534555.png b/javaEE/day01/assets/._1668015534555.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668015534555.png differ diff --git a/javaEE/day01/assets/._1668015886516.png b/javaEE/day01/assets/._1668015886516.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668015886516.png differ diff --git a/javaEE/day01/assets/._1668016085857.png b/javaEE/day01/assets/._1668016085857.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016085857.png differ diff --git a/javaEE/day01/assets/._1668016321733.png b/javaEE/day01/assets/._1668016321733.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016321733.png differ diff --git a/javaEE/day01/assets/._1668016526099.png b/javaEE/day01/assets/._1668016526099.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016526099.png differ diff --git a/javaEE/day01/assets/._1668016722147.png b/javaEE/day01/assets/._1668016722147.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016722147.png differ diff --git a/javaEE/day01/assets/._1668016732096.png b/javaEE/day01/assets/._1668016732096.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016732096.png differ diff --git a/javaEE/day01/assets/._1668016743982.png b/javaEE/day01/assets/._1668016743982.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016743982.png differ diff --git a/javaEE/day01/assets/._1668016758205.png b/javaEE/day01/assets/._1668016758205.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016758205.png differ diff --git a/javaEE/day01/assets/._1668016767325.png b/javaEE/day01/assets/._1668016767325.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016767325.png differ diff --git a/javaEE/day01/assets/._1668016779793.png b/javaEE/day01/assets/._1668016779793.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016779793.png differ diff --git a/javaEE/day01/assets/._1668016788307.png b/javaEE/day01/assets/._1668016788307.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016788307.png differ diff --git a/javaEE/day01/assets/._1668016882968.png b/javaEE/day01/assets/._1668016882968.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668016882968.png differ diff --git a/javaEE/day01/assets/._1668017205875.png b/javaEE/day01/assets/._1668017205875.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668017205875.png differ diff --git a/javaEE/day01/assets/._1668017659915.png b/javaEE/day01/assets/._1668017659915.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668017659915.png differ diff --git a/javaEE/day01/assets/._1668017702953.png b/javaEE/day01/assets/._1668017702953.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668017702953.png differ diff --git a/javaEE/day01/assets/._1668017754251.png b/javaEE/day01/assets/._1668017754251.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668017754251.png differ diff --git a/javaEE/day01/assets/._1668017757493.png b/javaEE/day01/assets/._1668017757493.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668017757493.png differ diff --git a/javaEE/day01/assets/._1668017774832.png b/javaEE/day01/assets/._1668017774832.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668017774832.png differ diff --git a/javaEE/day01/assets/._1668018155880.png b/javaEE/day01/assets/._1668018155880.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668018155880.png differ diff --git a/javaEE/day01/assets/._1668018322115.png b/javaEE/day01/assets/._1668018322115.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668018322115.png differ diff --git a/javaEE/day01/assets/._1668018486183.png b/javaEE/day01/assets/._1668018486183.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668018486183.png differ diff --git a/javaEE/day01/assets/._1668018581006.png b/javaEE/day01/assets/._1668018581006.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668018581006.png differ diff --git a/javaEE/day01/assets/._1668018794824.png b/javaEE/day01/assets/._1668018794824.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668018794824.png differ diff --git a/javaEE/day01/assets/._1668018832540.png b/javaEE/day01/assets/._1668018832540.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668018832540.png differ diff --git a/javaEE/day01/assets/._1668019011221.png b/javaEE/day01/assets/._1668019011221.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668019011221.png differ diff --git a/javaEE/day01/assets/._1668019050385.png b/javaEE/day01/assets/._1668019050385.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668019050385.png differ diff --git a/javaEE/day01/assets/._1668019732581.png b/javaEE/day01/assets/._1668019732581.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668019732581.png differ diff --git a/javaEE/day01/assets/._1668020096836.png b/javaEE/day01/assets/._1668020096836.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668020096836.png differ diff --git a/javaEE/day01/assets/._1668020166666.png b/javaEE/day01/assets/._1668020166666.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668020166666.png differ diff --git a/javaEE/day01/assets/._1668020635987.png b/javaEE/day01/assets/._1668020635987.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668020635987.png differ diff --git a/javaEE/day01/assets/._1668020876108.png b/javaEE/day01/assets/._1668020876108.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668020876108.png differ diff --git a/javaEE/day01/assets/._1668020985363.png b/javaEE/day01/assets/._1668020985363.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668020985363.png differ diff --git a/javaEE/day01/assets/._1668021080890.png b/javaEE/day01/assets/._1668021080890.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668021080890.png differ diff --git a/javaEE/day01/assets/._1668021241174.png b/javaEE/day01/assets/._1668021241174.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668021241174.png differ diff --git a/javaEE/day01/assets/._1668021614357.png b/javaEE/day01/assets/._1668021614357.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668021614357.png differ diff --git a/javaEE/day01/assets/._1668022078783.png b/javaEE/day01/assets/._1668022078783.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668022078783.png differ diff --git a/javaEE/day01/assets/._1668022626367.png b/javaEE/day01/assets/._1668022626367.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668022626367.png differ diff --git a/javaEE/day01/assets/._1668022845725.png b/javaEE/day01/assets/._1668022845725.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668022845725.png differ diff --git a/javaEE/day01/assets/._1668055478588.png b/javaEE/day01/assets/._1668055478588.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668055478588.png differ diff --git a/javaEE/day01/assets/._1668055644349.png b/javaEE/day01/assets/._1668055644349.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668055644349.png differ diff --git a/javaEE/day01/assets/._1668055767679.png b/javaEE/day01/assets/._1668055767679.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668055767679.png differ diff --git a/javaEE/day01/assets/._1668055779440.png b/javaEE/day01/assets/._1668055779440.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668055779440.png differ diff --git a/javaEE/day01/assets/._1668096182111.png b/javaEE/day01/assets/._1668096182111.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668096182111.png differ diff --git a/javaEE/day01/assets/._1668096294983.png b/javaEE/day01/assets/._1668096294983.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668096294983.png differ diff --git a/javaEE/day01/assets/._1668096550951.png b/javaEE/day01/assets/._1668096550951.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668096550951.png differ diff --git a/javaEE/day01/assets/._1668097398103.png b/javaEE/day01/assets/._1668097398103.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668097398103.png differ diff --git a/javaEE/day01/assets/._1668097510803.png b/javaEE/day01/assets/._1668097510803.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668097510803.png differ diff --git a/javaEE/day01/assets/._1668098311751.png b/javaEE/day01/assets/._1668098311751.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668098311751.png differ diff --git a/javaEE/day01/assets/._1668098529577.png b/javaEE/day01/assets/._1668098529577.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668098529577.png differ diff --git a/javaEE/day01/assets/._1668098726749.png b/javaEE/day01/assets/._1668098726749.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668098726749.png differ diff --git a/javaEE/day01/assets/._1668099261565.png b/javaEE/day01/assets/._1668099261565.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668099261565.png differ diff --git a/javaEE/day01/assets/._1668099466667.png b/javaEE/day01/assets/._1668099466667.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668099466667.png differ diff --git a/javaEE/day01/assets/._1668099678835.png b/javaEE/day01/assets/._1668099678835.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668099678835.png differ diff --git a/javaEE/day01/assets/._1668099816024.png b/javaEE/day01/assets/._1668099816024.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668099816024.png differ diff --git a/javaEE/day01/assets/._1668099928582.png b/javaEE/day01/assets/._1668099928582.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668099928582.png differ diff --git a/javaEE/day01/assets/._1668100655848.png b/javaEE/day01/assets/._1668100655848.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668100655848.png differ diff --git a/javaEE/day01/assets/._1668101592422.png b/javaEE/day01/assets/._1668101592422.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668101592422.png differ diff --git a/javaEE/day01/assets/._1668101718354.png b/javaEE/day01/assets/._1668101718354.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668101718354.png differ diff --git a/javaEE/day01/assets/._1668101840992.png b/javaEE/day01/assets/._1668101840992.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668101840992.png differ diff --git a/javaEE/day01/assets/._1668101996370.png b/javaEE/day01/assets/._1668101996370.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668101996370.png differ diff --git a/javaEE/day01/assets/._1668102138950.png b/javaEE/day01/assets/._1668102138950.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668102138950.png differ diff --git a/javaEE/day01/assets/._1668102183766.png b/javaEE/day01/assets/._1668102183766.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668102183766.png differ diff --git a/javaEE/day01/assets/._1668102256305.png b/javaEE/day01/assets/._1668102256305.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668102256305.png differ diff --git a/javaEE/day01/assets/._1668102426953.png b/javaEE/day01/assets/._1668102426953.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668102426953.png differ diff --git a/javaEE/day01/assets/._1668102527993.png b/javaEE/day01/assets/._1668102527993.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668102527993.png differ diff --git a/javaEE/day01/assets/._1668102736759.png b/javaEE/day01/assets/._1668102736759.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668102736759.png differ diff --git a/javaEE/day01/assets/._1668103531260.png b/javaEE/day01/assets/._1668103531260.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668103531260.png differ diff --git a/javaEE/day01/assets/._1668104421608.png b/javaEE/day01/assets/._1668104421608.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668104421608.png differ diff --git a/javaEE/day01/assets/._1668104530206.png b/javaEE/day01/assets/._1668104530206.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668104530206.png differ diff --git a/javaEE/day01/assets/._1668229086303.png b/javaEE/day01/assets/._1668229086303.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668229086303.png differ diff --git a/javaEE/day01/assets/._1668229100646.png b/javaEE/day01/assets/._1668229100646.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668229100646.png differ diff --git a/javaEE/day01/assets/._1668229223510.png b/javaEE/day01/assets/._1668229223510.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668229223510.png differ diff --git a/javaEE/day01/assets/._1668229905732.png b/javaEE/day01/assets/._1668229905732.png new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._1668229905732.png differ diff --git a/javaEE/day01/assets/._a.gif b/javaEE/day01/assets/._a.gif new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._a.gif differ diff --git a/javaEE/day01/assets/._css.gif b/javaEE/day01/assets/._css.gif new file mode 100644 index 0000000..e56bb38 Binary files /dev/null and b/javaEE/day01/assets/._css.gif differ diff --git a/javaEE/day01/assets/._html.gif b/javaEE/day01/assets/._html.gif new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._html.gif differ diff --git a/javaEE/day01/assets/._image-20230309163858689.png b/javaEE/day01/assets/._image-20230309163858689.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309163858689.png differ diff --git a/javaEE/day01/assets/._image-20230309170412197.png b/javaEE/day01/assets/._image-20230309170412197.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309170412197.png differ diff --git a/javaEE/day01/assets/._image-20230309172507600.png b/javaEE/day01/assets/._image-20230309172507600.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309172507600.png differ diff --git a/javaEE/day01/assets/._image-20230309172534138.png b/javaEE/day01/assets/._image-20230309172534138.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309172534138.png differ diff --git a/javaEE/day01/assets/._image-20230309172634388.png b/javaEE/day01/assets/._image-20230309172634388.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309172634388.png differ diff --git a/javaEE/day01/assets/._image-20230309173355794.png b/javaEE/day01/assets/._image-20230309173355794.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309173355794.png differ diff --git a/javaEE/day01/assets/._image-20230309174438491.png b/javaEE/day01/assets/._image-20230309174438491.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309174438491.png differ diff --git a/javaEE/day01/assets/._image-20230309175121361.png b/javaEE/day01/assets/._image-20230309175121361.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309175121361.png differ diff --git a/javaEE/day01/assets/._image-20230309175941128.png b/javaEE/day01/assets/._image-20230309175941128.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309175941128.png differ diff --git a/javaEE/day01/assets/._image-20230309191725329.png b/javaEE/day01/assets/._image-20230309191725329.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309191725329.png differ diff --git a/javaEE/day01/assets/._image-20230309192625939.png b/javaEE/day01/assets/._image-20230309192625939.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309192625939.png differ diff --git a/javaEE/day01/assets/._image-20230309221308252.png b/javaEE/day01/assets/._image-20230309221308252.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309221308252.png differ diff --git a/javaEE/day01/assets/._image-20230309221530214.png b/javaEE/day01/assets/._image-20230309221530214.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309221530214.png differ diff --git a/javaEE/day01/assets/._image-20230309221756293.png b/javaEE/day01/assets/._image-20230309221756293.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309221756293.png differ diff --git a/javaEE/day01/assets/._image-20230309221809255.png b/javaEE/day01/assets/._image-20230309221809255.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309221809255.png differ diff --git a/javaEE/day01/assets/._image-20230309222608750.png b/javaEE/day01/assets/._image-20230309222608750.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309222608750.png differ diff --git a/javaEE/day01/assets/._image-20230309223020809.png b/javaEE/day01/assets/._image-20230309223020809.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309223020809.png differ diff --git a/javaEE/day01/assets/._image-20230309224226495.png b/javaEE/day01/assets/._image-20230309224226495.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309224226495.png differ diff --git a/javaEE/day01/assets/._image-20230309224401950.png b/javaEE/day01/assets/._image-20230309224401950.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309224401950.png differ diff --git a/javaEE/day01/assets/._image-20230309224645231.png b/javaEE/day01/assets/._image-20230309224645231.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309224645231.png differ diff --git a/javaEE/day01/assets/._image-20230309231828433.png b/javaEE/day01/assets/._image-20230309231828433.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309231828433.png differ diff --git a/javaEE/day01/assets/._image-20230309233408698.png b/javaEE/day01/assets/._image-20230309233408698.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230309233408698.png differ diff --git a/javaEE/day01/assets/._image-20230310084859695.png b/javaEE/day01/assets/._image-20230310084859695.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310084859695.png differ diff --git a/javaEE/day01/assets/._image-20230310092442972.png b/javaEE/day01/assets/._image-20230310092442972.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310092442972.png differ diff --git a/javaEE/day01/assets/._image-20230310092820616.png b/javaEE/day01/assets/._image-20230310092820616.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310092820616.png differ diff --git a/javaEE/day01/assets/._image-20230310093247265.png b/javaEE/day01/assets/._image-20230310093247265.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310093247265.png differ diff --git a/javaEE/day01/assets/._image-20230310093700812.png b/javaEE/day01/assets/._image-20230310093700812.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310093700812.png differ diff --git a/javaEE/day01/assets/._image-20230310093734941.png b/javaEE/day01/assets/._image-20230310093734941.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310093734941.png differ diff --git a/javaEE/day01/assets/._image-20230310093827748.png b/javaEE/day01/assets/._image-20230310093827748.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310093827748.png differ diff --git a/javaEE/day01/assets/._image-20230310094312355.png b/javaEE/day01/assets/._image-20230310094312355.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310094312355.png differ diff --git a/javaEE/day01/assets/._image-20230310094412539.png b/javaEE/day01/assets/._image-20230310094412539.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310094412539.png differ diff --git a/javaEE/day01/assets/._image-20230310094732466.png b/javaEE/day01/assets/._image-20230310094732466.png new file mode 100644 index 0000000..68979cd Binary files /dev/null and b/javaEE/day01/assets/._image-20230310094732466.png differ diff --git a/javaEE/day01/assets/1667546536590.png b/javaEE/day01/assets/1667546536590.png new file mode 100644 index 0000000..5b6e5d5 Binary files /dev/null and b/javaEE/day01/assets/1667546536590.png differ diff --git a/javaEE/day01/assets/1667546541068.png b/javaEE/day01/assets/1667546541068.png new file mode 100644 index 0000000..5b6e5d5 Binary files /dev/null and b/javaEE/day01/assets/1667546541068.png differ diff --git a/javaEE/day01/assets/1667546920773.png b/javaEE/day01/assets/1667546920773.png new file mode 100644 index 0000000..24ada44 Binary files /dev/null and b/javaEE/day01/assets/1667546920773.png differ diff --git a/javaEE/day01/assets/1667547062232.png b/javaEE/day01/assets/1667547062232.png new file mode 100644 index 0000000..24ada44 Binary files /dev/null and b/javaEE/day01/assets/1667547062232.png differ diff --git a/javaEE/day01/assets/1667547421140.png b/javaEE/day01/assets/1667547421140.png new file mode 100644 index 0000000..746279d Binary files /dev/null and b/javaEE/day01/assets/1667547421140.png differ diff --git a/javaEE/day01/assets/1667547561387.png b/javaEE/day01/assets/1667547561387.png new file mode 100644 index 0000000..63c48a8 Binary files /dev/null and b/javaEE/day01/assets/1667547561387.png differ diff --git a/javaEE/day01/assets/1667547604517.png b/javaEE/day01/assets/1667547604517.png new file mode 100644 index 0000000..00f1535 Binary files /dev/null and b/javaEE/day01/assets/1667547604517.png differ diff --git a/javaEE/day01/assets/1667548530745.png b/javaEE/day01/assets/1667548530745.png new file mode 100644 index 0000000..5094b03 Binary files /dev/null and b/javaEE/day01/assets/1667548530745.png differ diff --git a/javaEE/day01/assets/1667548590602.png b/javaEE/day01/assets/1667548590602.png new file mode 100644 index 0000000..c1934a0 Binary files /dev/null and b/javaEE/day01/assets/1667548590602.png differ diff --git a/javaEE/day01/assets/1667548969631.png b/javaEE/day01/assets/1667548969631.png new file mode 100644 index 0000000..db08ca6 Binary files /dev/null and b/javaEE/day01/assets/1667548969631.png differ diff --git a/javaEE/day01/assets/1667829415386.png b/javaEE/day01/assets/1667829415386.png new file mode 100644 index 0000000..1f90792 Binary files /dev/null and b/javaEE/day01/assets/1667829415386.png differ diff --git a/javaEE/day01/assets/1667829877388.png b/javaEE/day01/assets/1667829877388.png new file mode 100644 index 0000000..b0e46c9 Binary files /dev/null and b/javaEE/day01/assets/1667829877388.png differ diff --git a/javaEE/day01/assets/1667830355701.png b/javaEE/day01/assets/1667830355701.png new file mode 100644 index 0000000..4dd875b Binary files /dev/null and b/javaEE/day01/assets/1667830355701.png differ diff --git a/javaEE/day01/assets/1667830388905.png b/javaEE/day01/assets/1667830388905.png new file mode 100644 index 0000000..d9a5911 Binary files /dev/null and b/javaEE/day01/assets/1667830388905.png differ diff --git a/javaEE/day01/assets/1667830767033.png b/javaEE/day01/assets/1667830767033.png new file mode 100644 index 0000000..ea3ee43 Binary files /dev/null and b/javaEE/day01/assets/1667830767033.png differ diff --git a/javaEE/day01/assets/1667831399156.png b/javaEE/day01/assets/1667831399156.png new file mode 100644 index 0000000..d720472 Binary files /dev/null and b/javaEE/day01/assets/1667831399156.png differ diff --git a/javaEE/day01/assets/1667840398324.png b/javaEE/day01/assets/1667840398324.png new file mode 100644 index 0000000..f29a363 Binary files /dev/null and b/javaEE/day01/assets/1667840398324.png differ diff --git a/javaEE/day01/assets/1667840657590.png b/javaEE/day01/assets/1667840657590.png new file mode 100644 index 0000000..63368b4 Binary files /dev/null and b/javaEE/day01/assets/1667840657590.png differ diff --git a/javaEE/day01/assets/1667840837334.png b/javaEE/day01/assets/1667840837334.png new file mode 100644 index 0000000..1429b2f Binary files /dev/null and b/javaEE/day01/assets/1667840837334.png differ diff --git a/javaEE/day01/assets/1667840991261.png b/javaEE/day01/assets/1667840991261.png new file mode 100644 index 0000000..a8f0a06 Binary files /dev/null and b/javaEE/day01/assets/1667840991261.png differ diff --git a/javaEE/day01/assets/1667841098321.png b/javaEE/day01/assets/1667841098321.png new file mode 100644 index 0000000..d9ee10f Binary files /dev/null and b/javaEE/day01/assets/1667841098321.png differ diff --git a/javaEE/day01/assets/1667841197255.png b/javaEE/day01/assets/1667841197255.png new file mode 100644 index 0000000..6526bb2 Binary files /dev/null and b/javaEE/day01/assets/1667841197255.png differ diff --git a/javaEE/day01/assets/1667841254716.png b/javaEE/day01/assets/1667841254716.png new file mode 100644 index 0000000..5f381af Binary files /dev/null and b/javaEE/day01/assets/1667841254716.png differ diff --git a/javaEE/day01/assets/1667841530244.png b/javaEE/day01/assets/1667841530244.png new file mode 100644 index 0000000..de7e01e Binary files /dev/null and b/javaEE/day01/assets/1667841530244.png differ diff --git a/javaEE/day01/assets/1667841560582.png b/javaEE/day01/assets/1667841560582.png new file mode 100644 index 0000000..19e87d8 Binary files /dev/null and b/javaEE/day01/assets/1667841560582.png differ diff --git a/javaEE/day01/assets/1667841613795.png b/javaEE/day01/assets/1667841613795.png new file mode 100644 index 0000000..84428b0 Binary files /dev/null and b/javaEE/day01/assets/1667841613795.png differ diff --git a/javaEE/day01/assets/1667841948519.png b/javaEE/day01/assets/1667841948519.png new file mode 100644 index 0000000..147591a Binary files /dev/null and b/javaEE/day01/assets/1667841948519.png differ diff --git a/javaEE/day01/assets/1667842080252.png b/javaEE/day01/assets/1667842080252.png new file mode 100644 index 0000000..8725e2c Binary files /dev/null and b/javaEE/day01/assets/1667842080252.png differ diff --git a/javaEE/day01/assets/1667842460626.png b/javaEE/day01/assets/1667842460626.png new file mode 100644 index 0000000..8a00e81 Binary files /dev/null and b/javaEE/day01/assets/1667842460626.png differ diff --git a/javaEE/day01/assets/1667842717310.png b/javaEE/day01/assets/1667842717310.png new file mode 100644 index 0000000..b880b44 Binary files /dev/null and b/javaEE/day01/assets/1667842717310.png differ diff --git a/javaEE/day01/assets/1667842763662.png b/javaEE/day01/assets/1667842763662.png new file mode 100644 index 0000000..5f66724 Binary files /dev/null and b/javaEE/day01/assets/1667842763662.png differ diff --git a/javaEE/day01/assets/1667842782985.png b/javaEE/day01/assets/1667842782985.png new file mode 100644 index 0000000..d5ec760 Binary files /dev/null and b/javaEE/day01/assets/1667842782985.png differ diff --git a/javaEE/day01/assets/1667842848699.png b/javaEE/day01/assets/1667842848699.png new file mode 100644 index 0000000..d70a657 Binary files /dev/null and b/javaEE/day01/assets/1667842848699.png differ diff --git a/javaEE/day01/assets/1667959196932.png b/javaEE/day01/assets/1667959196932.png new file mode 100644 index 0000000..0711d34 Binary files /dev/null and b/javaEE/day01/assets/1667959196932.png differ diff --git a/javaEE/day01/assets/1667959468972.png b/javaEE/day01/assets/1667959468972.png new file mode 100644 index 0000000..c1c414d Binary files /dev/null and b/javaEE/day01/assets/1667959468972.png differ diff --git a/javaEE/day01/assets/1667959706875.png b/javaEE/day01/assets/1667959706875.png new file mode 100644 index 0000000..11f01e0 Binary files /dev/null and b/javaEE/day01/assets/1667959706875.png differ diff --git a/javaEE/day01/assets/1667960651248.png b/javaEE/day01/assets/1667960651248.png new file mode 100644 index 0000000..d2e2228 Binary files /dev/null and b/javaEE/day01/assets/1667960651248.png differ diff --git a/javaEE/day01/assets/1667960791586.png b/javaEE/day01/assets/1667960791586.png new file mode 100644 index 0000000..af33d0f Binary files /dev/null and b/javaEE/day01/assets/1667960791586.png differ diff --git a/javaEE/day01/assets/1667961158808.png b/javaEE/day01/assets/1667961158808.png new file mode 100644 index 0000000..185b134 Binary files /dev/null and b/javaEE/day01/assets/1667961158808.png differ diff --git a/javaEE/day01/assets/1667961431464.png b/javaEE/day01/assets/1667961431464.png new file mode 100644 index 0000000..9e4364f Binary files /dev/null and b/javaEE/day01/assets/1667961431464.png differ diff --git a/javaEE/day01/assets/1667962094874.png b/javaEE/day01/assets/1667962094874.png new file mode 100644 index 0000000..d9e5bec Binary files /dev/null and b/javaEE/day01/assets/1667962094874.png differ diff --git a/javaEE/day01/assets/1667962429330.png b/javaEE/day01/assets/1667962429330.png new file mode 100644 index 0000000..3e5c63e Binary files /dev/null and b/javaEE/day01/assets/1667962429330.png differ diff --git a/javaEE/day01/assets/1667963055406.png b/javaEE/day01/assets/1667963055406.png new file mode 100644 index 0000000..ab56f81 Binary files /dev/null and b/javaEE/day01/assets/1667963055406.png differ diff --git a/javaEE/day01/assets/1667963409639.png b/javaEE/day01/assets/1667963409639.png new file mode 100644 index 0000000..6dd9801 Binary files /dev/null and b/javaEE/day01/assets/1667963409639.png differ diff --git a/javaEE/day01/assets/1667963982363.png b/javaEE/day01/assets/1667963982363.png new file mode 100644 index 0000000..ba767f8 Binary files /dev/null and b/javaEE/day01/assets/1667963982363.png differ diff --git a/javaEE/day01/assets/1667964122701.png b/javaEE/day01/assets/1667964122701.png new file mode 100644 index 0000000..1ba8872 Binary files /dev/null and b/javaEE/day01/assets/1667964122701.png differ diff --git a/javaEE/day01/assets/1667964242932.png b/javaEE/day01/assets/1667964242932.png new file mode 100644 index 0000000..68cfd90 Binary files /dev/null and b/javaEE/day01/assets/1667964242932.png differ diff --git a/javaEE/day01/assets/1667964408590.png b/javaEE/day01/assets/1667964408590.png new file mode 100644 index 0000000..24fcfcf Binary files /dev/null and b/javaEE/day01/assets/1667964408590.png differ diff --git a/javaEE/day01/assets/1667964843623.png b/javaEE/day01/assets/1667964843623.png new file mode 100644 index 0000000..cc1f3d2 Binary files /dev/null and b/javaEE/day01/assets/1667964843623.png differ diff --git a/javaEE/day01/assets/1667964998343.png b/javaEE/day01/assets/1667964998343.png new file mode 100644 index 0000000..113be03 Binary files /dev/null and b/javaEE/day01/assets/1667964998343.png differ diff --git a/javaEE/day01/assets/1667965379132.png b/javaEE/day01/assets/1667965379132.png new file mode 100644 index 0000000..98707fc Binary files /dev/null and b/javaEE/day01/assets/1667965379132.png differ diff --git a/javaEE/day01/assets/1667965792608.png b/javaEE/day01/assets/1667965792608.png new file mode 100644 index 0000000..67a167f Binary files /dev/null and b/javaEE/day01/assets/1667965792608.png differ diff --git a/javaEE/day01/assets/1668010269268.png b/javaEE/day01/assets/1668010269268.png new file mode 100644 index 0000000..f4fbddf Binary files /dev/null and b/javaEE/day01/assets/1668010269268.png differ diff --git a/javaEE/day01/assets/1668011121584.png b/javaEE/day01/assets/1668011121584.png new file mode 100644 index 0000000..f54284f Binary files /dev/null and b/javaEE/day01/assets/1668011121584.png differ diff --git a/javaEE/day01/assets/1668011306684.png b/javaEE/day01/assets/1668011306684.png new file mode 100644 index 0000000..cf5ea32 Binary files /dev/null and b/javaEE/day01/assets/1668011306684.png differ diff --git a/javaEE/day01/assets/1668011501161.png b/javaEE/day01/assets/1668011501161.png new file mode 100644 index 0000000..8872dc6 Binary files /dev/null and b/javaEE/day01/assets/1668011501161.png differ diff --git a/javaEE/day01/assets/1668011569718.png b/javaEE/day01/assets/1668011569718.png new file mode 100644 index 0000000..648261d Binary files /dev/null and b/javaEE/day01/assets/1668011569718.png differ diff --git a/javaEE/day01/assets/1668011893953.png b/javaEE/day01/assets/1668011893953.png new file mode 100644 index 0000000..157747f Binary files /dev/null and b/javaEE/day01/assets/1668011893953.png differ diff --git a/javaEE/day01/assets/1668012052140.png b/javaEE/day01/assets/1668012052140.png new file mode 100644 index 0000000..7068eb8 Binary files /dev/null and b/javaEE/day01/assets/1668012052140.png differ diff --git a/javaEE/day01/assets/1668012259590.png b/javaEE/day01/assets/1668012259590.png new file mode 100644 index 0000000..b4445db Binary files /dev/null and b/javaEE/day01/assets/1668012259590.png differ diff --git a/javaEE/day01/assets/1668012492155.png b/javaEE/day01/assets/1668012492155.png new file mode 100644 index 0000000..c4aa377 Binary files /dev/null and b/javaEE/day01/assets/1668012492155.png differ diff --git a/javaEE/day01/assets/1668013517401.png b/javaEE/day01/assets/1668013517401.png new file mode 100644 index 0000000..7625226 Binary files /dev/null and b/javaEE/day01/assets/1668013517401.png differ diff --git a/javaEE/day01/assets/1668014394364.png b/javaEE/day01/assets/1668014394364.png new file mode 100644 index 0000000..549bc4a Binary files /dev/null and b/javaEE/day01/assets/1668014394364.png differ diff --git a/javaEE/day01/assets/1668014566080.png b/javaEE/day01/assets/1668014566080.png new file mode 100644 index 0000000..0eb0473 Binary files /dev/null and b/javaEE/day01/assets/1668014566080.png differ diff --git a/javaEE/day01/assets/1668014985661.png b/javaEE/day01/assets/1668014985661.png new file mode 100644 index 0000000..37c9450 Binary files /dev/null and b/javaEE/day01/assets/1668014985661.png differ diff --git a/javaEE/day01/assets/1668015339041.png b/javaEE/day01/assets/1668015339041.png new file mode 100644 index 0000000..4ea889e Binary files /dev/null and b/javaEE/day01/assets/1668015339041.png differ diff --git a/javaEE/day01/assets/1668015534555.png b/javaEE/day01/assets/1668015534555.png new file mode 100644 index 0000000..6c0b992 Binary files /dev/null and b/javaEE/day01/assets/1668015534555.png differ diff --git a/javaEE/day01/assets/1668015886516.png b/javaEE/day01/assets/1668015886516.png new file mode 100644 index 0000000..7053f2d Binary files /dev/null and b/javaEE/day01/assets/1668015886516.png differ diff --git a/javaEE/day01/assets/1668016085857.png b/javaEE/day01/assets/1668016085857.png new file mode 100644 index 0000000..19f3c89 Binary files /dev/null and b/javaEE/day01/assets/1668016085857.png differ diff --git a/javaEE/day01/assets/1668016321733.png b/javaEE/day01/assets/1668016321733.png new file mode 100644 index 0000000..7f48ed2 Binary files /dev/null and b/javaEE/day01/assets/1668016321733.png differ diff --git a/javaEE/day01/assets/1668016526099.png b/javaEE/day01/assets/1668016526099.png new file mode 100644 index 0000000..109b70b Binary files /dev/null and b/javaEE/day01/assets/1668016526099.png differ diff --git a/javaEE/day01/assets/1668016722147.png b/javaEE/day01/assets/1668016722147.png new file mode 100644 index 0000000..e43be47 Binary files /dev/null and b/javaEE/day01/assets/1668016722147.png differ diff --git a/javaEE/day01/assets/1668016732096.png b/javaEE/day01/assets/1668016732096.png new file mode 100644 index 0000000..b55bb8a Binary files /dev/null and b/javaEE/day01/assets/1668016732096.png differ diff --git a/javaEE/day01/assets/1668016743982.png b/javaEE/day01/assets/1668016743982.png new file mode 100644 index 0000000..b70faa9 Binary files /dev/null and b/javaEE/day01/assets/1668016743982.png differ diff --git a/javaEE/day01/assets/1668016758205.png b/javaEE/day01/assets/1668016758205.png new file mode 100644 index 0000000..71099d0 Binary files /dev/null and b/javaEE/day01/assets/1668016758205.png differ diff --git a/javaEE/day01/assets/1668016767325.png b/javaEE/day01/assets/1668016767325.png new file mode 100644 index 0000000..7ef237a Binary files /dev/null and b/javaEE/day01/assets/1668016767325.png differ diff --git a/javaEE/day01/assets/1668016779793.png b/javaEE/day01/assets/1668016779793.png new file mode 100644 index 0000000..34ba0e2 Binary files /dev/null and b/javaEE/day01/assets/1668016779793.png differ diff --git a/javaEE/day01/assets/1668016788307.png b/javaEE/day01/assets/1668016788307.png new file mode 100644 index 0000000..5d94f13 Binary files /dev/null and b/javaEE/day01/assets/1668016788307.png differ diff --git a/javaEE/day01/assets/1668016882968.png b/javaEE/day01/assets/1668016882968.png new file mode 100644 index 0000000..d64d1e1 Binary files /dev/null and b/javaEE/day01/assets/1668016882968.png differ diff --git a/javaEE/day01/assets/1668017205875.png b/javaEE/day01/assets/1668017205875.png new file mode 100644 index 0000000..0b2952d Binary files /dev/null and b/javaEE/day01/assets/1668017205875.png differ diff --git a/javaEE/day01/assets/1668017659915.png b/javaEE/day01/assets/1668017659915.png new file mode 100644 index 0000000..b15bde5 Binary files /dev/null and b/javaEE/day01/assets/1668017659915.png differ diff --git a/javaEE/day01/assets/1668017702953.png b/javaEE/day01/assets/1668017702953.png new file mode 100644 index 0000000..ff96bbc Binary files /dev/null and b/javaEE/day01/assets/1668017702953.png differ diff --git a/javaEE/day01/assets/1668017754251.png b/javaEE/day01/assets/1668017754251.png new file mode 100644 index 0000000..85ef45e Binary files /dev/null and b/javaEE/day01/assets/1668017754251.png differ diff --git a/javaEE/day01/assets/1668017757493.png b/javaEE/day01/assets/1668017757493.png new file mode 100644 index 0000000..85ef45e Binary files /dev/null and b/javaEE/day01/assets/1668017757493.png differ diff --git a/javaEE/day01/assets/1668017774832.png b/javaEE/day01/assets/1668017774832.png new file mode 100644 index 0000000..f780ff4 Binary files /dev/null and b/javaEE/day01/assets/1668017774832.png differ diff --git a/javaEE/day01/assets/1668018155880.png b/javaEE/day01/assets/1668018155880.png new file mode 100644 index 0000000..fb1485c Binary files /dev/null and b/javaEE/day01/assets/1668018155880.png differ diff --git a/javaEE/day01/assets/1668018322115.png b/javaEE/day01/assets/1668018322115.png new file mode 100644 index 0000000..161dd28 Binary files /dev/null and b/javaEE/day01/assets/1668018322115.png differ diff --git a/javaEE/day01/assets/1668018486183.png b/javaEE/day01/assets/1668018486183.png new file mode 100644 index 0000000..82ecf73 Binary files /dev/null and b/javaEE/day01/assets/1668018486183.png differ diff --git a/javaEE/day01/assets/1668018581006.png b/javaEE/day01/assets/1668018581006.png new file mode 100644 index 0000000..729c51c Binary files /dev/null and b/javaEE/day01/assets/1668018581006.png differ diff --git a/javaEE/day01/assets/1668018794824.png b/javaEE/day01/assets/1668018794824.png new file mode 100644 index 0000000..c223f36 Binary files /dev/null and b/javaEE/day01/assets/1668018794824.png differ diff --git a/javaEE/day01/assets/1668018832540.png b/javaEE/day01/assets/1668018832540.png new file mode 100644 index 0000000..e100e32 Binary files /dev/null and b/javaEE/day01/assets/1668018832540.png differ diff --git a/javaEE/day01/assets/1668019011221.png b/javaEE/day01/assets/1668019011221.png new file mode 100644 index 0000000..65a09fc Binary files /dev/null and b/javaEE/day01/assets/1668019011221.png differ diff --git a/javaEE/day01/assets/1668019050385.png b/javaEE/day01/assets/1668019050385.png new file mode 100644 index 0000000..c730844 Binary files /dev/null and b/javaEE/day01/assets/1668019050385.png differ diff --git a/javaEE/day01/assets/1668019732581.png b/javaEE/day01/assets/1668019732581.png new file mode 100644 index 0000000..c730844 Binary files /dev/null and b/javaEE/day01/assets/1668019732581.png differ diff --git a/javaEE/day01/assets/1668020096836.png b/javaEE/day01/assets/1668020096836.png new file mode 100644 index 0000000..b424658 Binary files /dev/null and b/javaEE/day01/assets/1668020096836.png differ diff --git a/javaEE/day01/assets/1668020166666.png b/javaEE/day01/assets/1668020166666.png new file mode 100644 index 0000000..75d23d3 Binary files /dev/null and b/javaEE/day01/assets/1668020166666.png differ diff --git a/javaEE/day01/assets/1668020635987.png b/javaEE/day01/assets/1668020635987.png new file mode 100644 index 0000000..a5ada5a Binary files /dev/null and b/javaEE/day01/assets/1668020635987.png differ diff --git a/javaEE/day01/assets/1668020876108.png b/javaEE/day01/assets/1668020876108.png new file mode 100644 index 0000000..6b86f02 Binary files /dev/null and b/javaEE/day01/assets/1668020876108.png differ diff --git a/javaEE/day01/assets/1668020985363.png b/javaEE/day01/assets/1668020985363.png new file mode 100644 index 0000000..e052ca4 Binary files /dev/null and b/javaEE/day01/assets/1668020985363.png differ diff --git a/javaEE/day01/assets/1668021080890.png b/javaEE/day01/assets/1668021080890.png new file mode 100644 index 0000000..4396306 Binary files /dev/null and b/javaEE/day01/assets/1668021080890.png differ diff --git a/javaEE/day01/assets/1668021241174.png b/javaEE/day01/assets/1668021241174.png new file mode 100644 index 0000000..1c9288a Binary files /dev/null and b/javaEE/day01/assets/1668021241174.png differ diff --git a/javaEE/day01/assets/1668021614357.png b/javaEE/day01/assets/1668021614357.png new file mode 100644 index 0000000..725ef97 Binary files /dev/null and b/javaEE/day01/assets/1668021614357.png differ diff --git a/javaEE/day01/assets/1668022078783.png b/javaEE/day01/assets/1668022078783.png new file mode 100644 index 0000000..fbb9a34 Binary files /dev/null and b/javaEE/day01/assets/1668022078783.png differ diff --git a/javaEE/day01/assets/1668022626367.png b/javaEE/day01/assets/1668022626367.png new file mode 100644 index 0000000..769c541 Binary files /dev/null and b/javaEE/day01/assets/1668022626367.png differ diff --git a/javaEE/day01/assets/1668022845725.png b/javaEE/day01/assets/1668022845725.png new file mode 100644 index 0000000..33aaa9f Binary files /dev/null and b/javaEE/day01/assets/1668022845725.png differ diff --git a/javaEE/day01/assets/1668055478588.png b/javaEE/day01/assets/1668055478588.png new file mode 100644 index 0000000..0cb47d6 Binary files /dev/null and b/javaEE/day01/assets/1668055478588.png differ diff --git a/javaEE/day01/assets/1668055644349.png b/javaEE/day01/assets/1668055644349.png new file mode 100644 index 0000000..d3f9136 Binary files /dev/null and b/javaEE/day01/assets/1668055644349.png differ diff --git a/javaEE/day01/assets/1668055767679.png b/javaEE/day01/assets/1668055767679.png new file mode 100644 index 0000000..43f7368 Binary files /dev/null and b/javaEE/day01/assets/1668055767679.png differ diff --git a/javaEE/day01/assets/1668055779440.png b/javaEE/day01/assets/1668055779440.png new file mode 100644 index 0000000..43f7368 Binary files /dev/null and b/javaEE/day01/assets/1668055779440.png differ diff --git a/javaEE/day01/assets/1668096182111.png b/javaEE/day01/assets/1668096182111.png new file mode 100644 index 0000000..65ebfda Binary files /dev/null and b/javaEE/day01/assets/1668096182111.png differ diff --git a/javaEE/day01/assets/1668096294983.png b/javaEE/day01/assets/1668096294983.png new file mode 100644 index 0000000..9e09a3e Binary files /dev/null and b/javaEE/day01/assets/1668096294983.png differ diff --git a/javaEE/day01/assets/1668096550951.png b/javaEE/day01/assets/1668096550951.png new file mode 100644 index 0000000..7d503cc Binary files /dev/null and b/javaEE/day01/assets/1668096550951.png differ diff --git a/javaEE/day01/assets/1668097398103.png b/javaEE/day01/assets/1668097398103.png new file mode 100644 index 0000000..e825291 Binary files /dev/null and b/javaEE/day01/assets/1668097398103.png differ diff --git a/javaEE/day01/assets/1668097510803.png b/javaEE/day01/assets/1668097510803.png new file mode 100644 index 0000000..d1cf0db Binary files /dev/null and b/javaEE/day01/assets/1668097510803.png differ diff --git a/javaEE/day01/assets/1668098311751.png b/javaEE/day01/assets/1668098311751.png new file mode 100644 index 0000000..f018980 Binary files /dev/null and b/javaEE/day01/assets/1668098311751.png differ diff --git a/javaEE/day01/assets/1668098529577.png b/javaEE/day01/assets/1668098529577.png new file mode 100644 index 0000000..db332ef Binary files /dev/null and b/javaEE/day01/assets/1668098529577.png differ diff --git a/javaEE/day01/assets/1668098726749.png b/javaEE/day01/assets/1668098726749.png new file mode 100644 index 0000000..b452443 Binary files /dev/null and b/javaEE/day01/assets/1668098726749.png differ diff --git a/javaEE/day01/assets/1668099261565.png b/javaEE/day01/assets/1668099261565.png new file mode 100644 index 0000000..f586ca3 Binary files /dev/null and b/javaEE/day01/assets/1668099261565.png differ diff --git a/javaEE/day01/assets/1668099466667.png b/javaEE/day01/assets/1668099466667.png new file mode 100644 index 0000000..10be6eb Binary files /dev/null and b/javaEE/day01/assets/1668099466667.png differ diff --git a/javaEE/day01/assets/1668099678835.png b/javaEE/day01/assets/1668099678835.png new file mode 100644 index 0000000..88da21e Binary files /dev/null and b/javaEE/day01/assets/1668099678835.png differ diff --git a/javaEE/day01/assets/1668099816024.png b/javaEE/day01/assets/1668099816024.png new file mode 100644 index 0000000..5ba514a Binary files /dev/null and b/javaEE/day01/assets/1668099816024.png differ diff --git a/javaEE/day01/assets/1668099928582.png b/javaEE/day01/assets/1668099928582.png new file mode 100644 index 0000000..0079b8c Binary files /dev/null and b/javaEE/day01/assets/1668099928582.png differ diff --git a/javaEE/day01/assets/1668100655848.png b/javaEE/day01/assets/1668100655848.png new file mode 100644 index 0000000..1e42d67 Binary files /dev/null and b/javaEE/day01/assets/1668100655848.png differ diff --git a/javaEE/day01/assets/1668101592422.png b/javaEE/day01/assets/1668101592422.png new file mode 100644 index 0000000..93cc2c7 Binary files /dev/null and b/javaEE/day01/assets/1668101592422.png differ diff --git a/javaEE/day01/assets/1668101718354.png b/javaEE/day01/assets/1668101718354.png new file mode 100644 index 0000000..f68e9b6 Binary files /dev/null and b/javaEE/day01/assets/1668101718354.png differ diff --git a/javaEE/day01/assets/1668101840992.png b/javaEE/day01/assets/1668101840992.png new file mode 100644 index 0000000..9833136 Binary files /dev/null and b/javaEE/day01/assets/1668101840992.png differ diff --git a/javaEE/day01/assets/1668101996370.png b/javaEE/day01/assets/1668101996370.png new file mode 100644 index 0000000..c769416 Binary files /dev/null and b/javaEE/day01/assets/1668101996370.png differ diff --git a/javaEE/day01/assets/1668102138950.png b/javaEE/day01/assets/1668102138950.png new file mode 100644 index 0000000..0c007dd Binary files /dev/null and b/javaEE/day01/assets/1668102138950.png differ diff --git a/javaEE/day01/assets/1668102183766.png b/javaEE/day01/assets/1668102183766.png new file mode 100644 index 0000000..9c69a27 Binary files /dev/null and b/javaEE/day01/assets/1668102183766.png differ diff --git a/javaEE/day01/assets/1668102256305.png b/javaEE/day01/assets/1668102256305.png new file mode 100644 index 0000000..c187173 Binary files /dev/null and b/javaEE/day01/assets/1668102256305.png differ diff --git a/javaEE/day01/assets/1668102426953.png b/javaEE/day01/assets/1668102426953.png new file mode 100644 index 0000000..2bfb6a5 Binary files /dev/null and b/javaEE/day01/assets/1668102426953.png differ diff --git a/javaEE/day01/assets/1668102527993.png b/javaEE/day01/assets/1668102527993.png new file mode 100644 index 0000000..c2b3757 Binary files /dev/null and b/javaEE/day01/assets/1668102527993.png differ diff --git a/javaEE/day01/assets/1668102736759.png b/javaEE/day01/assets/1668102736759.png new file mode 100644 index 0000000..b0b9f65 Binary files /dev/null and b/javaEE/day01/assets/1668102736759.png differ diff --git a/javaEE/day01/assets/1668103531260.png b/javaEE/day01/assets/1668103531260.png new file mode 100644 index 0000000..6b41c1b Binary files /dev/null and b/javaEE/day01/assets/1668103531260.png differ diff --git a/javaEE/day01/assets/1668104421608.png b/javaEE/day01/assets/1668104421608.png new file mode 100644 index 0000000..f0f09a3 Binary files /dev/null and b/javaEE/day01/assets/1668104421608.png differ diff --git a/javaEE/day01/assets/1668104530206.png b/javaEE/day01/assets/1668104530206.png new file mode 100644 index 0000000..1834dfd Binary files /dev/null and b/javaEE/day01/assets/1668104530206.png differ diff --git a/javaEE/day01/assets/1668229086303.png b/javaEE/day01/assets/1668229086303.png new file mode 100644 index 0000000..3d11862 Binary files /dev/null and b/javaEE/day01/assets/1668229086303.png differ diff --git a/javaEE/day01/assets/1668229100646.png b/javaEE/day01/assets/1668229100646.png new file mode 100644 index 0000000..e9f7923 Binary files /dev/null and b/javaEE/day01/assets/1668229100646.png differ diff --git a/javaEE/day01/assets/1668229223510.png b/javaEE/day01/assets/1668229223510.png new file mode 100644 index 0000000..da0afeb Binary files /dev/null and b/javaEE/day01/assets/1668229223510.png differ diff --git a/javaEE/day01/assets/1668229905732.png b/javaEE/day01/assets/1668229905732.png new file mode 100644 index 0000000..2ec2ff5 Binary files /dev/null and b/javaEE/day01/assets/1668229905732.png differ diff --git a/javaEE/day01/assets/a.gif b/javaEE/day01/assets/a.gif new file mode 100644 index 0000000..2dac409 Binary files /dev/null and b/javaEE/day01/assets/a.gif differ diff --git a/javaEE/day01/assets/css.gif b/javaEE/day01/assets/css.gif new file mode 100644 index 0000000..9d7a5f8 Binary files /dev/null and b/javaEE/day01/assets/css.gif differ diff --git a/javaEE/day01/assets/html.gif b/javaEE/day01/assets/html.gif new file mode 100644 index 0000000..bdd9230 Binary files /dev/null and b/javaEE/day01/assets/html.gif differ diff --git a/javaEE/day01/assets/image-20230309163858689.png b/javaEE/day01/assets/image-20230309163858689.png new file mode 100644 index 0000000..22139cd Binary files /dev/null and b/javaEE/day01/assets/image-20230309163858689.png differ diff --git a/javaEE/day01/assets/image-20230309170412197.png b/javaEE/day01/assets/image-20230309170412197.png new file mode 100644 index 0000000..02e65cd Binary files /dev/null and b/javaEE/day01/assets/image-20230309170412197.png differ diff --git a/javaEE/day01/assets/image-20230309172507600.png b/javaEE/day01/assets/image-20230309172507600.png new file mode 100644 index 0000000..05d45ab Binary files /dev/null and b/javaEE/day01/assets/image-20230309172507600.png differ diff --git a/javaEE/day01/assets/image-20230309172534138.png b/javaEE/day01/assets/image-20230309172534138.png new file mode 100644 index 0000000..557cb9e Binary files /dev/null and b/javaEE/day01/assets/image-20230309172534138.png differ diff --git a/javaEE/day01/assets/image-20230309172634388.png b/javaEE/day01/assets/image-20230309172634388.png new file mode 100644 index 0000000..d460a49 Binary files /dev/null and b/javaEE/day01/assets/image-20230309172634388.png differ diff --git a/javaEE/day01/assets/image-20230309173355794.png b/javaEE/day01/assets/image-20230309173355794.png new file mode 100644 index 0000000..a54ed05 Binary files /dev/null and b/javaEE/day01/assets/image-20230309173355794.png differ diff --git a/javaEE/day01/assets/image-20230309174438491.png b/javaEE/day01/assets/image-20230309174438491.png new file mode 100644 index 0000000..98cf596 Binary files /dev/null and b/javaEE/day01/assets/image-20230309174438491.png differ diff --git a/javaEE/day01/assets/image-20230309175121361.png b/javaEE/day01/assets/image-20230309175121361.png new file mode 100644 index 0000000..06ab439 Binary files /dev/null and b/javaEE/day01/assets/image-20230309175121361.png differ diff --git a/javaEE/day01/assets/image-20230309175941128.png b/javaEE/day01/assets/image-20230309175941128.png new file mode 100644 index 0000000..c377d91 Binary files /dev/null and b/javaEE/day01/assets/image-20230309175941128.png differ diff --git a/javaEE/day01/assets/image-20230309191725329.png b/javaEE/day01/assets/image-20230309191725329.png new file mode 100644 index 0000000..22513ee Binary files /dev/null and b/javaEE/day01/assets/image-20230309191725329.png differ diff --git a/javaEE/day01/assets/image-20230309192625939.png b/javaEE/day01/assets/image-20230309192625939.png new file mode 100644 index 0000000..8a6352c Binary files /dev/null and b/javaEE/day01/assets/image-20230309192625939.png differ diff --git a/javaEE/day01/assets/image-20230309221308252.png b/javaEE/day01/assets/image-20230309221308252.png new file mode 100644 index 0000000..2cdd343 Binary files /dev/null and b/javaEE/day01/assets/image-20230309221308252.png differ diff --git a/javaEE/day01/assets/image-20230309221530214.png b/javaEE/day01/assets/image-20230309221530214.png new file mode 100644 index 0000000..189024a Binary files /dev/null and b/javaEE/day01/assets/image-20230309221530214.png differ diff --git a/javaEE/day01/assets/image-20230309221756293.png b/javaEE/day01/assets/image-20230309221756293.png new file mode 100644 index 0000000..dcd72a0 Binary files /dev/null and b/javaEE/day01/assets/image-20230309221756293.png differ diff --git a/javaEE/day01/assets/image-20230309221809255.png b/javaEE/day01/assets/image-20230309221809255.png new file mode 100644 index 0000000..dcd72a0 Binary files /dev/null and b/javaEE/day01/assets/image-20230309221809255.png differ diff --git a/javaEE/day01/assets/image-20230309222608750.png b/javaEE/day01/assets/image-20230309222608750.png new file mode 100644 index 0000000..d3f80ed Binary files /dev/null and b/javaEE/day01/assets/image-20230309222608750.png differ diff --git a/javaEE/day01/assets/image-20230309223020809.png b/javaEE/day01/assets/image-20230309223020809.png new file mode 100644 index 0000000..99550fb Binary files /dev/null and b/javaEE/day01/assets/image-20230309223020809.png differ diff --git a/javaEE/day01/assets/image-20230309224226495.png b/javaEE/day01/assets/image-20230309224226495.png new file mode 100644 index 0000000..5f8b77f Binary files /dev/null and b/javaEE/day01/assets/image-20230309224226495.png differ diff --git a/javaEE/day01/assets/image-20230309224401950.png b/javaEE/day01/assets/image-20230309224401950.png new file mode 100644 index 0000000..73f70e0 Binary files /dev/null and b/javaEE/day01/assets/image-20230309224401950.png differ diff --git a/javaEE/day01/assets/image-20230309224645231.png b/javaEE/day01/assets/image-20230309224645231.png new file mode 100644 index 0000000..6536ccd Binary files /dev/null and b/javaEE/day01/assets/image-20230309224645231.png differ diff --git a/javaEE/day01/assets/image-20230309231828433.png b/javaEE/day01/assets/image-20230309231828433.png new file mode 100644 index 0000000..02d68c6 Binary files /dev/null and b/javaEE/day01/assets/image-20230309231828433.png differ diff --git a/javaEE/day01/assets/image-20230309233408698.png b/javaEE/day01/assets/image-20230309233408698.png new file mode 100644 index 0000000..5281461 Binary files /dev/null and b/javaEE/day01/assets/image-20230309233408698.png differ diff --git a/javaEE/day01/assets/image-20230310084859695.png b/javaEE/day01/assets/image-20230310084859695.png new file mode 100644 index 0000000..d29b341 Binary files /dev/null and b/javaEE/day01/assets/image-20230310084859695.png differ diff --git a/javaEE/day01/assets/image-20230310092442972.png b/javaEE/day01/assets/image-20230310092442972.png new file mode 100644 index 0000000..293de2d Binary files /dev/null and b/javaEE/day01/assets/image-20230310092442972.png differ diff --git a/javaEE/day01/assets/image-20230310092820616.png b/javaEE/day01/assets/image-20230310092820616.png new file mode 100644 index 0000000..f095e88 Binary files /dev/null and b/javaEE/day01/assets/image-20230310092820616.png differ diff --git a/javaEE/day01/assets/image-20230310093247265.png b/javaEE/day01/assets/image-20230310093247265.png new file mode 100644 index 0000000..8ef147f Binary files /dev/null and b/javaEE/day01/assets/image-20230310093247265.png differ diff --git a/javaEE/day01/assets/image-20230310093700812.png b/javaEE/day01/assets/image-20230310093700812.png new file mode 100644 index 0000000..c53b0ac Binary files /dev/null and b/javaEE/day01/assets/image-20230310093700812.png differ diff --git a/javaEE/day01/assets/image-20230310093734941.png b/javaEE/day01/assets/image-20230310093734941.png new file mode 100644 index 0000000..c4c60ce Binary files /dev/null and b/javaEE/day01/assets/image-20230310093734941.png differ diff --git a/javaEE/day01/assets/image-20230310093827748.png b/javaEE/day01/assets/image-20230310093827748.png new file mode 100644 index 0000000..c0864f7 Binary files /dev/null and b/javaEE/day01/assets/image-20230310093827748.png differ diff --git a/javaEE/day01/assets/image-20230310094312355.png b/javaEE/day01/assets/image-20230310094312355.png new file mode 100644 index 0000000..0d7f448 Binary files /dev/null and b/javaEE/day01/assets/image-20230310094312355.png differ diff --git a/javaEE/day01/assets/image-20230310094412539.png b/javaEE/day01/assets/image-20230310094412539.png new file mode 100644 index 0000000..2f25ef8 Binary files /dev/null and b/javaEE/day01/assets/image-20230310094412539.png differ diff --git a/javaEE/day01/assets/image-20230310094732466.png b/javaEE/day01/assets/image-20230310094732466.png new file mode 100644 index 0000000..a770398 Binary files /dev/null and b/javaEE/day01/assets/image-20230310094732466.png differ diff --git a/javaEE/day01/assets/t1.png b/javaEE/day01/assets/t1.png new file mode 100644 index 0000000..22e6f68 Binary files /dev/null and b/javaEE/day01/assets/t1.png differ diff --git a/javaEE/day01/day01-HTML-CSS.md b/javaEE/day01/day01-HTML-CSS.md new file mode 100644 index 0000000..0a1b521 --- /dev/null +++ b/javaEE/day01/day01-HTML-CSS.md @@ -0,0 +1,1389 @@ +# day01-HTML-CSS +## 1. 前端开发介绍 + +我们介绍Web网站工作流程的时候提到,前端开发,主要的职责就是将数据以好看的样式呈现出来。说白了,就是开发网页程序,如下图所示: + +![image-20230309163858689](assets/image-20230309163858689.png) + + + +那在讲解web前端开发之前,我们先需要对web前端开发有一个整体的认知。主要明确一下三个问题: + +1). 网页有哪些部分组成 ? + +文字、图片、音频、视频、超链接、表格等等。 + + + +2). 我们看到的网页,背后的本质是什么 ? + +程序员写的前端代码 (备注:在前后端分离的开发模式中,) + + + +3). 前端的代码是如何转换成用户眼中的网页的 ? + +通过浏览器转化(解析和渲染)成用户看到的网页 + +浏览器中对代码进行解析和渲染的部分,称为 **浏览器内核** + + + +而市面上的浏览器非常多,比如:IE、火狐Firefox、苹果safari、欧朋、谷歌Chrome、QQ浏览器、360浏览器等等。 而且我们电脑上安装的浏览器可能都不止一个,有很多。 + +但是呢,需要大家注意的是,不同的浏览器,内核不同,对于相同的前端代码解析的效果也会存在差异。 那这就会造成一个问题,同一段前端程序,不同浏览器展示出来的效果是不一样的,这个用户体验就很差了。而我们想达到的效果则是,即使用户使用的是不同的浏览器,解析同一段前端代码,最终展示出来的效果都是相同的。 + +要想达成这样一个目标,我们就需要定义一个统一的标准,然后让各大浏览器厂商都参照这个标准来实现即可。 而这套标准呢,其实早都已经定义好了,那就是我们接下来,要介绍的web标准。 + + + +**Web标准**也称为**网页标准**,由一系列的标准组成,大部分由W3C( World Wide Web Consortium,万维网联盟)负责制定。由三个组成部分: + +- HTML:负责网页的结构(页面元素和内容)。 + +- CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。 + +- JavaScript:负责网页的行为(交互效果)。 + + +![image-20230309163858689](assets/image-20230309170412197.png) + + +当然了,随着技术的发展,我们为了更加快速的开发,现在也出现了很多前端开发的高级技术。例如:vue、elementui、Axios等等。 + +那这些内容呢,也是我们前端三天课程中要讲解的内容。 前端的3天课程安排如下: + +- HTML & CSS +- JavaScript & Vue +- Ajax & Axios & ElementUI & Nginx + + + + + +## 2. HTML & CSS + +1). 什么是HTML ? + +> HTML:HyperText Markup Language,超文本标记语言。 +> +> - 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。 +> +> - 标记语言:由标签构成的语言 +> - HTML标签都是预定义好的。例如:使用 <h1> 标签展示标题,使用<a>展示超链接,使用<img>展示图片,<video>展示视频。 +> - HTML代码直接在浏览器中运行,HTML标签由浏览器解析。 + +下面展示的是一段html代码经过浏览器解析,呈现的效果如右图所示: + +​ ![1556078709856](assets/image-20230309172534138.png) + +2). 什么是CSS ? + +> **CSS:** Cascading Style Sheet,层叠样式表,用于控制页面的样式(表现)。 + +下面展示的是一段 html代码 及 CSS样式 经过浏览器解析,呈现的效果如右图所示: + + +![1556078709856](assets/image-20230309172634388.png) +​ + + + + + +### 2.1 HTML快速入门 + +#### 2.1.1 操作 + +第一步:创建一个名为HTML的文件夹,然后找到课程资料中的 1.jpg 文件放到该目录下,此时HTML文件夹中内容如下: + +![1668011569718](assets/1668011569718.png) + + + +第二步:创建一个文本文件,然后修改文件名为hello.html,注意文件的后缀是.html,如下图所示: + +![1668012052140](assets/1668012052140.png) + + + +第三步:选中文件,鼠标右击,选择使用记事本打开文件,并且编写前端代码 + +首先html有固定的基本结构 + +~~~html + + + HTML 快速入门 + + +

Hello HTML

+ + + +~~~ + + + +其中<html>是根标签,<head>和<body>是子标签,<head>中的字标签<title>是用来定义网页的标题的,里面定义的内容会显示在浏览器网页的标题位置。 + +而 <body> 中编写的内容,就网页中显示的核心内容。 + + + +第四步:然后选中文件,鼠标右击,选择使用浏览器打开文件,浏览器呈现效果如下: + + +![1668012052140](assets/image-20230309173355794.png) + + +#### 2.1.2 总结 + +1). HTML页面的基础结构标签 + +~~~html + + + + + + + + +~~~ + +<title>中定义标题显示在浏览器的标题位置,<body>中定义的内容会呈现在浏览器的内容区域 + + + +2). HTML中的标签特点 + +- HTML标签不区分大小写 +- HTML标签的属性值,采用单引号、双引号都可以 +- HTML语法相对比较松散 (建议大家编写HTML标签的时候尽量严谨一些) + + + + + +### 2.2 开发工具 + +- 我们通过快速入门案例,发现由记事本文件开发html是非常不方便的,所以接下来我们需要学习一款前端专业的开发工具VS Code。 + +- Visual Studio Code(简称 VS Code )是 Microsoft 于2015年4月发布的一款代码编辑器。VS Code 对前端代码有非常强大的支持,同时也其他编程语言(例如:C++、Java、Python、PHP、Go等)。VS Code 提供了非常强大的插件库,大大提高了开发效率。 + +- 官网: https://code.visualstudio.com + + + +- 详细安装教程:参考 **资料/VSCode安装/安装文档/VS Code安装文档.md** + + + +> 注意:需要注意的是,我们作为一名开发者,不应该将软件软装在包含中文名的路径中 。 + + + + + + + + + +### 2.3 基础标签 & 样式 + +那我们在讲解HTML的常见基础标签 及 CSS的基本样式时,我们就以 新浪新闻页面 为例,来进行讲解,这样大家不仅能够知道 常见标签及样式的作用,还能够知道具体的应用场景。 + +新浪新闻的具体页面效果如下: + +![image-20230309221756293](assets/image-20230309221756293.png) + +原始页面网址:https://news.sina.com.cn/gov/xlxw/2023-03-03/doc-imyipzuy7321600.shtml + + + +而对于这个新浪新闻的页面来说,核心内容分为两个部分,如下: + +- 新浪新闻-标题部分 +- 新浪新闻-正文部分 + +![image-20230309222608750](assets/image-20230309222608750.png) + + + + + +#### 2.3.1 新浪新闻-标题实现 + +##### 2.3.1.1 标题排版 + +###### 2.3.1.1.1 分析 + + +![1668012052140](assets/image-20230309223020809.png) + + 1). 第一部分,是一张图片,需要用到HTML中的图片标签 <img> 来实现。 + + 2). 第二部分,是一个标题,需要用到HTML中的标题标签 <h1> ... <h6>来实现。 + + 3). 第三部分,有两条水平分割线,需要用到HTML中的 <hr> 标签来定义水平分割线。 + + + +###### 2.3.1.1.2 标签 + +1). 图片标签 img + +```html +A. 图片标签: + +B. 常见属性: + src: 指定图像的url (可以指定 绝对路径 , 也可以指定 相对路径) + width: 图像的宽度 (像素 / 百分比 , 相对于父元素的百分比) + height: 图像的高度 (像素 / 百分比 , 相对于父元素的百分比) + + 备注: 一般width 和 height 我们只会指定一个,另外一个会自动的等比例缩放。 + +C. 路径书写方式: + 绝对路径: + 1. 绝对磁盘路径: C:\Users\Administrator\Desktop\HTML\img\news_logo.png + + + 2. 绝对网络路径: https://i2.sinaimg.cn/dy/deco/2012/0613/yocc20120613img01/news_logo.png + + + 相对路径: + ./ : 当前目录 , ./ 可以省略的 + ../: 上一级目录 +``` + + + +2). 标题标签 h 系列 + +```html +A. 标题标签:

-

+ +

111111111111

+

111111111111

+

111111111111

+

111111111111

+
111111111111
+
111111111111
+ +B. 效果 : h1为一级标题,字体也是最大的 ; h6为六级标题,字体是最小的。 +``` + + + +3). 水平分页线标签 <hr> + + + +###### 2.3.1.1.2 实现 + +1). 打开VsCode,选择左侧最底部的 "资源管理器",然后选择打开文件夹,选择打开桌面的 HTML 文件夹 + +2). 将资料中提供的 图片、音频、视频 文件夹的这三个文件夹(里面是图片、音视频素材),复制到 HTML 文件夹中。 + +![image-20230309224226495](assets/image-20230309224226495.png) + +3). 在VsCode中创建一个新的 html 文件,文件的后缀名设置为 .html + +![image-20230309224401950](assets/image-20230309224401950.png) + +4). html 文件创建好之后,在其中输入 !,然后直接回车,就可以生成 HTML 的基础结构标签 + +![image-20230309224645231](assets/image-20230309224645231.png) + +5). 编写标题排版的核心代码 + +```html + + + + + + + + + + 焦点访谈:中国底气 新思想夯实大国粮仓 + + + + 新浪政务 > 正文 + +

焦点访谈:中国底气 新思想夯实大国粮仓

+ +
+ 2023年03月02日 21:50 央视网 +
+ + + +``` + + + + + + + +##### 2.3.1.2 标题样式 + +新浪新闻的标题部分的基本排版,我们已经完成了,然后大家会看到,我们编写的一级标题,默认字体颜色为纯黑色。 而原始的新浪新闻页面的新闻标题字体,并不是纯黑色,而是灰黑色, 那接下来,我们就要来设置这个字体的颜色。 而要设置这个字体的颜色,我们就需要通过CSS样式来控制 。 + +那在HTML的文件中,我们如何来编写CSS样式呢,此时就涉及到CSS的三种引入方式。 + + + +###### 2.3.1.2.1 CSS引入方式 + +具体有3种引入方式,语法如下表格所示: + +| 名称 | 语法描述 | 示例 | +| -------- | ------------------------------------------------- | ---------------------------------------------- | +| 行内样式 | 在标签内使用style属性,属性值是css属性键值对 | <h1 style="xxx:xxx;">中国新闻网</h1> | +| 内嵌样式 | 定义<style>标签,在标签内部定义css样式 | <style> h1 {...} </style> | +| 外联样式 | 定义<link>标签,通过href属性引入外部css文件 | <link rel="stylesheet" href="css/news.css"> | + +对于上述3种引入方式,企业开发的使用情况如下: + +1. 内联样式会出现大量的代码冗余,不方便后期的维护,所以不常用。 +2. 内部样式,通过定义css选择器,让样式作用于当前页面的指定的标签上。 +3. 外部样式,html和css实现了完全的分离,企业开发常用方式。 + + + +###### 2.3.1.2.2 颜色表示 + +在前端程序开发中,颜色的表示方式常见的有如下三种: + +| **表示方式** | **表示含义** | **取值** | +| -------------- | --------------------------------- | ------------------------------------------- | +| 关键字 | 预定义的颜色名 | red、green、blue... | +| rgb表示法 | 红绿蓝三原色,每项取值范围:0-255 | rgb(0,0,0)、rgb(255,255,255)、rgb(255,0,0) | +| 十六进制表示法 | #开头,将数字转换成十六进制表示 | #000000、#ff0000、#cccccc,简写:#000、#ccc | + + + +###### 2.3.1.2.3 标题字体颜色 + +```html + + + + + + + 焦点访谈:中国底气 新思想夯实大国粮仓 + + + + + + + + 新浪政务 > 正文 + + + + +

焦点访谈:中国底气 新思想夯实大国粮仓

+ +
+ 2023年03月02日 21:50 央视网 +
+ + + +``` + +备注: 要想拾取某一个网页中的颜色,我们可以借助于浏览器的拾色器插件来完成。【拾色器插件的安装,参照资料中提供的文档即可】 + + + + + +###### 2.3.1.2.4 CSS选择器 + +顾名思义:选择器是选取需设置样式的元素(标签),但是我们根据业务场景不同,选择的标签的需求也是多种多样的,所以选择器有很多种,因为我们是做后台开发的,所以对于css选择器,我们只学习最基本的3种。 + +**选择器通用语法如下**: + +```css +选择器名 { + css样式名:css样式值; + css样式名:css样式值; +} +``` + + + +我们需要学习的3种选择器是元素选择器,id选择器,class选择器,语法以及作用如下: + +**1.元素(标签)选择器:** + +- 选择器的名字必须是标签的名字 +- 作用:选择器中的样式会作用于所有同名的标签上 + +~~~ +元素名称 { + css样式名:css样式值; +} +~~~ + +例子如下: + +~~~css + div{ + color: red; + } +~~~ + + + +**2.id选择器:** + +- 选择器的名字前面需要加上# +- 作用:选择器中的样式会作用于指定id的标签上,而且有且只有一个标签(由于id是唯一的) + +~~~ +##id属性值 { + css样式名:css样式值; +} +~~~ + +例子如下: + +~~~css +##did { + color: blue; +} +~~~ + + + +**3.类选择器:** + +- 选择器的名字前面需要加上 . +- 作用:选择器中的样式会作用于所有class的属性值和该名字一样的标签上,可以是多个 + +~~~ +.class属性值 { + css样式名:css样式值; +} +~~~ + +例子如下: + +~~~css +.cls{ + color: green; + } +~~~ + + + + + +###### 2.3.1.2.5 发布时间字体颜色 + +```html + + + + + + + 焦点访谈:中国底气 新思想夯实大国粮仓 + + + + + 新浪政务 > 正文 + +

焦点访谈:中国底气 新思想夯实大国粮仓

+ +
+ 2023年03月02日 21:50 央视网 +
+ + + +``` + + + +上述我们还使用了一个css的属性 font-size , 用来设置字体的大小。 但是需要注意,在设置字体的大小时,单位px不能省略,否则不生效。 + + + + + +##### 2.3.1.3 超链接 + +- 在新浪新闻的标题部分,当我们点击顶部的 "新浪政务",浏览器将自动在当前窗口访问新浪政务首页这个资源(http://gov.sina.com.cn/) + +- 当我们点击新闻发布时间之后的 "央视网",浏览器将会自动打开一个新的标签页,然后在新的标签页中访问央视网中的该新闻资源 (https://news.cctv.com/2023/03/02/ARTIUCKFf9kE9eXgYE46ugx3230302.shtml) + +![a](assets/a.gif) + + + +那接下来,我们就来完善新闻标题部分的这个功能,那此时呢,我们就需要用到HTML中的超链接的标签 。 + + + +###### 2.3.1.3.1 介绍 + +- 标签: <a href="..." target="...">央视网</a> +- 属性: + - href: 指定资源访问的url + - target: 指定在何处打开资源链接 + - _self: 默认值,在当前页面打开 + - _blank: 在空白页面打开 + + + +###### 2.3.1.3.2 实现 + +```html + + + + + + + 焦点访谈:中国底气 新思想夯实大国粮仓 + + + + + 新浪政务 > 正文 + +

焦点访谈:中国底气 新思想夯实大国粮仓

+ +
+ 2023年03月02日 21:50 + + 央视网 + +
+ + + +``` + + + +浏览器打开此页面,我们可以看到最终效果(超链接的字体,以及默认的下划线,通过css样式已经调整好了): + +![image-20230309233408698](assets/image-20230309233408698.png) + + + + + + + +#### 2.3.2 新浪新闻-正文实现 + +##### 2.3.2.1 正文排版 + +###### 2.3.2.1.1 分析 + + +![image-20230309233408698](assets/image-20230310084859695.png) + +整个正文部分的排版,主要分为这么四个部分: + +1). 视频 (当前这种新闻页面,可能也会存在音频) + +2). 文字段落 + +3). 字体加粗 + +4). 图片 + + + +###### 2.3.2.1.2 标签 + +**1). 视频、音频标签** + +- 视频标签: <video> + - 属性: + - src: 规定视频的url + - controls: 显示播放控件 + - width: 播放器的宽度 + - height: 播放器的高度 + +- 音频标签: <audio> + - 属性: + - src: 规定音频的url + - controls: 显示播放控件 + + + +**2). 段落标签** + +- 换行标签: <br> + - 注意: 在HTML页面中,我们在编辑器中通过回车实现的换行, 仅仅在文本编辑器中会看到换行效果, 浏览器是不会解析的, HTML中换行需要通过br标签 + +​ + +- 段落标签: <p> + - 如: <p> 这是一个段落 </p> + + + +**3). 文本格式标签** + +| 效果 | 标签 | 标签(强调) | +| ------ | ---- | ---------- | +| 加粗 | b | strong | +| 倾斜 | i | em | +| 下划线 | u | ins | +| 删除线 | s | del | + +前面的标签 b、i、u、s 就仅仅是实现加粗、倾斜、下划线、删除线的效果,是没有强调语义的。 而后面的strong、em、ins、del在实现加粗、倾斜、下划线、删除线的效果的同时,还带有强调语义。 + + + +###### 2.3.2.1.3 实现 + +```html + + + + + + + 焦点访谈:中国底气 新思想夯实大国粮仓 + + + + + + 新浪政务 > 正文 + +

焦点访谈:中国底气 新思想夯实大国粮仓

+ +
+ 2023年03月02日 21:50 + 央视网 +
+ + + + + + + + +

+ 央视网消息 (焦点访谈):党的十八大以来,以习近平同志为核心的党中央始终把解决粮食安全问题作为治国理政的头等大事,重农抓粮一系列政策举措有力有效,我国粮食产量站稳1.3万亿斤台阶,实现谷物基本自给、口粮绝对安全。我们把饭碗牢牢端在自己手中,为保障经济社会发展提供了坚实支撑,为应对各种风险挑战赢得了主动。连续八年1.3万亿斤,这个沉甸甸的数据是如何取得的呢? +

+ +

+ 人勤春来早,春耕农事忙。立春之后,由南到北,我国春耕春管工作陆续展开,春天的田野处处生机盎然。 +

+ + + +

+ 今年,我国启动了新一轮千亿斤粮食产能提升行动,这是一个新的起点。2015年以来,我国粮食产量连续8年稳定在1.3万亿斤以上,人均粮食占有量始终稳稳高于国际公认的400公斤粮食安全线。从十年前的约12200亿斤到2022年的约13700亿斤,粮食产量提高了1500亿斤。 +

+ + + +

+ 中国式现代化一个重要的中国特色是人口规模巨大的现代化。我们粮食生产的发展,意味着我们要立足国内,解决14亿多人吃饭的问题。仓廪实,天下安。保障粮食安全是一个永恒的课题,任何时候都不能放松。在以习近平同志为核心的党中央坚强领导下,亿万中国人民辛勤耕耘、不懈奋斗,我们就一定能够牢牢守住粮食安全这一“国之大者”,把中国人的饭碗牢牢端在自己手中,夯实中国式现代化基础。 +

+ +

+ 责任编辑:王树淼 SN242 +

+ + +``` + + + +在上述的正文排版实现中,还用到了几个CSS属性: + +- text-indent: 设置段落的首行缩进 +- line-height: 设置行高 +- text-align: 设置对齐方式, 可取值为 left / center / right + + + +> 注意事项: +> +> - 在HTML页面中无论输入了多少个空格, 最多只会显示一个。 可以使用空格占位符( ;)来生成空格,如果需要多个空格,就使用多次占位符。 +> +> - 那在HTML中,除了空格占位符以外,还有一些其他的占位符(了解, 只需要知道空格的占位符写法即可),如下: +> +> - | 显示结果 | 描述 | 占位符 | +> | :------- | :----- | :------ | +> | | 空格 | \  | +> | < | 小于号 | \< | +> | > | 大于号 | \> | +> | & | 和号 | \& | +> | " | 引号 | \" | +> | ' | 撇号 | \' | + + + + + +##### 2.3.2.2 页面布局 + +目前,新闻页面的基本排版,我们都已经完成了,但是,大家会看到,无论是标题部分,还是正文部分,都是铺满了整个浏览器。 而我们再来看看新浪新闻的原始页面,我们会看到新闻网页内容都是居中展示的,左边、右边都是一定的边距的。 + +![image-20230310092442972](assets/image-20230310092442972.png) + +那接下来呢,我们就需要按照这个效果,来完成页面布局。 而要想完成这样一个页面布局,我们就需要介绍一下CSS中的盒子模型 。 + + + +###### 2.3.2.2.1 盒子模型 + +- 盒子:页面中所有的元素(标签),都可以看做是一个 盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更方便的进行页面布局 + +- 盒子模型组成:内容区域(content)、内边距区域(padding)、边框区域(border)、外边距区域(margin) + + +![image-20230310092442972](assets/image-20230310092820616.png) + +CSS盒子模型,其实和日常生活中的包装盒是非常类似的,就比如: + + +![image-20230310092442972](assets/image-20230310093247265.png) + +盒子的大小,其实就包括三个部分: border、padding、content,而margin外边距是不包括在盒子之内的。 + + + +###### 2.3.2.2.2 布局标签 + +- 布局标签:实际开发网页中,会大量频繁的使用 div 和 span 这两个没有语义的布局标签。 + +- 标签:<div> <span> + +- 特点: + + - div标签: + + - 一行只显示一个(独占一行) + + - 宽度默认是父元素的宽度,高度默认由内容撑开 + + - 可以设置宽高(width、height) + + - span标签: + + - 一行可以显示多个 + + - 宽度和高度默认由内容撑开 + + - 不可以设置宽高(width、height) + + + +测试: + +```html + +
+ A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A +
+
+ A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A +
+ + + A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A + + + A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A + + +``` + + + +浏览器打开后的效果: + +1). div会独占一行,默认宽度为父元素 body 的宽度 + +![image-20230310093734941](assets/image-20230310093734941.png) + + + +2). span一行会显示多个,用来组合行内元素,默认宽度为内容撑开的宽度 + +![image-20230310093827748](assets/image-20230310093827748.png) + + + +###### 2.3.2.2.3 盒子模型代码 + +代码如下: + +```html + + + + + + + 盒子模型 + + + + + +
+ A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A +
+ + + +``` + + + +代码编写好了, 可以通过浏览器打开该页面, 通过开发者工具,我们就可以看到盒子的大小, 以及盒子各个组成部分(内容、内边距、边框、外边距): + +![image-20230310094312355](assets/image-20230310094312355.png) + + + +我们也可以,通过浏览器的开发者工具,清晰的看到这个盒子,以及每一个部分的大小: + +![image-20230310094412539](assets/image-20230310094412539.png) + + + +###### 2.3.2.2.3 布局实现 + +在实现新闻页面的布局时,我们需要做两部操作: + +- 第一步:需要将body中的新闻标题部分、正文部分使用一个 div 布局标签将其包裹起来,方便通过css设置内容占用的宽度,比如:65%。 +- 第二步:通过css为该div设置外边距,左右的外边距分别为:17.5%,上下外边距靠边展示即可,为:0%。 + + + +具体的代码实现如下: + +```html + + + + + + + 焦点访谈:中国底气 新思想夯实大国粮仓 + + + + +
+ + 新浪政务 > 正文 + +

焦点访谈:中国底气 新思想夯实大国粮仓

+ +
+ 2023年03月02日 21:50 + 央视网 +
+ + + + + + + + +

+ 央视网消息 (焦点访谈):党的十八大以来,以习近平同志为核心的党中央始终把解决粮食安全问题作为治国理政的头等大事,重农抓粮一系列政策举措有力有效,我国粮食产量站稳1.3万亿斤台阶,实现谷物基本自给、口粮绝对安全。我们把饭碗牢牢端在自己手中,为保障经济社会发展提供了坚实支撑,为应对各种风险挑战赢得了主动。连续八年1.3万亿斤,这个沉甸甸的数据是如何取得的呢? +

+ +

+ 人勤春来早,春耕农事忙。立春之后,由南到北,我国春耕春管工作陆续展开,春天的田野处处生机盎然。 +

+ + + +

+ 今年,我国启动了新一轮千亿斤粮食产能提升行动,这是一个新的起点。2015年以来,我国粮食产量连续8年稳定在1.3万亿斤以上,人均粮食占有量始终稳稳高于国际公认的400公斤粮食安全线。从十年前的约12200亿斤到2022年的约13700亿斤,粮食产量提高了1500亿斤。 +

+ + + +

+ 中国式现代化一个重要的中国特色是人口规模巨大的现代化。我们粮食生产的发展,意味着我们要立足国内,解决14亿多人吃饭的问题。仓廪实,天下安。保障粮食安全是一个永恒的课题,任何时候都不能放松。在以习近平同志为核心的党中央坚强领导下,亿万中国人民辛勤耕耘、不懈奋斗,我们就一定能够牢牢守住粮食安全这一“国之大者”,把中国人的饭碗牢牢端在自己手中,夯实中国式现代化基础。 +

+ +

+ 责任编辑:王树淼 SN242 +

+
+ + +``` + + + +浏览器打开此页面,最终效果如下: + +![image-20230310094732466](assets/image-20230310094732466.png) + + + + + + + + + +### 2.4 表格标签 + +**场景:**在网页中以表格(行、列)形式整齐展示数据,我们在一些管理类的系统中,会看到数据通常都是以表格的形式呈现出来的,比如:班级表、学生表、课程表、成绩表等等。 + +![image-20230309174438491](assets/t1.png) + + + +**标签:** + +- <table> : 用于定义整个表格, 可以包裹多个 <tr>, 常用属性如下: + - border:规定表格边框的宽度 + - width:规定表格的宽度 + - cellspacing: 规定单元之间的空间 + +- <tr> : 表格的行,可以包裹多个 <td> +- <td> : 表格单元格(普通),可以包裹内容 , 如果是表头单元格,可以替换为 <th> + + + +**演示:** + +代码如下: + +~~~html + + + + + + + HTML-表格 + + + + + + + + + + + + + + + + + + + + + + + +
序号品牌Logo品牌名称企业名称
1 华为华为技术有限公司
2 阿里阿里巴巴集团控股有限公司
+ + + +~~~ + +打开浏览器,效果如下图所示: + +![image-20230309175121361](assets/image-20230309175121361.png) + + + +整合表格使用 table 标签包裹 , 其中的每一行数据都是一个 tr , 每一行中的每一个单元格都是一个 td , 而如果是表头单元格, 可以使用 th (具有加粗居中展示的效果)。 + + + +### 2.5 表单标签 + +#### 2.5.1 表单 + +##### 2.5.1.1 介绍 + +那表单呢,在我们日常的上网的过程中,基本上每天都会遇到。比如,我们经常在访问网站时,出现的登录页面、注册页面、个人信息提交页面,其实都是一个一个的表单 。 当我们在这些表单中录入数据之后,一点击 "提交",就会将表单中我们填写的数据采集到,并提交, 那其实这个数据呢,一般会提交到服务端,最终保存在数据库中 (后面的课程中会讲到)。 + + +![image-20230309175121361](assets/1668055779440.png) ![image-20230309175121361](assets/image-20230309175941128.png) + + +那其实,上述的整个窗口是一个表单,而表单是一项一项的,这个我们称为表单项 或 表单元素。 + +- 表单场景: 表单就是在网页中负责数据采集功能的,如:注册、登录的表单。 + +- 表单标签: <form> +- 表单属性: + - action: 规定表单提交时,向何处发送表单数据,表单提交的URL。 + - method: 规定用于发送表单数据的方式,常见为: GET、POST。 + - GET:表单数据是拼接在url后面的, 如: xxxxxxxxxxx?username=Tom&age=12,url中能携带的表单数据大小是有限制的。 + - POST: 表单数据是在请求体(消息体)中携带的,大小没有限制。 + +- 表单项标签: 不同类型的input元素、下拉列表、文本域等。 + - input: 定义表单项,通过type属性控制输入形式 + - select: 定义下拉列表 + - textarea: 定义文本域 + + + + + +##### 2.5.1.2 演示 + +1). GET方式提交的表单 + +```html + + + + + + + HTML-表单 + + + + +
+ 用户名: + 年龄: + + +
+ + + +``` + + + +表单编写完毕之后,通过浏览器打开此表单,然后再表单项中录入值之后,点击提交,我们会看到表单的数据在url后面提交到服务端,格式为:?username=Tom&age=12。 + + +![image-20230309175121361](assets/image-20230309191725329.png) + + +2). POST方式提交表单 + +将上述的表单提交方式由get,改为post + +```html + + + + + + + HTML-表单 + + + + +
+ 用户名: + 年龄: + + +
+ + + +``` + +表单编写完毕之后,通过浏览器打开此表单,然后再表单项中录入值之后,点击提交,我们会看到表单的数据在url后面提交到服务端,格式为:?username=Tom&age=12。 + +![image-20230309192625939](assets/image-20230309192625939.png) + + + + + +##### 2.5.1.3 注意事项 + +表单中的所有表单项,要想能够正常的采集数据,在提交的时候能提交到服务端,表单项必须指定name属性。 否则,无法提交该表单项。 + +```html +用户名: +``` + + + + + +#### 2.5.2 表单项 + +##### 2.5.2.1 介绍 + +在一个表单中,可以存在很多的表单项,而虽然表单项的形式各式各样,但是表单项的标签其实就只有三个,分别是: + +- <input>: 表单项 , 通过type属性控制输入形式。 + + | type取值 | **描述** | + | ------------------------ | ------------------------------------ | + | text | 默认值,定义单行的输入字段 | + | password | 定义密码字段 | + | radio | 定义单选按钮 | + | checkbox | 定义复选框 | + | file | 定义文件上传按钮 | + | date/time/datetime-local | 定义日期/时间/日期时间 | + | number | 定义数字输入框 | + | email | 定义邮件输入框 | + | hidden | 定义隐藏域 | + | submit / reset / button | 定义提交按钮 / 重置按钮 / 可点击按钮 | + +- <select>: 定义下拉列表, <option> 定义列表项 + +- <textarea>: 文本域 + + + + + +##### 2.5.2.2 演示 + +创建一个新的表单项的html文件,具体内容如下: + +```html + + + + + + + HTML-表单项标签 + + + + +
+ 姓名:

+ 密码:

+ 性别: 男 +

+ 爱好: + +

+ 图像:

+ 生日:

+ 时间:

+ 日期时间:

+ 邮箱:

+ 年龄:

+ 学历:

+ 描述:

+ + + + + + +
+
+ + + +``` + + + +通过浏览器打开上述的表单项html文件,最终展示出的表单信息如下: + +![image-20230309221308252](assets/image-20230309221308252.png) + +而对于input type="hidden",是一个隐藏域,在表单中并不会显示出来,但是在提交表单的时候,是会提交到服务端的。 接下来,我们就点击提交按钮,来提交当前表单,看看提交的数据: + +![image-20230309221530214](assets/image-20230309221530214.png) + + + + + + + +## 3. 文档查阅 + +文档地址: https://www.w3school.com.cn/index.html + +### 3.1 HTML文档查阅 + +以video标签为例: + +![html](assets/html.gif) + + + +### 3.2 CSS文档查阅 + +以padding属性为例: + +![css](assets/css.gif) diff --git a/javaEE/day02/assets/1667964998343.png b/javaEE/day02/assets/1667964998343.png new file mode 100644 index 0000000..113be03 Binary files /dev/null and b/javaEE/day02/assets/1667964998343.png differ diff --git a/javaEE/day02/assets/1668020985363.png b/javaEE/day02/assets/1668020985363.png new file mode 100644 index 0000000..e052ca4 Binary files /dev/null and b/javaEE/day02/assets/1668020985363.png differ diff --git a/javaEE/day02/assets/1668021080890.png b/javaEE/day02/assets/1668021080890.png new file mode 100644 index 0000000..4396306 Binary files /dev/null and b/javaEE/day02/assets/1668021080890.png differ diff --git a/javaEE/day02/assets/1668021241174.png b/javaEE/day02/assets/1668021241174.png new file mode 100644 index 0000000..1c9288a Binary files /dev/null and b/javaEE/day02/assets/1668021241174.png differ diff --git a/javaEE/day02/assets/1668101592422.png b/javaEE/day02/assets/1668101592422.png new file mode 100644 index 0000000..93cc2c7 Binary files /dev/null and b/javaEE/day02/assets/1668101592422.png differ diff --git a/javaEE/day02/assets/1668101718354.png b/javaEE/day02/assets/1668101718354.png new file mode 100644 index 0000000..f68e9b6 Binary files /dev/null and b/javaEE/day02/assets/1668101718354.png differ diff --git a/javaEE/day02/assets/1668101840992.png b/javaEE/day02/assets/1668101840992.png new file mode 100644 index 0000000..9833136 Binary files /dev/null and b/javaEE/day02/assets/1668101840992.png differ diff --git a/javaEE/day02/assets/1668101996370.png b/javaEE/day02/assets/1668101996370.png new file mode 100644 index 0000000..c769416 Binary files /dev/null and b/javaEE/day02/assets/1668101996370.png differ diff --git a/javaEE/day02/assets/1668102183766.png b/javaEE/day02/assets/1668102183766.png new file mode 100644 index 0000000..9c69a27 Binary files /dev/null and b/javaEE/day02/assets/1668102183766.png differ diff --git a/javaEE/day02/assets/1668102256305.png b/javaEE/day02/assets/1668102256305.png new file mode 100644 index 0000000..c187173 Binary files /dev/null and b/javaEE/day02/assets/1668102256305.png differ diff --git a/javaEE/day02/assets/1668102426953.png b/javaEE/day02/assets/1668102426953.png new file mode 100644 index 0000000..2bfb6a5 Binary files /dev/null and b/javaEE/day02/assets/1668102426953.png differ diff --git a/javaEE/day02/assets/1668102527993.png b/javaEE/day02/assets/1668102527993.png new file mode 100644 index 0000000..c2b3757 Binary files /dev/null and b/javaEE/day02/assets/1668102527993.png differ diff --git a/javaEE/day02/assets/1668102736759.png b/javaEE/day02/assets/1668102736759.png new file mode 100644 index 0000000..b0b9f65 Binary files /dev/null and b/javaEE/day02/assets/1668102736759.png differ diff --git a/javaEE/day02/assets/1668103531260.png b/javaEE/day02/assets/1668103531260.png new file mode 100644 index 0000000..6b41c1b Binary files /dev/null and b/javaEE/day02/assets/1668103531260.png differ diff --git a/javaEE/day02/assets/1668584359136.png b/javaEE/day02/assets/1668584359136.png new file mode 100644 index 0000000..201cb15 Binary files /dev/null and b/javaEE/day02/assets/1668584359136.png differ diff --git a/javaEE/day02/assets/1668587480704.png b/javaEE/day02/assets/1668587480704.png new file mode 100644 index 0000000..5b3e1e0 Binary files /dev/null and b/javaEE/day02/assets/1668587480704.png differ diff --git a/javaEE/day02/assets/1668587524509.png b/javaEE/day02/assets/1668587524509.png new file mode 100644 index 0000000..1580bf6 Binary files /dev/null and b/javaEE/day02/assets/1668587524509.png differ diff --git a/javaEE/day02/assets/1668587661914.png b/javaEE/day02/assets/1668587661914.png new file mode 100644 index 0000000..9070543 Binary files /dev/null and b/javaEE/day02/assets/1668587661914.png differ diff --git a/javaEE/day02/assets/1668587855863.png b/javaEE/day02/assets/1668587855863.png new file mode 100644 index 0000000..116dcea Binary files /dev/null and b/javaEE/day02/assets/1668587855863.png differ diff --git a/javaEE/day02/assets/1668587924550.png b/javaEE/day02/assets/1668587924550.png new file mode 100644 index 0000000..a7b7755 Binary files /dev/null and b/javaEE/day02/assets/1668587924550.png differ diff --git a/javaEE/day02/assets/1668587953841.png b/javaEE/day02/assets/1668587953841.png new file mode 100644 index 0000000..c31be6c Binary files /dev/null and b/javaEE/day02/assets/1668587953841.png differ diff --git a/javaEE/day02/assets/1668588039871.png b/javaEE/day02/assets/1668588039871.png new file mode 100644 index 0000000..c5fdb6a Binary files /dev/null and b/javaEE/day02/assets/1668588039871.png differ diff --git a/javaEE/day02/assets/1668588141399.png b/javaEE/day02/assets/1668588141399.png new file mode 100644 index 0000000..d7dba80 Binary files /dev/null and b/javaEE/day02/assets/1668588141399.png differ diff --git a/javaEE/day02/assets/1668590029976.png b/javaEE/day02/assets/1668590029976.png new file mode 100644 index 0000000..66423f6 Binary files /dev/null and b/javaEE/day02/assets/1668590029976.png differ diff --git a/javaEE/day02/assets/1668590564305.png b/javaEE/day02/assets/1668590564305.png new file mode 100644 index 0000000..eb95c5a Binary files /dev/null and b/javaEE/day02/assets/1668590564305.png differ diff --git a/javaEE/day02/assets/1668590614787.png b/javaEE/day02/assets/1668590614787.png new file mode 100644 index 0000000..0ec34a4 Binary files /dev/null and b/javaEE/day02/assets/1668590614787.png differ diff --git a/javaEE/day02/assets/1668590655291.png b/javaEE/day02/assets/1668590655291.png new file mode 100644 index 0000000..a2efbba Binary files /dev/null and b/javaEE/day02/assets/1668590655291.png differ diff --git a/javaEE/day02/assets/1668590895662.png b/javaEE/day02/assets/1668590895662.png new file mode 100644 index 0000000..2151c0a Binary files /dev/null and b/javaEE/day02/assets/1668590895662.png differ diff --git a/javaEE/day02/assets/1668591107438.png b/javaEE/day02/assets/1668591107438.png new file mode 100644 index 0000000..45a7ad9 Binary files /dev/null and b/javaEE/day02/assets/1668591107438.png differ diff --git a/javaEE/day02/assets/1668591566013.png b/javaEE/day02/assets/1668591566013.png new file mode 100644 index 0000000..ff28d0f Binary files /dev/null and b/javaEE/day02/assets/1668591566013.png differ diff --git a/javaEE/day02/assets/1668592400491.png b/javaEE/day02/assets/1668592400491.png new file mode 100644 index 0000000..ae8e140 Binary files /dev/null and b/javaEE/day02/assets/1668592400491.png differ diff --git a/javaEE/day02/assets/1668592407223.png b/javaEE/day02/assets/1668592407223.png new file mode 100644 index 0000000..ae8e140 Binary files /dev/null and b/javaEE/day02/assets/1668592407223.png differ diff --git a/javaEE/day02/assets/1668593799333.png b/javaEE/day02/assets/1668593799333.png new file mode 100644 index 0000000..d612e0c Binary files /dev/null and b/javaEE/day02/assets/1668593799333.png differ diff --git a/javaEE/day02/assets/1668594075039.png b/javaEE/day02/assets/1668594075039.png new file mode 100644 index 0000000..2a174cc Binary files /dev/null and b/javaEE/day02/assets/1668594075039.png differ diff --git a/javaEE/day02/assets/1668595022160.png b/javaEE/day02/assets/1668595022160.png new file mode 100644 index 0000000..20bbd93 Binary files /dev/null and b/javaEE/day02/assets/1668595022160.png differ diff --git a/javaEE/day02/assets/1668595450181.png b/javaEE/day02/assets/1668595450181.png new file mode 100644 index 0000000..dcaac59 Binary files /dev/null and b/javaEE/day02/assets/1668595450181.png differ diff --git a/javaEE/day02/assets/1668596039535.png b/javaEE/day02/assets/1668596039535.png new file mode 100644 index 0000000..451d850 Binary files /dev/null and b/javaEE/day02/assets/1668596039535.png differ diff --git a/javaEE/day02/assets/1668596701343.png b/javaEE/day02/assets/1668596701343.png new file mode 100644 index 0000000..08e9c91 Binary files /dev/null and b/javaEE/day02/assets/1668596701343.png differ diff --git a/javaEE/day02/assets/1668596798551.png b/javaEE/day02/assets/1668596798551.png new file mode 100644 index 0000000..07105b9 Binary files /dev/null and b/javaEE/day02/assets/1668596798551.png differ diff --git a/javaEE/day02/assets/1668596930043.png b/javaEE/day02/assets/1668596930043.png new file mode 100644 index 0000000..c2eff21 Binary files /dev/null and b/javaEE/day02/assets/1668596930043.png differ diff --git a/javaEE/day02/assets/1668597000013.png b/javaEE/day02/assets/1668597000013.png new file mode 100644 index 0000000..d9e99ea Binary files /dev/null and b/javaEE/day02/assets/1668597000013.png differ diff --git a/javaEE/day02/assets/1668597150779.png b/javaEE/day02/assets/1668597150779.png new file mode 100644 index 0000000..fa2cd57 Binary files /dev/null and b/javaEE/day02/assets/1668597150779.png differ diff --git a/javaEE/day02/assets/1668597176685.png b/javaEE/day02/assets/1668597176685.png new file mode 100644 index 0000000..753bbb2 Binary files /dev/null and b/javaEE/day02/assets/1668597176685.png differ diff --git a/javaEE/day02/assets/1668597343162.png b/javaEE/day02/assets/1668597343162.png new file mode 100644 index 0000000..0bb2f59 Binary files /dev/null and b/javaEE/day02/assets/1668597343162.png differ diff --git a/javaEE/day02/assets/1668597352197.png b/javaEE/day02/assets/1668597352197.png new file mode 100644 index 0000000..0bb2f59 Binary files /dev/null and b/javaEE/day02/assets/1668597352197.png differ diff --git a/javaEE/day02/assets/1668597489911.png b/javaEE/day02/assets/1668597489911.png new file mode 100644 index 0000000..7d49a4f Binary files /dev/null and b/javaEE/day02/assets/1668597489911.png differ diff --git a/javaEE/day02/assets/1668597624263.png b/javaEE/day02/assets/1668597624263.png new file mode 100644 index 0000000..8ffa94a Binary files /dev/null and b/javaEE/day02/assets/1668597624263.png differ diff --git a/javaEE/day02/assets/1668794696951.png b/javaEE/day02/assets/1668794696951.png new file mode 100644 index 0000000..511072b Binary files /dev/null and b/javaEE/day02/assets/1668794696951.png differ diff --git a/javaEE/day02/assets/1668794735581.png b/javaEE/day02/assets/1668794735581.png new file mode 100644 index 0000000..b3d1d2d Binary files /dev/null and b/javaEE/day02/assets/1668794735581.png differ diff --git a/javaEE/day02/assets/1668794882732.png b/javaEE/day02/assets/1668794882732.png new file mode 100644 index 0000000..4acb0d2 Binary files /dev/null and b/javaEE/day02/assets/1668794882732.png differ diff --git a/javaEE/day02/assets/1668794898891.png b/javaEE/day02/assets/1668794898891.png new file mode 100644 index 0000000..f00446d Binary files /dev/null and b/javaEE/day02/assets/1668794898891.png differ diff --git a/javaEE/day02/assets/1668795432736.png b/javaEE/day02/assets/1668795432736.png new file mode 100644 index 0000000..730b7f7 Binary files /dev/null and b/javaEE/day02/assets/1668795432736.png differ diff --git a/javaEE/day02/assets/1668795435780.png b/javaEE/day02/assets/1668795435780.png new file mode 100644 index 0000000..730b7f7 Binary files /dev/null and b/javaEE/day02/assets/1668795435780.png differ diff --git a/javaEE/day02/assets/1668796195195.png b/javaEE/day02/assets/1668796195195.png new file mode 100644 index 0000000..f3759dc Binary files /dev/null and b/javaEE/day02/assets/1668796195195.png differ diff --git a/javaEE/day02/assets/1668796236628.png b/javaEE/day02/assets/1668796236628.png new file mode 100644 index 0000000..15251a0 Binary files /dev/null and b/javaEE/day02/assets/1668796236628.png differ diff --git a/javaEE/day02/assets/1668796698067.png b/javaEE/day02/assets/1668796698067.png new file mode 100644 index 0000000..3991d9c Binary files /dev/null and b/javaEE/day02/assets/1668796698067.png differ diff --git a/javaEE/day02/assets/16687966980671.png b/javaEE/day02/assets/16687966980671.png new file mode 100644 index 0000000..352c037 Binary files /dev/null and b/javaEE/day02/assets/16687966980671.png differ diff --git a/javaEE/day02/assets/1668798266255.png b/javaEE/day02/assets/1668798266255.png new file mode 100644 index 0000000..a4c6071 Binary files /dev/null and b/javaEE/day02/assets/1668798266255.png differ diff --git a/javaEE/day02/assets/1668799227223.png b/javaEE/day02/assets/1668799227223.png new file mode 100644 index 0000000..83518e6 Binary files /dev/null and b/javaEE/day02/assets/1668799227223.png differ diff --git a/javaEE/day02/assets/1668799393592.png b/javaEE/day02/assets/1668799393592.png new file mode 100644 index 0000000..667540e Binary files /dev/null and b/javaEE/day02/assets/1668799393592.png differ diff --git a/javaEE/day02/assets/1668799564602.png b/javaEE/day02/assets/1668799564602.png new file mode 100644 index 0000000..1fd2875 Binary files /dev/null and b/javaEE/day02/assets/1668799564602.png differ diff --git a/javaEE/day02/assets/1668800047162.png b/javaEE/day02/assets/1668800047162.png new file mode 100644 index 0000000..e2ed6da Binary files /dev/null and b/javaEE/day02/assets/1668800047162.png differ diff --git a/javaEE/day02/assets/1668800387791.png b/javaEE/day02/assets/1668800387791.png new file mode 100644 index 0000000..9288e50 Binary files /dev/null and b/javaEE/day02/assets/1668800387791.png differ diff --git a/javaEE/day02/assets/16688003877911.png b/javaEE/day02/assets/16688003877911.png new file mode 100644 index 0000000..bde9afa Binary files /dev/null and b/javaEE/day02/assets/16688003877911.png differ diff --git a/javaEE/day02/assets/1668800622300.png b/javaEE/day02/assets/1668800622300.png new file mode 100644 index 0000000..be95cda Binary files /dev/null and b/javaEE/day02/assets/1668800622300.png differ diff --git a/javaEE/day02/assets/16688006223001.png b/javaEE/day02/assets/16688006223001.png new file mode 100644 index 0000000..ec7bee8 Binary files /dev/null and b/javaEE/day02/assets/16688006223001.png differ diff --git a/javaEE/day02/assets/1668800646200.png b/javaEE/day02/assets/1668800646200.png new file mode 100644 index 0000000..3ace91d Binary files /dev/null and b/javaEE/day02/assets/1668800646200.png differ diff --git a/javaEE/day02/assets/16688006462002.png b/javaEE/day02/assets/16688006462002.png new file mode 100644 index 0000000..f291fc7 Binary files /dev/null and b/javaEE/day02/assets/16688006462002.png differ diff --git a/javaEE/day02/assets/1668800817460.png b/javaEE/day02/assets/1668800817460.png new file mode 100644 index 0000000..ff66ca4 Binary files /dev/null and b/javaEE/day02/assets/1668800817460.png differ diff --git a/javaEE/day02/assets/1668800839720.png b/javaEE/day02/assets/1668800839720.png new file mode 100644 index 0000000..0b7a077 Binary files /dev/null and b/javaEE/day02/assets/1668800839720.png differ diff --git a/javaEE/day02/assets/16688008397201.png b/javaEE/day02/assets/16688008397201.png new file mode 100644 index 0000000..4c9e037 Binary files /dev/null and b/javaEE/day02/assets/16688008397201.png differ diff --git a/javaEE/day02/assets/1668801218809.png b/javaEE/day02/assets/1668801218809.png new file mode 100644 index 0000000..1f290e8 Binary files /dev/null and b/javaEE/day02/assets/1668801218809.png differ diff --git a/javaEE/day02/assets/1668801262970.png b/javaEE/day02/assets/1668801262970.png new file mode 100644 index 0000000..1f290e8 Binary files /dev/null and b/javaEE/day02/assets/1668801262970.png differ diff --git a/javaEE/day02/assets/1668801302139.png b/javaEE/day02/assets/1668801302139.png new file mode 100644 index 0000000..aa7d8bf Binary files /dev/null and b/javaEE/day02/assets/1668801302139.png differ diff --git a/javaEE/day02/assets/1668801541168.png b/javaEE/day02/assets/1668801541168.png new file mode 100644 index 0000000..7e9f400 Binary files /dev/null and b/javaEE/day02/assets/1668801541168.png differ diff --git a/javaEE/day02/assets/166880154116822.png b/javaEE/day02/assets/166880154116822.png new file mode 100644 index 0000000..56b9acb Binary files /dev/null and b/javaEE/day02/assets/166880154116822.png differ diff --git a/javaEE/day02/assets/1668801991368.png b/javaEE/day02/assets/1668801991368.png new file mode 100644 index 0000000..051c440 Binary files /dev/null and b/javaEE/day02/assets/1668801991368.png differ diff --git a/javaEE/day02/assets/1668802645347.png b/javaEE/day02/assets/1668802645347.png new file mode 100644 index 0000000..ab0b748 Binary files /dev/null and b/javaEE/day02/assets/1668802645347.png differ diff --git a/javaEE/day02/assets/1668802811056.png b/javaEE/day02/assets/1668802811056.png new file mode 100644 index 0000000..11715dd Binary files /dev/null and b/javaEE/day02/assets/1668802811056.png differ diff --git a/javaEE/day02/assets/1668802830796.png b/javaEE/day02/assets/1668802830796.png new file mode 100644 index 0000000..9e6a6ee Binary files /dev/null and b/javaEE/day02/assets/1668802830796.png differ diff --git a/javaEE/day02/assets/1668804375833.png b/javaEE/day02/assets/1668804375833.png new file mode 100644 index 0000000..736b773 Binary files /dev/null and b/javaEE/day02/assets/1668804375833.png differ diff --git a/javaEE/day02/assets/1668804696373.png b/javaEE/day02/assets/1668804696373.png new file mode 100644 index 0000000..13f692b Binary files /dev/null and b/javaEE/day02/assets/1668804696373.png differ diff --git a/javaEE/day02/assets/1668805343802.png b/javaEE/day02/assets/1668805343802.png new file mode 100644 index 0000000..59e600c Binary files /dev/null and b/javaEE/day02/assets/1668805343802.png differ diff --git a/javaEE/day02/assets/1668805346551.png b/javaEE/day02/assets/1668805346551.png new file mode 100644 index 0000000..59e600c Binary files /dev/null and b/javaEE/day02/assets/1668805346551.png differ diff --git a/javaEE/day02/assets/1668805498416.png b/javaEE/day02/assets/1668805498416.png new file mode 100644 index 0000000..0459427 Binary files /dev/null and b/javaEE/day02/assets/1668805498416.png differ diff --git a/javaEE/day02/assets/1668805797381.png b/javaEE/day02/assets/1668805797381.png new file mode 100644 index 0000000..e0fe85e Binary files /dev/null and b/javaEE/day02/assets/1668805797381.png differ diff --git a/javaEE/day02/assets/1668805804652.png b/javaEE/day02/assets/1668805804652.png new file mode 100644 index 0000000..6e69765 Binary files /dev/null and b/javaEE/day02/assets/1668805804652.png differ diff --git a/javaEE/day02/assets/1668805812470.png b/javaEE/day02/assets/1668805812470.png new file mode 100644 index 0000000..31c8d9a Binary files /dev/null and b/javaEE/day02/assets/1668805812470.png differ diff --git a/javaEE/day02/assets/1668806049390.png b/javaEE/day02/assets/1668806049390.png new file mode 100644 index 0000000..5ded699 Binary files /dev/null and b/javaEE/day02/assets/1668806049390.png differ diff --git a/javaEE/day02/assets/1668806362090.png b/javaEE/day02/assets/1668806362090.png new file mode 100644 index 0000000..4d7352f Binary files /dev/null and b/javaEE/day02/assets/1668806362090.png differ diff --git a/javaEE/day02/assets/1668857055058.png b/javaEE/day02/assets/1668857055058.png new file mode 100644 index 0000000..7139d3e Binary files /dev/null and b/javaEE/day02/assets/1668857055058.png differ diff --git a/javaEE/day02/assets/1668858213508.png b/javaEE/day02/assets/1668858213508.png new file mode 100644 index 0000000..f12cbe3 Binary files /dev/null and b/javaEE/day02/assets/1668858213508.png differ diff --git a/javaEE/day02/assets/1668858933490.png b/javaEE/day02/assets/1668858933490.png new file mode 100644 index 0000000..e456715 Binary files /dev/null and b/javaEE/day02/assets/1668858933490.png differ diff --git a/javaEE/day02/assets/1668858952627.png b/javaEE/day02/assets/1668858952627.png new file mode 100644 index 0000000..f462df1 Binary files /dev/null and b/javaEE/day02/assets/1668858952627.png differ diff --git a/javaEE/day02/assets/1668859214102.png b/javaEE/day02/assets/1668859214102.png new file mode 100644 index 0000000..50fe2a7 Binary files /dev/null and b/javaEE/day02/assets/1668859214102.png differ diff --git a/javaEE/day02/assets/1668860425429.png b/javaEE/day02/assets/1668860425429.png new file mode 100644 index 0000000..320b5be Binary files /dev/null and b/javaEE/day02/assets/1668860425429.png differ diff --git a/javaEE/day02/assets/1668860901125.png b/javaEE/day02/assets/1668860901125.png new file mode 100644 index 0000000..735009c Binary files /dev/null and b/javaEE/day02/assets/1668860901125.png differ diff --git a/javaEE/day02/assets/1668861009068.png b/javaEE/day02/assets/1668861009068.png new file mode 100644 index 0000000..f1eebc6 Binary files /dev/null and b/javaEE/day02/assets/1668861009068.png differ diff --git a/javaEE/day02/assets/1668864272855.png b/javaEE/day02/assets/1668864272855.png new file mode 100644 index 0000000..34cc2e4 Binary files /dev/null and b/javaEE/day02/assets/1668864272855.png differ diff --git a/javaEE/day02/assets/1668864281939.png b/javaEE/day02/assets/1668864281939.png new file mode 100644 index 0000000..90b5c47 Binary files /dev/null and b/javaEE/day02/assets/1668864281939.png differ diff --git a/javaEE/day02/assets/1668864506047.png b/javaEE/day02/assets/1668864506047.png new file mode 100644 index 0000000..7a73c21 Binary files /dev/null and b/javaEE/day02/assets/1668864506047.png differ diff --git a/javaEE/day02/assets/1668864511161.png b/javaEE/day02/assets/1668864511161.png new file mode 100644 index 0000000..7a73c21 Binary files /dev/null and b/javaEE/day02/assets/1668864511161.png differ diff --git a/javaEE/day02/assets/1668864554492.png b/javaEE/day02/assets/1668864554492.png new file mode 100644 index 0000000..2c88dd7 Binary files /dev/null and b/javaEE/day02/assets/1668864554492.png differ diff --git a/javaEE/day02/assets/1668864558419.png b/javaEE/day02/assets/1668864558419.png new file mode 100644 index 0000000..2c88dd7 Binary files /dev/null and b/javaEE/day02/assets/1668864558419.png differ diff --git a/javaEE/day02/assets/1668866805981.png b/javaEE/day02/assets/1668866805981.png new file mode 100644 index 0000000..93fc2fb Binary files /dev/null and b/javaEE/day02/assets/1668866805981.png differ diff --git a/javaEE/day02/assets/1668867134683.png b/javaEE/day02/assets/1668867134683.png new file mode 100644 index 0000000..b1c9bf5 Binary files /dev/null and b/javaEE/day02/assets/1668867134683.png differ diff --git a/javaEE/day02/assets/1668867458156.png b/javaEE/day02/assets/1668867458156.png new file mode 100644 index 0000000..b11b002 Binary files /dev/null and b/javaEE/day02/assets/1668867458156.png differ diff --git a/javaEE/day02/assets/1668868100828.png b/javaEE/day02/assets/1668868100828.png new file mode 100644 index 0000000..e665ca0 Binary files /dev/null and b/javaEE/day02/assets/1668868100828.png differ diff --git a/javaEE/day02/assets/image-20210815194911914.png b/javaEE/day02/assets/image-20210815194911914.png new file mode 100644 index 0000000..75814d6 Binary files /dev/null and b/javaEE/day02/assets/image-20210815194911914.png differ diff --git a/javaEE/day02/assets/image-20230309161838423.png b/javaEE/day02/assets/image-20230309161838423.png new file mode 100644 index 0000000..b718e27 Binary files /dev/null and b/javaEE/day02/assets/image-20230309161838423.png differ diff --git a/javaEE/day02/day02-JavaScript-Vue-inmind.md b/javaEE/day02/day02-JavaScript-Vue-inmind.md new file mode 100644 index 0000000..4689dc4 --- /dev/null +++ b/javaEE/day02/day02-JavaScript-Vue-inmind.md @@ -0,0 +1,3362 @@ +# day02-JavaScript-Vue +## 1 JavaScript + +html完成了架子,css做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习JavaScript,这门语言会让我们的页面能够和用户进行交互。 + + + +### 1.1 介绍 + +通过**代码/js效果演示**提供资料进行效果演示,通过浏览器打开,我们点击主题5按钮,页面的主题发生了变化,所以js可以让我们的页面更加的智能,让页面和用户进行交互。 + +![1667964998343](assets/1667964998343.png) + + + +### 1.2 引入方式 + +同样,js代码也是书写在html中的,那么html中如何引入js代码呢?主要通过下面的2种引入方式: + +**第一种方式:**内部脚本,将JS代码定义在HTML页面中 + +- JavaScript代码必须位于<script></script>标签之间 +- 在HTML文档中,可以在任意地方,放置任意数量的<script> +- 一般会把脚本置于<body>元素的底部,可改善显示速度 + +例子: + +~~~html + +~~~ + + + +**第二种方式:**外部脚本将, JS代码定义在外部 JS文件中,然后引入到 HTML页面中 + +- 外部JS文件中,只包含JS代码,不包含<script>标签 +- 引入外部js的<script>标签,必须是双标签 + +例子: + +~~~html + +~~~ + +注意:demo.js中只有js代码,没有<script>标签 + + + +接下来,我们通过VS Code来编写代码,演示html中2种引入js的方式 + +第一步:在VS Code中创建名为 10.JS-引入方式.html 的文件 + +第二步:按照上述第一种内部脚本的方式引入js,编写如下代码: + +~~~html + + + + + + + JS-引入方式 + + + + + + +~~~ + + + +第三步:浏览器打开效果如图所示: + +![1668020985363](assets/1668020985363.png) + + + +第四步:接下来演示外部脚本,注释掉内部脚本,然后在css目录同级创建js目录,然后创建一个名为demo.js的文件: + +![1668021080890](assets/1668021080890.png) + + + +第五步:在demo.js中编写如下js内容: + +~~~ +alert('Hello JS2'); +~~~ + + + +第六步:注释掉之前的内部脚本代码,添加<script>标签来引入外部demo.js文件,具体代码如下: + +~~~html + + + + + + + JS-引入方式 + + + + + + + + + + +~~~ + + + +第七步:浏览器刷新效果如图: + +![1668021241174](assets/1668021241174.png) + + + + + +### 1.3 基础语法 + +#### 1.3.1 书写语法 + +掌握了js的引入方式,那么接下来我们需要学习js的书写了,首先需要掌握的是js的书写语法,语法规则如下: + +- 区分大小写:与 Java 一样,变量名、函数名以及其他一切东西都是区分大小写的 + +- 每行结尾的分号可有可无 + +- 大括号表示代码块 + +- 注释: + + - 单行注释:// 注释内容 + + - 多行注释:/* 注释内容 */ + + + +我们需要借助js中3钟输出语句,来演示书写语法 + +| api | 描述 | +| ---------------- | ---------------- | +| window.alert() | 警告框 | +| document.write() | 在HTML 输出内容 | +| console.log() | 写入浏览器控制台 | + + + +接下来我们选用通过VS Code,接触3种输入语句,来演示js的书写语法 + +第一步:在VS Code中创建名为 11.JS-基础语法-输出语句.html的文件 + +第二步:按照基本语法规则,编写3种输出语句的代码,并且添加注释,具体代码如下; + +~~~html + + + + + + + JS-基本语法 + + + + + + +~~~ + +浏览器打开如图所示效果: + +![1668101592422](assets/1668101592422.png) + + + +我们注释掉上述代码,添加代码 document.write("hello js"); 来输出内容: + +~~~html + + + + + + + JS-基本语法 + + + + + + +~~~ + +刷新浏览器,效果如图所示: + +![1668101718354](assets/1668101718354.png) + +最后我们使用console.log("hello js"); 写入到控制台,并且注释掉之前的代码: + +~~~html + + + + + + + JS-基本语法 + + + + + + +~~~ + +浏览器f12抓包,去控制台页面,如图所示: + +![1668101840992](assets/1668101840992.png) + + + +#### 1.3.2 变量 + +书写语法会了,变量是一门编程语言比不可少的,所以接下来我们需要学习js中变量的声明,在js中,变量的声明和java中还是不同的。首先js中主要通过如下3个关键字来声明变量的: + +| 关键字 | 解释 | +| ------ | ------------------------------------------------------------ | +| var | 早期ECMAScript5中用于变量声明的关键字 | +| let | ECMAScript6中新增的用于变量声明的关键字,相比较var,let只在代码块内生效 | +| const | 声明常量的,常量一旦声明,不能修改 | + +在js中声明变量还需要注意如下几点: + +- JavaScript 是一门弱类型语言,变量可以存放不同类型的值 。 +- 变量名需要遵循如下规则: + - 组成字符可以是任何字母、数字、下划线(_)或美元符号($) + - 数字不能开头 + - 建议使用驼峰命名 + + + +接下来我们需要通过VS Code编写代码来演示js中变量的定义 + +第一步:在VS Code中创建名为 12.JS-基础语法-变量.html的文件: + +第二步:编写代码: + +~~~html + + + + + + + JS-基础语法 + + + + + + +~~~ + +可以看到浏览器弹出张三 + +![1668101996370](assets/1668101996370.png) + + + +在js中,我们var声明的变量可以接受任何数据类型的值。并且var声明的变量的作用于是全局的,注释掉之前的代码,添加如下代码: + +~~~html + +~~~ + +浏览器照样成功弹出: + +![1668102183766](assets/1668102183766.png) + + + +而且var关键字声明的变量可以重复定义,修改代码如下: + +~~~js +{ + var x = 1; + var x = "A"; +} +alert(x); + +~~~ + +浏览器弹出内容是A + +![1668102256305](assets/1668102256305.png) + + + +所以在ECMAScript 6 新增了 **let**关键字来定义变量,它的用法类似于 var,但是所声明的变量,只在 let关键字所在的代码块内有效,且不允许重复声明。注释掉之前的代码,添加代码如下: + +~~~html + +~~~ + +浏览器打开,f12抓包,来到控制台页面,发现报错,变量没有定义,说明let声明的变量在代码块外不生效 + +![1668102426953](assets/1668102426953.png) + +接着我们使用let重复定义变量,代码修改如下:发现idea直接帮我们报错了,说明let声明的变量不能重复定义 + +![1668102527993](assets/1668102527993.png) + + + +在ECMAScript6中,还新增了const关键字用来声明常量,但是一旦声明,常量的值是无法更改的。注释之前的内容,添加如下代码: + +~~~js + const pi = 3.14; + pi = 3.15; + alert(pi); +~~~ + +浏览器f12抓包,来到控制台页面发现直接报错了, + +![1668102736759](assets/1668102736759.png) + + + +关于变量的讲解我们就此结束,完整代码如下: + +~~~html + + + + + + + JS-基础语法 + + + + + + +~~~ + + + +#### 1.3.3 数据类型和运算符 + +虽然js是弱数据类型的语言,但是js中也存在数据类型,js中的数据类型分为 :原始类型 和 引用类型,具体有如下类型 + +| 数据类型 | 描述 | +| --------- | -------------------------------------------------- | +| number | 数字(整数、小数、NaN(Not a Number)) | +| string | 字符串,单双引皆可 | +| boolean | 布尔。true,false | +| null | 对象为空 | +| undefined | 当声明的变量未初始化时,该变量的默认值是 undefined | + + + +使用typeof函数可以返回变量的数据类型,接下来我们需要通过书写代码来演示js中的数据类型 + +第一步:在VS Code中创建名为13. JS-基础语法-数据类型.html的文件 + +第二步:编写如下代码,然后直接挨个观察数据类型: + +~~~html + + + + + + + JS-数据类型 + + + + + + +~~~ + + + +熟悉了js的数据类型了,那么我们需要学习js中的运算法,js中的运算规则绝大多数还是和java中一致的,具体运算符如下: + +| 运算规则 | 运算符 | +| ---------- | ------------------------------------------------------------ | +| 算术运算符 | + , - , * , / , % , ++ , -- | +| 赋值运算符 | = , += , -= , *= , /= , %= | +| 比较运算符 | > , < , >= , <= , != , == , === 注意 == 会进行类型转换,=== 不会进行类型转换 | +| 逻辑运算符 | && , \|\| , ! | +| 三元运算符 | 条件表达式 ? true_value: false_value | + + + +接下来我们通过代码来演示js中的运算法,主要记忆js中和java中不一致的地方 + +第一步:在VS Code中创建名为14. JS-基础语法-运算符.html的文件 + +第二步:编写代码 + +在js中,绝大多数的运算规则和java中是保持一致的,但是js中的\==和===是有区别的。 + +- \==:只比较值是否相等,不区分数据类型,哪怕类型不一致,==也会自动转换类型进行值得比较 +- ===:不光比较值,还要比较类型,如果类型不一致,直接返回false + +~~~html + + + + + + + JS-运算符 + + + + + + +~~~ + +在js中,虽然不区分数据类型,但是有时候涉及到数值计算,还是需要进行类型转换的,js中可以通过parseInt()函数来进行将其他类型转换成数值类型。注释之前的代码,添加代码如下: + +~~~js +// 类型转换 - 其他类型转为数字 +alert(parseInt("12")); //12 +alert(parseInt("12A45")); //12 +alert(parseInt("A45"));//NaN (not a number) +~~~ + +除此之外,在js中,还有非常重要的一点是:0,null,undefined,"",NaN理解成false,反之理解成true。注释掉之前的代码,添加如下代码: + +~~~js + if(0){ //false + alert("0 转换为false"); + } +~~~ + + + +浏览器刷新页面,发现没有任何弹框,因为0理解成false,所以条件不成立。注释掉上述代码,添加如下代码: + +~~~js +if(1){ //true + alert("除0和NaN其他数字都转为 true"); +} +~~~ + +浏览器刷新,因为1理解成true,条件成立,所以浏览器效果如下; + +![1668103531260](assets/1668103531260.png) + + + +其他情况可以一一演示,完整演示代码如下: + +~~~js + // if(0){ //false + // alert("0 转换为false"); + // } + // if(NaN){//false + // alert("NaN 转换为false"); + // } + if(1){ //true + alert("除0和NaN其他数字都转为 true"); + } + + // if(""){ //false + // alert("空字符串为 false, 其他都是true"); + // } + + // if(null){ //false + // alert("null 转化为false"); + // } + // if(undefined){ //false + // alert("undefined 转化为false"); + // } +~~~ + + + +流程控制语句if,switch,for等和java保持一致,此处不再演示 + +**需要注意的是:**在js中,0,null,undefined,"",NaN理解成false,反之理解成true + + + + + + + + + +### 1.4 函数 + +在java中我们为了提高代码的复用性,可以使用方法。同样,在JavaScript中可以使用函数来完成相同的事情。JavaScript中的函数被设计为执行特定任务的代码块,通过关键字function来定义。接下来我们学习一下JavaScript中定义函数的2种语法 + +#### 1.4.1 第一种定义格式 + +第一种定义格式如下: + +~~~js +function 函数名(参数1,参数2..){ + 要执行的代码 +} +~~~ + +因为JavaScript是弱数据类型的语言,所以有如下几点需要注意: + +- 形式参数不需要声明类型,并且JavaScript中不管什么类型都是let或者var去声明,加上也没有意义。 +- 返回值也不需要声明类型,直接return即可 + +如下示例: + +~~~js +function add(a, b){ + return a + b; +} +~~~ + +接下来我们需要在VS Code中编写代码来演示 + +第一步:新建名为js的文件夹,创建名为01. JS-函数的html文件,然后在<script>中定义上述示例的函数: + +~~~html + +~~~ + +但是上述只是定义函数,**函数需要被调用才能执行!**所以接下来我们需要调用函数 + +第二步:因为定义的add函数有返回值,所以我们可以接受返回值,并且输出到浏览器上,添加如下代码: + +~~~js +let result = add(10,20); +alert(result); +~~~ + +查看浏览器运行结果:浏览器弹框内容如下图所示: + +![1668584359136](assets/1668584359136.png) + + + +#### 1.4.2 第二种定义格式 + +第二种可以通过var去定义函数的名字,具体格式如下: + +~~~js +var functionName = function (参数1,参数2..){ + //要执行的代码 +} +~~~ + +接下来我们按照上述的格式,修改代码如下:只需要将第一种定义方式注释掉,替换成第二种定义方式即可,函数的调用不变 + +~~~html + +~~~ + + + +浏览器弹框效果和上述一致 + +![1668584359136](assets/1668584359136.png) + +我们在调用add函数时,再添加2个参数,修改代码如下: + +~~~js +var result = add(10,20,30,40); +~~~ + +浏览器打开,发现没有错误,并且依然弹出30,这是为什么呢? + +因为在JavaScript中,函数的调用只需要名称正确即可,参数列表不管的。如上述案例,10传递给了变量a,20传递给了变量b,而30和40没有变量接受,但是不影响函数的正常调用。 + + + +### 1.5 JavaScript对象 + +JavaScript中的对象有很多,主要可以分为如下3大类,我们可以打开[W3school在线学习文档](https://www.w3school.com.cn/),来到首页,在左侧栏找到浏览器脚本下的JavaScript,如下图所示: + +![1668587524509](assets/1668587524509.png) + + + +然后进入到如下界面,点击右侧的参考书 + +![1668587661914](assets/1668587661914.png) + + + +然后进入到如下页面,此页面列举出了JavaScript中的所有对象 + +![1668587855863](assets/1668587855863.png) + + + +可以大体分页3大类: + +第一类:基本对象,我们主要学习Array和JSON和String + +![1668587953841](assets/1668587953841.png) + +第二类:BOM对象,主要是和浏览器相关的几个对象 + +![1668588039871](assets/1668588039871.png) + +第三类:DOM对象,JavaScript中将html的每一个标签都封装成一个对象 + +![1668588141399](assets/1668588141399.png) + +我们先来学习基本对象种的Array对象 + +#### 1.5.1 基本对象 + +##### 1.5.1.1 Array对象 + +###### 语法格式 + +Array对象时用来定义数组的。常用语法格式有如下2种: + +方式1: + +~~~js +var 变量名 = new Array(元素列表); +~~~ + +例如: + +~~~js +var arr = new Array(1,2,3,4); //1,2,3,4 是存储在数组中的数据(元素) +~~~ + + + +方式2: + +~~~js +var 变量名 = [ 元素列表 ]; +~~~ + +例如: + +~~~js +var arr = [1,2,3,4]; //1,2,3,4 是存储在数组中的数据(元素) +~~~ + +数组定义好了,那么我们该如何获取数组中的值呢?和java中一样,需要通过索引来获取数组中的值。语法如下: + +~~~js +arr[索引] = 值; +~~~ + +接下来,我们在VS Code中创建名为02. JS-对象-Array.html的文件,按照上述的语法定义数组,并且通过索引来获取数组中的值。 + +~~~html + +~~~ + +浏览器控制台观察的效果如下:输出1和2 + +![1668590655291](assets/1668590655291.png) + + + +###### 特点 + +与java中不一样的是,JavaScript中数组相当于java中的集合,数组的长度是可以变化的。而且JavaScript是弱数据类型的语言,所以数组中可以存储任意数据类型的值。接下来我们通过代码来演示上述特点。 + +注释掉之前的代码,添加如下代码: + +~~~js +//特点: 长度可变 类型可变 +var arr = [1,2,3,4]; +arr[10] = 50; + +console.log(arr[10]); +console.log(arr[9]); +console.log(arr[8]); +~~~ + +上述代码定义的arr变量中,数组的长度是4,但是我们直接再索引10的位置直接添加了数据10,并且输出索引为10的位置的元素,浏览器控制台数据结果如下: + +![1668590614787](assets/1668590614787.png) + +因为索引8和9的位置没有值,所以输出内容undefined,当然,我们也可以给数组添加其他类型的值,添加代码如下:注释掉之前控制台输出的代码 + +~~~js +//特点: 长度可变 类型可变 +var arr = [1,2,3,4]; +arr[10] = 50; + +// console.log(arr[10]); +// console.log(arr[9]); +// console.log(arr[8]); + +arr[9] = "A"; +arr[8] = true; + +console.log(arr); +~~~ + +浏览器控制台输出结果如下: + +![1668590895662](assets/1668590895662.png) + + + +###### 属性和方法 + +Array作为一个对象,那么对象是有属性和方法的,所以接下来我们介绍一下Array对象的属性和方法 + +官方文档中提供了Array的很多属性和方法,但是我们只学习常用的属性和方法,如下图所示: + +属性: + +| 属性 | 描述 | +| :----- | :--------------------------- | +| length | 设置或返回数组中元素的数量。 | + +方法: + +| 方法方法 | 描述 | +| :-------- | :----------------------------------------------- | +| forEach() | 遍历数组中的每个有值得元素,并调用一次传入的函数 | +| push() | 将新元素添加到数组的末尾,并返回新的长度 | +| splice() | 从数组中删除元素 | + +- length属性: + + length属性可以用来获取数组的长度,所以我们可以借助这个属性,来遍历数组中的元素,添加如下代码: + + ~~~js + var arr = [1,2,3,4]; + arr[10] = 50; + for (let i = 0; i < arr.length; i++) { + console.log(arr[i]); + } + ~~~ + + 浏览器控制台输出结果如图所示: + + ![1668591566013](assets/1668591566013.png) + + + + + +- forEach()函数 + + 首先我们学习forEach()方法,顾名思义,这是用来遍历的,那么遍历做什么事呢?所以这个方法的参数,需要传递一个函数,而且这个函数接受一个参数,就是遍历时数组的值。修改之前的遍历代码如下: + + ~~~js + //e是形参,接受的是数组遍历时的值 + arr.forEach(function(e){ + console.log(e); + }) + ~~~ + + 当然了,在ES6中,引入箭头函数的写法,语法类似java中lambda表达式,修改上述代码如下: + + ~~~js + arr.forEach((e) => { + console.log(e); + }) + ~~~ + + + + 浏览器输出结果如下:注意的是,没有元素的内容是不会输出的,因为forEach只会遍历有值的元素 + + ![1668592407223](assets/1668592407223.png) + + + +- push()函数 + + push()函数是用于向数组的末尾添加元素的,其中函数的参数就是需要添加的元素,编写如下代码:向数组的末尾添加3个元素 + + ~~~js + //push: 添加元素到数组末尾 + arr.push(7,8,9); + console.log(arr); + ~~~ + + 浏览器输出结果如下: + + ![1668593799333](assets/1668593799333.png) + + + + + +- splice()函数 + + splice()函数用来数组中的元素,函数中填入2个参数。 + + 参数1:表示从哪个索引位置删除 + + 参数2:表示删除元素的个数 + + 如下代码表示:从索引2的位置开始删,删除2个元素 + + ~~~js + //splice: 删除元素 + arr.splice(2,2); + console.log(arr); + ~~~ + + 浏览器执行效果如下:元素3和4被删除了,元素3是索引2 + + ![1668594075039](assets/1668594075039.png) + + + +Array数组的完整代码如下: + +~~~html + + + + + + + JS-对象-Array + + + + + + +~~~ + + + + + +##### 1.5.1.2 String对象 + +###### 语法格式 + +String对象的创建方式有2种: + +方式1: + +~~~js +var 变量名 = new String("…") ; //方式一 +~~~ + +例如: + +~~~js +var str = new String("Hello String"); +~~~ + + + +方式2: + +~~~js +var 变量名 = "…" ; //方式二 +~~~ + +例如: + +~~~js +var str = 'Hello String'; +~~~ + + + +按照上述的格式,在VS Code中创建为名03. JS-对象-String.html的文件,编写代码如下: + +~~~html + +~~~ + +浏览器控制台输出结果如下: + +![1668595022160](assets/1668595022160.png) + + + + + +###### 属性和方法 + +String对象也提供了一些常用的属性和方法,如下表格所示: + +属性: + +| 属性 | 描述 | +| ------ | -------------- | +| length | 字符串的长度。 | + +方法: + +| 方法 | 描述 | +| ----------- | ---------------------------------------- | +| charAt() | 返回在指定位置的字符。 | +| indexOf() | 检索字符串。 | +| trim() | 去除字符串两边的空格 | +| substring() | 提取字符串中两个指定的索引号之间的字符。 | + +- length属性: + + length属性可以用于返回字符串的长度,添加如下代码: + + ~~~js + //length + console.log(str.length); + ~~~ + +- charAt()函数: + + charAt()函数用于返回在指定索引位置的字符,函数的参数就是索引。添加如下代码: + + ~~~js + console.log(str.charAt(4)); + ~~~ + +- indexOf()函数 + + indexOf()函数用于检索指定内容在字符串中的索引位置的,返回值是索引,参数是指定的内容。添加如下代码: + + ~~~js + console.log(str.indexOf("lo")); + ~~~ + +- trim()函数 + + trim()函数用于去除字符串两边的空格的。添加如下代码: + + ~~~js + var s = str.trim(); + console.log(s.length); + ~~~ + +- substring()函数 + + substring()函数用于截取字符串的,函数有2个参数。 + + 参数1:表示从那个索引位置开始截取。包含 + + 参数2:表示到那个索引位置结束。不包含 + + ~~~js + console.log(s.substring(0,5)); + ~~~ + + + +整体代码如下: + +~~~html + + + + + + + JS-对象-String + + + + + + +~~~ + + + +浏览器执行效果如图所示: + +![1668595450181](assets/1668595450181.png) + + + +##### 1.5.1.3 JSON对象 + +###### 自定义对象 + +在 JavaScript 中自定义对象特别简单,其语法格式如下: + +~~~js +var 对象名 = { + 属性名1: 属性值1, + 属性名2: 属性值2, + 属性名3: 属性值3, + 函数名称: function(形参列表){} +}; + +~~~ + +我们可以通过如下语法调用属性: + +~~~js +对象名.属性名 +~~~ + +通过如下语法调用函数: + +~~~js +对象名.函数名() +~~~ + + + +接下来,我们再VS Code中创建名为04. JS-对象-JSON.html的文件演示自定义对象 + +~~~html + + +~~~ + + + + + +#### 1.5.2 BOM对象 + +接下来我们学习BOM对象,BOM的全称是Browser Object Model,翻译过来是浏览器对象模型。也就是JavaScript将浏览器的各个组成部分封装成了对象。我们要操作浏览器的部分功能,可以通过操作BOM对象的相关属性或者函数来完成。例如:我们想要将浏览器的地址改为`http://www.baidu.com`,我们就可以通过BOM中提供的location对象的href属性来完成,代码如下:`location.href='http://www.baidu.com'` + +BOM中提供了如下5个对象: + +| 对象名称 | 描述 | +| :-------- | :------------- | +| Window | 浏览器窗口对象 | +| Navigator | 浏览器对象 | +| Screen | 屏幕对象 | +| History | 历史记录对象 | +| Location | d地址栏对象 | + +上述5个对象与浏览器各组成对应的关系如下图所示: + +![](assets/image-20210815194911914.png) + +对于上述5个对象,我们重点学习的是Window对象、Location对象这2个。 + + + +##### 1.5.2.1 Window对象 + +window对象指的是浏览器窗口对象,是JavaScript的全部对象,所以对于window对象,我们可以直接使用,并且对于window对象的方法和属性,我们可以省略window.例如:我们之前学习的alert()函数其实是属于window对象的,其完整的代码如下: + +~~~ +window.alert('hello'); +~~~ + +其可以省略window. 所以可以简写成 + +~~~ +alert('hello') +~~~ + +所以对于window对象的属性和方法,我们都是采用简写的方式。window提供了很多属性和方法,下表列出了常用属性和方法 + +window对象提供了获取其他BOM对象的属性: + +| 属性 | 描述 | +| --------- | --------------------- | +| history | 用于获取history对象 | +| location | 用于获取location对象 | +| Navigator | 用于获取Navigator对象 | +| Screen | 用于获取Screen对象 | + +也就是说我们要使用location对象,只需要通过代码`window.location`或者简写`location`即可使用 + +window也提供了一些常用的函数,如下表格所示: + +| 函数 | 描述 | +| ------------- | -------------------------------------------------- | +| alert() | 显示带有一段消息和一个确认按钮的警告框。 | +| comfirm() | 显示带有一段消息以及确认按钮和取消按钮的对话框。 | +| setInterval() | 按照指定的周期(以毫秒计)来调用函数或计算表达式。 | +| setTimeout() | 在指定的毫秒数后调用函数或计算表达式。 | + +接下来,我们通过VS Code中创建名为05. JS-对象-BOM.html文件来编写代码来演示上述函数: + +- alert()函数:弹出警告框,函数的内容就是警告框的内容 + + ~~~html + + ~~~ + + 浏览器打开,依次弹框,此处只截图一张 + + ![1668794735581](assets/1668794735581.png) + + + +- confirm()函数:弹出确认框,并且提供用户2个按钮,分别是确认和取消。 + + 添加如下代码: + + ~~~js + confirm("您确认删除该记录吗?"); + ~~~ + + 浏览器打开效果如图所示: + + ![1668794898891](assets/1668794898891.png) + + 但是我们怎么知道用户点击了确认还是取消呢?所以这个函数有一个返回值,当用户点击确认时,返回true,点击取消时,返回false。我们根据返回值来决定是否执行后续操作。修改代码如下:再次运行,可以查看返回值true或者false + + ~~~js + var flag = confirm("您确认删除该记录吗?"); + alert(flag); + ~~~ + +- setInterval(fn,毫秒值):定时器,用于周期性的执行某个功能,并且是**循环执行**。该函数需要传递2个参数: + + fn:函数,需要周期性执行的功能代码 + + 毫秒值:间隔时间 + + 注释掉之前的代码,添加代码如下: + + ~~~js + //定时器 - setInterval -- 周期性的执行某一个函数 + var i = 0; + setInterval(function(){ + i++; + console.log("定时器执行了"+i+"次"); + },2000); + ~~~ + + 刷新页面,浏览器每个一段时间都会在控制台输出,结果如下: + + ![1668795435780](assets/1668795435780.png) + +- setTimeout(fn,毫秒值) :定时器,只会在一段时间后**执行一次功能**。参数和上述setInterval一致 + + 注释掉之前的代码,添加代码如下: + + ~~~js + //定时器 - setTimeout -- 延迟指定时间执行一次 + setTimeout(function(){ + alert("JS"); + },3000); + ~~~ + + 浏览器打开,3s后弹框,关闭弹框,发现再也不会弹框了。 + + + +##### 1.5.2.2 Location对象 + +location是指代浏览器的地址栏对象,对于这个对象,我们常用的是href属性,用于获取或者设置浏览器的地址信息,添加如下代码: + +~~~js +//获取浏览器地址栏信息 +alert(location.href); +//设置浏览器地址栏信息 +location.href = "https://www.inmind.cn"; +~~~ + +浏览器效果如下:首先弹框展示浏览器地址栏信息, + +![1668796236628](assets/1668796236628.png) + +然后点击确定后,因为我们设置了地址栏信息,所以浏览器跳转对应首页 + + + +完整代码如下: + +~~~html + + + + + + + JS-对象-BOM + + + + + + +~~~ + + + + + +#### 1.5.3 DOM对象 + +##### 1.5.3.1 DOM介绍 + +DOM:Document Object Model 文档对象模型。也就是 JavaScript 将 HTML 文档的各个组成部分封装为对象。 + +DOM 其实我们并不陌生,之前在学习 XML 就接触过,只不过 XML 文档中的标签需要我们写代码解析,而 HTML 文档是浏览器解析。封装的对象分为 + +- Document:整个文档对象 +- Element:元素对象 +- Attribute:属性对象 +- Text:文本对象 +- Comment:注释对象 + +如下图,左边是 HTML 文档内容,右边是 DOM 树 + +![1668796698067](assets/16687966980671.png) + +那么我们学习DOM技术有什么用呢?主要作用如下: + +- 改变 HTML 元素的内容 +- 改变 HTML 元素的样式(CSS) +- 对 HTML DOM 事件作出反应 +- 添加和删除 HTML 元素 + +总而达到动态改变页面效果目的,具体我们可以查看代码中提供的06. JS-对象-DOM-演示.html来体会DOM的效果。 + + + +##### 1.5.3.2 获取DOM对象 + +我们知道DOM的作用是通过修改HTML元素的内容和样式等来实现页面的各种动态效果,但是我们要操作DOM对象的前提是先获取元素对象,然后才能操作。所以学习DOM,主要的核心就是学习如下2点: + +- 如何获取DOM中的元素对象(Element对象 ,也就是标签) +- 如何操作Element对象的属性,也就是标签的属性。 + +接下来我们先来学习如何获取DOM中的元素对象。 + +HTML中的Element对象可以通过Document对象获取,而Document对象是通过window对象获取的。document对象提供的用于获取Element元素对象的api如下表所示: + +| 函数 | 描述 | +| --------------------------------- | ---------------------------------------- | +| document.getElementById() | 根据id属性值获取,返回单个Element对象 | +| document.getElementsByTagName() | 根据标签名称获取,返回Element对象数组 | +| document.getElementsByName() | 根据name属性值获取,返回Element对象数组 | +| document.getElementsByClassName() | 根据class属性值获取,返回Element对象数组 | + +接下来我们通过VS Code中创建名为07. JS-对象-DOM-获取元素.html的文件来演示上述api,首先在准备如下页面代码: + +~~~html + + + + + + + JS-对象-DOM + + + +

+ +
英迈云教育

+
黑马程序员

+ + 电影 + 旅游 + 游戏 + + + +~~~ + +- document.getElementById(): 根据标签的id属性获取标签对象,id是唯一的,所以获取到是单个标签对象。 + + 添加如下代码: + + ~~~html + + ~~~ + + 浏览器打开,效果如图所示:从弹出的结果能够看出,这是一个图片标签对象 + + ![1668798266255](assets/1668798266255.png) + +- document.getElementsByTagName() : 根据标签的名字获取标签对象,同名的标签有很多,所以返回值是数组。 + + 添加如下代码: + + ~~~js + //1.2 获取元素-根据标签获取 - div + var divs = document.getElementsByTagName('div'); + for (let i = 0; i < divs.length; i++) { + alert(divs[i]); + } + ~~~ + + 浏览器输出2次如下所示的弹框 + + ![1668799227223](assets/1668799227223.png) + +- document.getElementsByName() :根据标签的name的属性值获取标签对象,name属性值可以重复,所以返回值是一个数组。 + + 添加如下代码: + + ~~~js + //1.3 获取元素-根据name属性获取 + var ins = document.getElementsByName('hobby'); + for (let i = 0; i < ins.length; i++) { + alert(ins[i]); + } + ~~~ + + 浏览器会有3次如下图所示的弹框: + + ![1668799393592](assets/1668799393592.png) + +- document.getElementsByClassName() : 根据标签的class属性值获取标签对象,class属性值也可以重复,返回值是数组。 + + 添加如下图所示的代码: + + ~~~js + //1.4 获取元素-根据class属性获取 + var divs = document.getElementsByClassName('cls'); + for (let i = 0; i < divs.length; i++) { + alert(divs[i]); + } + ~~~ + + 浏览器会弹框2次,都是div标签对象 + + ![1668799564602](assets/1668799564602.png) + +- 操作属性 + + 那么获取到标签了,我们如何操作标签的属性呢?通过查询文档资料,如下图所示: + + ![1668800047162](assets/1668800047162.png) + + 得出我们可以通过div标签对象的innerHTML属性来修改标签的内容。此时我们想把页面中的**英迈云教育替换成英迈云教育666**,所以要获取2个div中的第一个,所以可以通过下标0获取数组中的第一个div,注释之前的代码,编写如下代码: + + ~~~js + var divs = document.getElementsByClassName('cls'); + var div1 = divs[0]; + + div1.innerHTML = "英迈云教育666"; + ~~~ + + 浏览器刷新页面,展示效果如下图所示: + + ![1668800387791](assets/16688003877911.png) + + 发现页面内容变成了英迈云教育666 + + + +完整代码如下: + +~~~html + + + + + + + JS-对象-DOM + + + +

+ +
英迈云教育

+
黑马程序员

+ + 电影 + 旅游 + 游戏 + + + + +~~~ + + + +#### 1.5.4 案例 + +##### 1.5.4.1 需求说明 + +鲁迅说的好,光说不练假把式,光练不说傻把式。所以接下来我们需要通过案例来加强对于上述DOM知识的掌握。需求如下3个: + +- 点亮灯泡 +- 将所有的div标签的标签体内容后面加上:very good +- 使所有的复选框呈现被选中的状态 + +效果如下所示: + +![1668800646200](assets/16688006462002.png) + +##### 1.5.4.2 资料准备 + +在JS目录下,也就是用于存放html文件的同级创建img文件下,然后将`资料/图片素材`中提供的2张图片拷贝到img文件夹中,最终整体结果如下图所示: + +![1668801302139](assets/1668801302139.png) + + + +在VS Code中创建名为08. JS-对象-DOM-案例.html的文件,然后准备如下代码: + +~~~html + + + + + + + JS-对象-DOM-案例 + + + +

+ +
英迈云教育

+
黑马程序员

+ + 电影 + 旅游 + 游戏 + + + + +~~~ + +浏览器打开此时效果如图所示: + +![1668800839720](assets/16688008397201.png) + + + +##### 1.5.4.3 需求1 + +- 需求 + + 点亮灯泡 + +- 分析 + + 此时我们需要把灯泡点亮,其实就是换一张图片。那么我们需要切换图片,就需要操作图片的src属性。要操作图片的src属性,就需要先来获取img标签对象。 + +- 步骤 + + - 首先获取img标签对象 + - 然后修改img标签对象的src属性值,进行图片的切换 + +- 代码实现 + + ~~~js + //1. 点亮灯泡 : src 属性值 + //首先获取img标签对象 + var img = document.getElementById('h1'); + //然后修改img标签对象的src属性值,进行图片的切换 + img.src = "img/on.gif"; + ~~~ + +浏览器打开,效果如图所示: + +![1668801541168](assets/166880154116822.png) + + + +##### 1.5.4.4 需求2 + +- 需求 + + 将所有的div标签的标签体内容后面加上:very good + + 并且very good是红色字体 + +- 分析 + + 我们需要在原有内容后面追加红色的very good.所以我们首先需要获取原有内容,然后再进行内容的追加。但是如何保证very good是红色的呢?所以我们可以通过之前html中学过的<font>标签和属性来完整。如何进行内容的替换呢?之前我们学习过innerHTML属性。需要替换2个div的内容,所以我们需要获取2个div,并且遍历进行替换。 + +- 步骤 + + - 通过标签的名字div获取所有的div标签 + - 遍历所有的div标签 + - 获取div标签的原有内容,然后追加<font color='red'>very good</font>,并且替原内容 + +- 代码实现 + + ~~~js + //2. 将所有div标签的内容后面加上: very good (红色字体) -- + var divs = document.getElementsByTagName('div'); + for (let i = 0; i < divs.length; i++) { + const div = divs[i]; + div.innerHTML += "very good"; + } + ~~~ + +浏览器打开效果如图所示: + +![1668801991368](assets/1668801991368.png) + + + +##### 1.5.4.5 需求3 + +- 需求 + + 使所有的复选框呈现被选中的状态 + +- 分析 + + 要让复选框处于选中状态,那么什么属性或者方法可以使复选框选中?可以查询资料得出checkbox标签对象的checked属性设置为true,可以改变checkbox为选中状态。那么需要设置所有的checkbox,那么我们需要获取所有的checkbox并且遍历 + +- 步骤 + + - 可以通过name属性值获取所有的checkbox标签 + - 遍历所有的checkbox标签, + - 设置每个checkbox标签的 + +- 代码实现 + + ~~~js + // //3. 使所有的复选框呈现选中状态 + var ins = document.getElementsByName('hobby'); + for (let i = 0; i < ins.length; i++) { + const check = ins[i]; + check.checked = true;//选中 + } + ~~~ + +浏览器刷新,效果如图所示: + +![1668802645347](assets/1668802645347.png) + + + +##### 1.5.4.6 完整代码 + +~~~html + + + + + + + JS-对象-DOM-案例 + + + +

+ +
英迈云教育

+
黑马程序员

+ + 电影 + 旅游 + 游戏 + + + + +~~~ + + + +### 1.6 JavaScript事件 + +#### 1.6.1 事件介绍 + +如下图所示的百度注册页面,当我们用户输入完内容,百度可以自动的提示我们用户名已经存在还是可以使用。那么百度是怎么知道我们用户名输入完了呢?这就需要用到JavaScript中的事件了。 + +![1668802830796](assets/1668802830796.png) + +什么是事件呢?HTML事件是发生在HTML元素上的 “事情”,例如: + +- 按钮被点击 +- 鼠标移到元素上 +- 输入框失去焦点 +- ........ + +而我们可以给这些事件绑定函数,当事件触发时,可以自动的完成对应的功能。这就是事件监听。例如:对于我们所说的百度注册页面,我们给用户名输入框的失去焦点事件绑定函数,当我们用户输入完内容,在标签外点击了鼠标,对于用户名输入框来说,失去焦点,然后执行绑定的函数,函数进行用户名内容的校验等操作。JavaScript事件是js非常重要的一部分,接下来我们进行事件的学习。那么我们对于JavaScript事件需要学习哪些内容呢?我们得知道有哪些常用事件,然后我们得学会如何给事件绑定函数。所以主要围绕2点来学习: + +- 事件绑定 +- 常用事件 + + + +#### 1.6.2 事件绑定 + +JavaScript对于事件的绑定提供了2种方式: + +- 方式1:通过html标签中的事件属性进行绑定 + + 例如一个按钮,我们对于按钮可以绑定单机事件,可以借助标签的onclick属性,属性值指向一个函数。 + + 在VS Code中创建名为09. JS-事件-事件绑定.html,添加如下代码: + + ~~~html + + ~~~ + + 很明显没有on函数,所以我们需要创建该函数,代码如下: + + ~~~html + + ~~~ + + 浏览器打开,然后点击按钮,弹框如下: + + ![1668804375833](assets/1668804375833.png) + + + +- 方式2:通过DOM中Element元素的事件属性进行绑定 + + 依据我们学习过得DOM的知识点,我们知道html中的标签被加载成element对象,所以我们也可以通过element对象的属性来操作标签的属性。此时我们再次添加一个按钮,代码如下: + + ~~~html + + ~~~ + + 我们可以先通过id属性获取按钮对象,然后操作对象的onclick属性来绑定事件,代码如下: + + ~~~js + document.getElementById('btn2').onclick = function(){ + alert("按钮2被点击了..."); + } + ~~~ + + 浏览器刷新页面,点击第二个按钮,弹框如下: + + ![1668804696373](assets/1668804696373.png) + + + + **需要注意的是:事件绑定的函数,只有在事件被触发时,函数才会被调用。** + + + + 整体代码如下: + + ~~~html + + + + + + + JS-事件-事件绑定 + + + + + + + + + + ~~~ + + + + + +#### 1.6.3 常见事件 + +上面案例中使用到了 `onclick` 事件属性,那都有哪些事件属性供我们使用呢?下面就给大家列举一些比较常用的事件属性 + +| 事件属性名 | 说明 | +| ----------- | ------------------------ | +| onclick | 鼠标单击事件 | +| onblur | 元素失去焦点 | +| onfocus | 元素获得焦点 | +| onload | 某个页面或图像被完成加载 | +| onsubmit | 当表单提交时触发该事件 | +| onmouseover | 鼠标被移到某元素之上 | +| onmouseout | 鼠标从某元素移开 | + +在代码中提供了10. JS-事件-常见事件.html的文件,我们可以通过浏览器打开来观察几个常用事件的具体效果: + +- onfocus:获取焦点事件,鼠标点击输入框,输入框中光标一闪一闪的,就是输入框获取焦点了 + + ![1668805346551](assets/1668805346551.png) + +- onblur:失去焦点事件,前提是输入框获取焦点的状态下,在输入框之外的地方点击,光标从输入框中消失了,这就是失去焦点。 + + ![1668805498416](assets/1668805498416.png) + +其他事件的效果,同学们可以通过提供好的代码去演示,亲身体会事件在什么时候触发。 + + + +#### 1.6.4 案例 + +##### 1.6.4.1 需求说明 + +接下来我们通过案例来加强所学js知识点的掌握。 + +需求如下3个: + +1. 点击 “点亮”按钮 点亮灯泡,点击“熄灭”按钮 熄灭灯泡 +2. 输入框鼠标聚焦后,展示小写;鼠标离焦后,展示大写。 +3. 点击 “全选”按钮使所有的复选框呈现被选中的状态,点击 “反选”按钮使所有的复选框呈现取消勾选的状态。 + +效果如图所示: + +![1668806049390](assets/1668806049390.png) + + + +##### 1.6.4.2 资料准备 + +在VS Code中创建名为11. JS-事件-案例.html的文件,提前准备如下代码: + +~~~html + + + + + + + JS-事件-案例 + + + +
+ + + + +

+ + +

+ + 电影 + 旅游 + 游戏 +
+ + + + + + + +~~~ + +浏览器打开如图所示: + +![1668806362090](assets/1668806362090.png) + + + +##### 1.6.4.3 需求1 + +- 需求: + + 点击 “点亮”按钮 点亮灯泡,点击“熄灭”按钮 熄灭灯泡 + +- 分析: + + 点击按钮的时候触发,所以我们需要绑定单击事件。不管是点亮还是熄灭,都是图片的变化,所以我们需要修改图片。但是修改图片我们还需要先获取标签图片标签对象。 + +- 步骤: + + - 首先给点亮按钮和熄灭按钮都绑定单击事件。分别绑定函数on()和off() + - 然后在js中定义on()和off()函数 + - on()函数中,通过id获取img标签对象,然后通过img标签对象的src属性切换点亮的图片 + - off()函数中,通过id获取img标签对象,然后通过img标签对象的src属性切换熄灭的图片 + +- 代码实现: + + 事件绑定 + + ~~~html + + + ~~~ + + on()和off()函数 + + ~~~js + //1. 点击 "点亮" 按钮, 点亮灯泡; 点击 "熄灭" 按钮, 熄灭灯泡; -- onclick + function on(){ + //a. 获取img元素对象 + var img = document.getElementById("light"); + //b. 设置src属性 + img.src = "img/on.gif"; + } + + function off(){ + //a. 获取img元素对象 + var img = document.getElementById("light"); + //b. 设置src属性 + img.src = "img/off.gif"; + } + ~~~ + + + +##### 1.6.4.4 需求2 + +- 需求: + + 输入框鼠标聚焦后,展示小写;鼠标离焦后,展示大写。 + +- 分析: + + 聚焦和失焦的时候完成功能,所以我们需要给input标签绑定onfocus和onblur事件;我们要切换大小写,那么我们可定要获取原本输入框的内容,通过查询资料,需要使用input标签对象的value属性,然后进行大小写切换;切换完成我们需要重新填入,所以还是通过value属性来设置input标签输入框的内容 + +- 步骤: + + - 给input标签的onfocus和onblur事件分别绑定lower()和upper()函数 + - 然后在js中定义lower()和upper()函数 + - 对于lower()函数,先通过id获取输入框对象,然后通过输入框的value属性来设置内容,内容的话可以通过字符串的toLowerCase()函数来进行小写转换 + - 对于upper()函数,先通过id获取输入框对象,然后通过输入框的value属性来设置内容,内容的话可以通过字符串的toupperCase()函数来进行大写转换 + +- 代码实现:、 + + 事件绑定: + + ~~~html + + ~~~ + + lower()和upper()函数 + + ~~~js + //2. 输入框聚焦后, 展示小写; 输入框离焦后, 展示大写; -- onfocus , onblur + function lower(){//小写 + //a. 获取输入框元素对象 + var input = document.getElementById("name"); + + //b. 将值转为小写 + input.value = input.value.toLowerCase(); + } + + function upper(){//大写 + //a. 获取输入框元素对象 + var input = document.getElementById("name"); + + //b. 将值转为大写 + input.value = input.value.toUpperCase(); + } + ~~~ + + + +##### 1.6.4.5 需求3 + +- 需求: + + 点击 “全选”按钮使所有的复选框呈现被选中的状态,点击 “反选”按钮使所有的复选框呈现取消勾选的状态。 + +- 分析: + + 点击按钮完成功能,所以我们需要给2个按钮绑定单击事件;我们需要设置所有复选框的状态,通过我们之前的案例,我们知道,我们需要获取所有的复选框,然后遍历,可以通过设置checked属性为true,来设置复选框为选中;那么反之,设置checked属性为false,来设置复选框为未选中。 + +- 步骤: + + - 给全选和反选按钮绑定单击事件,分别绑定函数checkAll()和reverse() + - 在js中定义checkAll()和reverse()函数 + - 对于checkAll()函数,首先通过name属性值为hobby来获取所有的复选框,然后遍历复选框,设置每个复选框的checked属性为true即可 + - 对于reverse()函数,首先通过name属性值为hobby来获取所有的复选框,然后遍历复选框,设置每个复选框的checked属性为false即可 + +- 代码实现: + + 事件绑定: + + ~~~html + + + ~~~ + + checkAll()和reverse()函数 + + ~~~js + //3. 点击 "全选" 按钮使所有的复选框呈现选中状态 ; 点击 "反选" 按钮使所有的复选框呈现取消勾选的状态 ; + function checkAll(){ + //a. 获取所有复选框元素对象 + var hobbys = document.getElementsByName("hobby"); + + //b. 设置选中状态 + for (let i = 0; i < hobbys.length; i++) { + const element = hobbys[i]; + element.checked = true; + } + + } + + function reverse(){ + //a. 获取所有复选框元素对象 + var hobbys = document.getElementsByName("hobby"); + + //b. 设置未选中状态 + for (let i = 0; i < hobbys.length; i++) { + const element = hobbys[i]; + element.checked = false; + } + } + ~~~ + + + +##### 1.6.4.6 完整代码 + +~~~html + + + + + + + JS-事件-案例 + + + +
+ + + + +

+ +

+ + 电影 + 旅游 + 游戏 +
+ + + + + +~~~ + + + + + +## 2 Vue + +### 2.1 Vue概述 + +通过我们学习的html+css+js已经能够开发美观的页面了,但是开发的效率还有待提高,那么如何提高呢?我们先来分析下页面的组成。一个完整的html页面包括了视图和数据,数据是通过请求 从后台获取的,那么意味着我们需要将后台获取到的数据呈现到页面上,很明显, 这就需要我们使用DOM操作。正因为这种开发流程,所以我们引入了一种叫做**MVVM(Model-View-ViewModel)的前端开发思想**,即让我们开发者更加关注数据,而非数据绑定到视图这种机械化的操作。那么具体什么是MVVM思想呢? + +MVVM:其实是Model-View-ViewModel的缩写,有3个单词,具体释义如下: + +- Model: 数据模型,特指前端中通过请求从后台获取的数据 +- View: 视图,用于展示数据的页面,可以理解成我们的html+css搭建的页面,但是没有数据 +- ViewModel: 数据绑定到视图,负责将数据(Model)通过JavaScript的DOM技术,将数据展示到视图(View)上 + +如图所示就是MVVM开发思想的含义: + +![1668857055058](assets/1668857055058.png) + +基于上述的MVVM思想,其中的Model我们可以通过Ajax来发起请求从后台获取;对于View部分,我们将来会学习一款ElementUI框架来替代HTML+CSS来更加方便的搭建View;而今天我们要学习的就是侧重于ViewModel部分开发的vue前端框架,用来替代JavaScript的DOM操作,让数据展示到视图的代码开发变得更加的简单。可以简单到什么程度呢?可以参考下图对比: + +![1668858213508](assets/1668858213508.png) + +在更加复杂的dom操作中,vue只会变得更加的简单!在上述的代码中,我们看不到之前的DOM操作,因为vue全部帮我们封装好了。 + + + +接下来我们来介绍一下vue。 + +Vue.js(读音 /vjuː/, 类似于 **view**) 是一套构建用户界面的 **渐进式框架**。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。Vue.js 的目标是通过尽可能简单的 API 实现**响应的数据绑定**和**组合的视图组件**。 + +框架即是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。基于框架进行开发,更加快捷、更加高效。 + + + +### 2.2 快速入门 + +接下来我们通过一个vue的快速入门案例,来体验一下vue。 + +第一步:在VS Code中创建名为12. Vue-快速入门.html的文件,并且在html文件同级创建js目录,将**资料/vue.js文件**目录下得vue.js拷贝到js目录,如下图所示: + +![1668858952627](assets/1668858952627.png) + +第二步:然后编写<script>标签来引入vue.js文件,代码如下: + +~~~html + +~~~ + +第三步:在js代码区域定义vue对象,代码如下: + +~~~html + +~~~ + +在创建vue对象时,有几个常用的属性: + +- el: 用来指定哪儿些标签受 Vue 管理。 该属性取值 `#app` 中的 `app` 需要是受管理的标签的id属性值 +- data: 用来定义数据模型 +- methods: 用来定义函数。这个我们在后面就会用到 + +第四步:在html区域编写视图,其中{{}}是插值表达式,用来将vue对象中定义的model展示到页面上的 + +~~~html + +
+ + {{message}} +
+ +~~~ + +浏览器打开效果如图所示: + +![1668859214102](assets/1668859214102.png) + + + +整体代码如下: + +~~~html + + + + + + + Vue-快速入门 + + + + +
+ + {{message}} +
+ + + + +~~~ + + + + + +### 2.3 Vue指令 + +在上述的快速入门中,我们发现了html中输入了一个没有学过的属性`v-model`,这个就是vue的**指令**。 + +**指令:**HTML 标签上带有 v- 前缀的特殊属性,不同指令具有不同含义。例如:v-if,v-for… + +在vue中,通过大量的指令来实现数据绑定到视图的,所以接下来我们需要学习vue的常用指令,如下表所示: + +| **指令** | **作用** | +| --------- | --------------------------------------------------- | +| v-bind | 为HTML标签绑定属性值,如设置 href , css样式等 | +| v-model | 在表单元素上创建双向数据绑定 | +| v-on | 为HTML标签绑定事件 | +| v-if | 条件性的渲染某元素,判定为true时渲染,否则不渲染 | +| v-else | | +| v-else-if | | +| v-show | 根据条件展示某元素,区别在于切换的是display属性的值 | +| v-for | 列表渲染,遍历容器的元素或者对象的属性 | + + + +#### 2.3.1 v-bind和v-model + +我们首先来学习v-bind指令和v-model指令。 + +| **指令** | **作用** | +| -------- | ---------------------------------------------- | +| v-bind | 为HTML标签绑定属性值,如设置 href , css样式等 | +| v-model | 在表单元素上创建双向数据绑定 | + +- v-bind: 为HTML标签绑定属性值,如设置 href , css样式等。当vue对象中的数据模型发生变化时,标签的属性值会随之发生变化。 + + 接下来我们通过代码来演示。 + + 首先我们在VS Code中创建名为13. Vue-指令-v-bind和v-model.html的文件,然后准备好如下代码: + + ~~~html + + + + + + + Vue-指令-v-bind + + + +
+ + 链接1 + 链接2 + + + +
+ + + + ~~~ + + 在上述的代码中,我们需要给<a>标签的href属性赋值,并且值应该来自于vue对象的数据模型中的url变量。所以编写如下代码: + + ~~~html + 链接1 + ~~~ + + 在上述的代码中,v-bind指令是可以省略的,但是:不能省略,所以第二个超链接的代码编写如下: + + ~~~html + 链接2 + ~~~ + + 浏览器打开,2个超链接都可以点击,然后跳转到百度去!效果如图所示: + + ![1668860425429](assets/1668860425429.png) + + + + **注意:html属性前面有:表示采用的vue的属性绑定!** + +- v-model: 在表单元素上创建双向数据绑定。什么是双向? + + - vue对象的data属性中的数据变化,视图展示会一起变化 + - 视图数据发生变化,vue对象的data属性中的数据也会随着变化。 + + data属性中数据变化,我们知道可以通过赋值来改变,但是视图数据为什么会发生变化呢?**只有表单项标签!所以双向绑定一定是使用在表单项标签上的**。编写如下代码: + + ~~~html + + ~~~ + + 打开浏览器,我们修改表单项标签,发现vue对象data中的数据也发生了变化,如下图所示: + + ![1668861009068](assets/1668861009068.png) + + 通过上图我们发现,我们只是改变了表单数据,那么我们之前超链接的绑定的数据值也发生了变化,为什么? + + 就是因为我们双向绑定,在视图发生变化时,同时vue的data中的数据模型也会随着变化。那么这个在企业开发的应用场景是什么? + + **双向绑定的作用:可以获取表单的数据的值,然后提交给服务器** + + + + 整体代码如下: + + ~~~html + + + + + + + Vue-指令-v-bind + + + +
+ + 链接1 + 链接2 + + + +
+ + + + ~~~ + + + +#### 2.3.2 v-on + +接下来我们学习一下v-on指令。 + +v-on: 用来给html标签绑定事件的。**需要注意的是如下2点**: + +- v-on语法给标签的事件绑定的函数,必须是vue对象种声明的函数 + +- v-on语法绑定事件时,事件名相比较js中的事件名,没有on + + 例如:在js中,事件绑定demo函数 + + ~~~html + + ~~~ + + vue中,事件绑定demo函数 + + ~~~html + + ~~~ + +接下来我们通过代码演示。 + + + +首先在VS Code中创建名为14. Vue-指令-v-on.html的文件,提前准备如下代码: + +~~~html + + + + + + + Vue-指令-v-on + + + +
+ + + + +
+ + + +~~~ + +然后我们需要在vue对象的methods属性中定义事件绑定时需要的handle()函数,代码如下: + +~~~js + methods: { + handle: function(){ + alert("你点我了一下..."); + } +} +~~~ + +然后我们给第一个按钮,通过v-on指令绑定单击事件,代码如下: + +~~~html + +~~~ + +同样,v-on也存在简写方式,即v-on: 可以替换成@,所以第二个按钮绑定单击事件的代码如下: + +~~~html + +~~~ + + + +完整代码如下: + +~~~html + + + + + + + Vue-指令-v-on + + + +
+ + + + + +
+ + + +~~~ + + + +#### 2.3.3 v-if和v-show + +| 指令 | 描述 | +| --------- | --------------------------------------------------- | +| v-if | 条件性的渲染某元素,判定为true时渲染,否则不渲染 | +| v-if-else | | +| v-else | | +| v-show | 根据条件展示某元素,区别在于切换的是display属性的值 | + +我们直接通过代码来演示效果。在VS Code中创建名为15. Vue-指令-v-if和v-show.html的文件,提前准备好如下代码: + +~~~html + + + + + + + Vue-指令-v-if与v-show + + + +
+ + 年龄经判定,为: + 年轻人(35及以下) + 中年人(35-60) + 老年人(60及以上) + +

+
+ + + +~~~ + +其中采用了双向绑定到age属性,意味着我们可以通过表单输入框来改变age的值。 + +需求是当我们改变年龄时,需要动态判断年龄的值,呈现对应的年龄的文字描述。年轻人,我们需要使用条件判断`age<=35`,中年人我们需要使用条件判断`age>35 && age<60`,其他情况是老年人。所以通过v-if指令编写如下代码: + +~~~html +年龄经判定,为: +年轻人(35及以下) +中年人(35-60) +老年人(60及以上) +~~~ + +浏览器打开测试效果如下图: + +![1668864281939](assets/1668864281939.png) + +v-show和v-if的作用效果是一样的,只是原理不一样。复制上述html代码,修改v-if指令为v-show指令,代码如下: + +~~~html +年龄经判定,为: +年轻人(35及以下) +中年人(35-60) +老年人(60及以上) +~~~ + +打开浏览器,展示效果如下所示: + +![1668864558419](assets/1668864558419.png) + +可以发现,浏览器呈现的效果是一样的,但是浏览器中html源码不一样。v-if指令,不满足条件的标签代码直接没了,而v-show指令中,不满足条件的代码依然存在,只是添加了css样式来控制标签不去显示。 + + + +完整代码如下: + +~~~html + + + + + + + Vue-指令-v-if与v-show + + + +
+ + 年龄经判定,为: + 年轻人(35及以下) + 中年人(35-60) + 老年人(60及以上) + +

+ + 年龄经判定,为: + 年轻人(35及以下) + 中年人(35-60) + 老年人(60及以上) + +
+ + + +~~~ + + + +#### 2.3.4 v-for + +v-for: 从名字我们就能看出,这个指令是用来遍历的。其语法格式如下: + +~~~html +<标签 v-for="变量名 in 集合模型数据"> + {{变量名}} + +~~~ + +需要注意的是:需要循环那个标签,v-for 指令就写在那个标签上。 + +有时我们遍历时需要使用索引,那么v-for指令遍历的语法格式如下: + +~~~html +<标签 v-for="(变量名,索引变量) in 集合模型数据"> + + {{索引变量 + 1}} {{变量名}} + +~~~ + +接下来,我们再VS Code中创建名为16. Vue-指令-v-for.html的文件编写代码演示,提前准备如下代码: + +~~~html + + + + + + + Vue-指令-v-for + + + +
+ +
+ + + +~~~ + +然后分别编写2种遍历语法,来遍历数组,展示数据,代码如下: + +~~~html +
+
{{addr}}
+
+
{{index + 1}} : {{addr}}
+
+~~~ + +浏览器打开,呈现如下效果: + +![1668866805981](assets/1668866805981.png) + + + +#### 2.3.5 案例 + +- 需求: + + ![1668868100828](assets/1668868100828.png) + + 如上图所示,我们提供好了数据模型,users是数组集合,提供了多个用户信息。然后我们需要将数据以表格的形式,展示到页面上,其中,性别需要转换成中文男女,等级需要将分数数值转换成对应的等级。 + +- 分析: + + 首先我们肯定需要遍历数组的,所以需要使用v-for标签;然后我们每一条数据对应一行,所以v-for需要添加在tr标签上;其次我们需要将编号,所以需要使用索引的遍历语法;然后我们要将数据展示到表格的单元格中,所以我们需要使用{{}}插值表达式;最后,我们需要转换内容,所以我们需要使用v-if指令,进行条件判断和内容的转换 + +- 步骤: + + - 使用v-for的带索引方式添加到表格的<tr>标签上 + - 使用{{}}插值表达式展示内容到单元格 + - 使用索引+1来作为编号 + - 使用v-if来判断,改变性别和等级这2列的值 + +- 代码实现: + + 首先创建名为17. Vue-指令-案例.html的文件,提前准备如下代码: + + ~~~html + + + + + + + Vue-指令-案例 + + + + +
+ + + + + + + + + + +
编号姓名年龄性别成绩等级
+ +
+ + + + + + ~~~ + + 然后在<tr>上添加v-for进行遍历,以及通过插值表达式{{}}和v-if指令来填充内容和改变内容,其代码如下: + + ~~~html + + {{index + 1}} + {{user.name}} + {{user.age}} + + + + + {{user.score}} + + 优秀 + 及格 + 不及格 + + + ~~~ + + + +其完整代码如下: + +~~~html + + + + + + + Vue-指令-案例 + + + + +
+ + + + + + + + + + + + + + + + + + + +
编号姓名年龄性别成绩等级
{{index + 1}}{{user.name}}{{user.age}} + + + {{user.score}} + 优秀 + 及格 + 不及格 +
+ +
+ + + + + +~~~ + + + + + +### 2.4 生命周期 + +vue的生命周期:指的是vue对象从创建到销毁的过程。vue的生命周期包含8个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法,这些生命周期方法也被称为钩子方法。其完整的生命周期如下图所示: + +| 状态 | 阶段周期 | +| ------------- | -------- | +| beforeCreate | 创建前 | +| created | 创建后 | +| beforeMount | 挂载前 | +| mounted | 挂载完成 | +| beforeUpdate | 更新前 | +| updated | 更新后 | +| beforeDestroy | 销毁前 | +| destroyed | 销毁后 | + +下图是 Vue 官网提供的从创建 Vue 到效果 Vue 对象的整个过程及各个阶段对应的钩子函数: + +![1668867134683](assets/1668867134683.png) + +其中我们需要重点关注的是**mounted,**其他的我们了解即可。 + +mounted:挂载完成,Vue初始化成功,HTML页面渲染成功。**以后我们一般用于页面初始化自动的ajax请求后台数据** + +我们在VS Code中创建名为18. Vue-生命周期.html的文件编写代码来演示效果,提前准备如下代码: + +~~~html + + + + + + + Vue-指令-v-for + + + +
+ +
+ + + +~~~ + + + +然后我们编写mounted声明周期的钩子函数,与methods同级,代码如下: + +~~~html + +~~~ + +浏览器打开,运行结果如下:我们发现,自动打印了这句话,因为页面加载完成,vue对象创建并且完成了挂在,此时自动触发mounted所绑定的钩子函数,然后自动执行,弹框。 + +![1668867458156](assets/1668867458156.png) + diff --git a/javaEE/day03/assets/1669103527446.png b/javaEE/day03/assets/1669103527446.png new file mode 100644 index 0000000..8e54588 Binary files /dev/null and b/javaEE/day03/assets/1669103527446.png differ diff --git a/javaEE/day03/assets/1669104434765.png b/javaEE/day03/assets/1669104434765.png new file mode 100644 index 0000000..48b8f49 Binary files /dev/null and b/javaEE/day03/assets/1669104434765.png differ diff --git a/javaEE/day03/assets/1669104506486.png b/javaEE/day03/assets/1669104506486.png new file mode 100644 index 0000000..3ab7d0c Binary files /dev/null and b/javaEE/day03/assets/1669104506486.png differ diff --git a/javaEE/day03/assets/1669104661340.png b/javaEE/day03/assets/1669104661340.png new file mode 100644 index 0000000..6593dde Binary files /dev/null and b/javaEE/day03/assets/1669104661340.png differ diff --git a/javaEE/day03/assets/1669104976255.png b/javaEE/day03/assets/1669104976255.png new file mode 100644 index 0000000..802972c Binary files /dev/null and b/javaEE/day03/assets/1669104976255.png differ diff --git a/javaEE/day03/assets/1669104997323.png b/javaEE/day03/assets/1669104997323.png new file mode 100644 index 0000000..56f000c Binary files /dev/null and b/javaEE/day03/assets/1669104997323.png differ diff --git a/javaEE/day03/assets/1669105041533.png b/javaEE/day03/assets/1669105041533.png new file mode 100644 index 0000000..57451b7 Binary files /dev/null and b/javaEE/day03/assets/1669105041533.png differ diff --git a/javaEE/day03/assets/1669105385944.png b/javaEE/day03/assets/1669105385944.png new file mode 100644 index 0000000..ef46f9c Binary files /dev/null and b/javaEE/day03/assets/1669105385944.png differ diff --git a/javaEE/day03/assets/1669105479350.png b/javaEE/day03/assets/1669105479350.png new file mode 100644 index 0000000..eda44e6 Binary files /dev/null and b/javaEE/day03/assets/1669105479350.png differ diff --git a/javaEE/day03/assets/1669105963948.png b/javaEE/day03/assets/1669105963948.png new file mode 100644 index 0000000..8a1ac27 Binary files /dev/null and b/javaEE/day03/assets/1669105963948.png differ diff --git a/javaEE/day03/assets/1669106705778.png b/javaEE/day03/assets/1669106705778.png new file mode 100644 index 0000000..7fec2e4 Binary files /dev/null and b/javaEE/day03/assets/1669106705778.png differ diff --git a/javaEE/day03/assets/1669106850383.png b/javaEE/day03/assets/1669106850383.png new file mode 100644 index 0000000..5a9bd52 Binary files /dev/null and b/javaEE/day03/assets/1669106850383.png differ diff --git a/javaEE/day03/assets/1669108721264.png b/javaEE/day03/assets/1669108721264.png new file mode 100644 index 0000000..452059a Binary files /dev/null and b/javaEE/day03/assets/1669108721264.png differ diff --git a/javaEE/day03/assets/1669108792555.png b/javaEE/day03/assets/1669108792555.png new file mode 100644 index 0000000..db0dba7 Binary files /dev/null and b/javaEE/day03/assets/1669108792555.png differ diff --git a/javaEE/day03/assets/1669109315808.png b/javaEE/day03/assets/1669109315808.png new file mode 100644 index 0000000..8e0e92b Binary files /dev/null and b/javaEE/day03/assets/1669109315808.png differ diff --git a/javaEE/day03/assets/1669109382408.png b/javaEE/day03/assets/1669109382408.png new file mode 100644 index 0000000..c833d7b Binary files /dev/null and b/javaEE/day03/assets/1669109382408.png differ diff --git a/javaEE/day03/assets/1669139756551.png b/javaEE/day03/assets/1669139756551.png new file mode 100644 index 0000000..472e200 Binary files /dev/null and b/javaEE/day03/assets/1669139756551.png differ diff --git a/javaEE/day03/assets/1669140682300.png b/javaEE/day03/assets/1669140682300.png new file mode 100644 index 0000000..e5610e7 Binary files /dev/null and b/javaEE/day03/assets/1669140682300.png differ diff --git a/javaEE/day03/assets/1669141982809.png b/javaEE/day03/assets/1669141982809.png new file mode 100644 index 0000000..efd8938 Binary files /dev/null and b/javaEE/day03/assets/1669141982809.png differ diff --git a/javaEE/day03/assets/1669142636044.png b/javaEE/day03/assets/1669142636044.png new file mode 100644 index 0000000..4e3ab57 Binary files /dev/null and b/javaEE/day03/assets/1669142636044.png differ diff --git a/javaEE/day03/assets/1669143264499.png b/javaEE/day03/assets/1669143264499.png new file mode 100644 index 0000000..f777f7b Binary files /dev/null and b/javaEE/day03/assets/1669143264499.png differ diff --git a/javaEE/day03/assets/1669143781533.png b/javaEE/day03/assets/1669143781533.png new file mode 100644 index 0000000..70708bb Binary files /dev/null and b/javaEE/day03/assets/1669143781533.png differ diff --git a/javaEE/day03/assets/1669198315061.png b/javaEE/day03/assets/1669198315061.png new file mode 100644 index 0000000..ccb873e Binary files /dev/null and b/javaEE/day03/assets/1669198315061.png differ diff --git a/javaEE/day03/assets/1669198453566.png b/javaEE/day03/assets/1669198453566.png new file mode 100644 index 0000000..6772b35 Binary files /dev/null and b/javaEE/day03/assets/1669198453566.png differ diff --git a/javaEE/day03/assets/1669198630531.png b/javaEE/day03/assets/1669198630531.png new file mode 100644 index 0000000..104aa27 Binary files /dev/null and b/javaEE/day03/assets/1669198630531.png differ diff --git a/javaEE/day03/assets/1669198823175.png b/javaEE/day03/assets/1669198823175.png new file mode 100644 index 0000000..ef387a1 Binary files /dev/null and b/javaEE/day03/assets/1669198823175.png differ diff --git a/javaEE/day03/assets/1669198893311.png b/javaEE/day03/assets/1669198893311.png new file mode 100644 index 0000000..5e53cfb Binary files /dev/null and b/javaEE/day03/assets/1669198893311.png differ diff --git a/javaEE/day03/assets/1669198976610.png b/javaEE/day03/assets/1669198976610.png new file mode 100644 index 0000000..354f0d0 Binary files /dev/null and b/javaEE/day03/assets/1669198976610.png differ diff --git a/javaEE/day03/assets/1669289187162.png b/javaEE/day03/assets/1669289187162.png new file mode 100644 index 0000000..4567bd7 Binary files /dev/null and b/javaEE/day03/assets/1669289187162.png differ diff --git a/javaEE/day03/assets/1669289350540.png b/javaEE/day03/assets/1669289350540.png new file mode 100644 index 0000000..4567bd7 Binary files /dev/null and b/javaEE/day03/assets/1669289350540.png differ diff --git a/javaEE/day03/assets/1669289410729.png b/javaEE/day03/assets/1669289410729.png new file mode 100644 index 0000000..aa827e0 Binary files /dev/null and b/javaEE/day03/assets/1669289410729.png differ diff --git a/javaEE/day03/assets/1669289514661.png b/javaEE/day03/assets/1669289514661.png new file mode 100644 index 0000000..e8ef4a7 Binary files /dev/null and b/javaEE/day03/assets/1669289514661.png differ diff --git a/javaEE/day03/assets/1669289623957.png b/javaEE/day03/assets/1669289623957.png new file mode 100644 index 0000000..e679b70 Binary files /dev/null and b/javaEE/day03/assets/1669289623957.png differ diff --git a/javaEE/day03/assets/1669289857670.png b/javaEE/day03/assets/1669289857670.png new file mode 100644 index 0000000..c0b7553 Binary files /dev/null and b/javaEE/day03/assets/1669289857670.png differ diff --git a/javaEE/day03/assets/1669290005090.png b/javaEE/day03/assets/1669290005090.png new file mode 100644 index 0000000..d09e6e4 Binary files /dev/null and b/javaEE/day03/assets/1669290005090.png differ diff --git a/javaEE/day03/assets/1669290074367.png b/javaEE/day03/assets/1669290074367.png new file mode 100644 index 0000000..1da1c86 Binary files /dev/null and b/javaEE/day03/assets/1669290074367.png differ diff --git a/javaEE/day03/assets/1669290093854.png b/javaEE/day03/assets/1669290093854.png new file mode 100644 index 0000000..3806e5a Binary files /dev/null and b/javaEE/day03/assets/1669290093854.png differ diff --git a/javaEE/day03/assets/1669290162900.png b/javaEE/day03/assets/1669290162900.png new file mode 100644 index 0000000..0d31c40 Binary files /dev/null and b/javaEE/day03/assets/1669290162900.png differ diff --git a/javaEE/day03/assets/1669290210749.png b/javaEE/day03/assets/1669290210749.png new file mode 100644 index 0000000..eaf908d Binary files /dev/null and b/javaEE/day03/assets/1669290210749.png differ diff --git a/javaEE/day03/assets/1669291918358.png b/javaEE/day03/assets/1669291918358.png new file mode 100644 index 0000000..eaf908d Binary files /dev/null and b/javaEE/day03/assets/1669291918358.png differ diff --git a/javaEE/day03/assets/1669291953746.png b/javaEE/day03/assets/1669291953746.png new file mode 100644 index 0000000..575a308 Binary files /dev/null and b/javaEE/day03/assets/1669291953746.png differ diff --git a/javaEE/day03/assets/1669293955527.png b/javaEE/day03/assets/1669293955527.png new file mode 100644 index 0000000..802f509 Binary files /dev/null and b/javaEE/day03/assets/1669293955527.png differ diff --git a/javaEE/day03/assets/1669294575467.png b/javaEE/day03/assets/1669294575467.png new file mode 100644 index 0000000..58bf95d Binary files /dev/null and b/javaEE/day03/assets/1669294575467.png differ diff --git a/javaEE/day03/assets/1669294586147.png b/javaEE/day03/assets/1669294586147.png new file mode 100644 index 0000000..58bf95d Binary files /dev/null and b/javaEE/day03/assets/1669294586147.png differ diff --git a/javaEE/day03/assets/1669294790640.png b/javaEE/day03/assets/1669294790640.png new file mode 100644 index 0000000..58b1541 Binary files /dev/null and b/javaEE/day03/assets/1669294790640.png differ diff --git a/javaEE/day03/assets/1669294846601.png b/javaEE/day03/assets/1669294846601.png new file mode 100644 index 0000000..8326617 Binary files /dev/null and b/javaEE/day03/assets/1669294846601.png differ diff --git a/javaEE/day03/assets/1669294939067.png b/javaEE/day03/assets/1669294939067.png new file mode 100644 index 0000000..bcbcb22 Binary files /dev/null and b/javaEE/day03/assets/1669294939067.png differ diff --git a/javaEE/day03/assets/1669295020228.png b/javaEE/day03/assets/1669295020228.png new file mode 100644 index 0000000..4694275 Binary files /dev/null and b/javaEE/day03/assets/1669295020228.png differ diff --git a/javaEE/day03/assets/1669301661722.png b/javaEE/day03/assets/1669301661722.png new file mode 100644 index 0000000..38848b4 Binary files /dev/null and b/javaEE/day03/assets/1669301661722.png differ diff --git a/javaEE/day03/assets/1669301737491.png b/javaEE/day03/assets/1669301737491.png new file mode 100644 index 0000000..74a4c92 Binary files /dev/null and b/javaEE/day03/assets/1669301737491.png differ diff --git a/javaEE/day03/assets/1669301859936.png b/javaEE/day03/assets/1669301859936.png new file mode 100644 index 0000000..bbf1ef7 Binary files /dev/null and b/javaEE/day03/assets/1669301859936.png differ diff --git a/javaEE/day03/assets/1669301965095.png b/javaEE/day03/assets/1669301965095.png new file mode 100644 index 0000000..6605632 Binary files /dev/null and b/javaEE/day03/assets/1669301965095.png differ diff --git a/javaEE/day03/assets/1669302091090.png b/javaEE/day03/assets/1669302091090.png new file mode 100644 index 0000000..1c8c0b4 Binary files /dev/null and b/javaEE/day03/assets/1669302091090.png differ diff --git a/javaEE/day03/assets/1669302171975.png b/javaEE/day03/assets/1669302171975.png new file mode 100644 index 0000000..89ec22a Binary files /dev/null and b/javaEE/day03/assets/1669302171975.png differ diff --git a/javaEE/day03/assets/1669302546471.png b/javaEE/day03/assets/1669302546471.png new file mode 100644 index 0000000..24047b0 Binary files /dev/null and b/javaEE/day03/assets/1669302546471.png differ diff --git a/javaEE/day03/assets/1669302718419.png b/javaEE/day03/assets/1669302718419.png new file mode 100644 index 0000000..4deb094 Binary files /dev/null and b/javaEE/day03/assets/1669302718419.png differ diff --git a/javaEE/day03/assets/1669302973198.png b/javaEE/day03/assets/1669302973198.png new file mode 100644 index 0000000..6c6b23b Binary files /dev/null and b/javaEE/day03/assets/1669302973198.png differ diff --git a/javaEE/day03/assets/1669303687468.png b/javaEE/day03/assets/1669303687468.png new file mode 100644 index 0000000..de510cd Binary files /dev/null and b/javaEE/day03/assets/1669303687468.png differ diff --git a/javaEE/day03/assets/1669303846100.png b/javaEE/day03/assets/1669303846100.png new file mode 100644 index 0000000..46ff021 Binary files /dev/null and b/javaEE/day03/assets/1669303846100.png differ diff --git a/javaEE/day03/assets/1669303928641.png b/javaEE/day03/assets/1669303928641.png new file mode 100644 index 0000000..68a84f3 Binary files /dev/null and b/javaEE/day03/assets/1669303928641.png differ diff --git a/javaEE/day03/assets/1669304009602.png b/javaEE/day03/assets/1669304009602.png new file mode 100644 index 0000000..536497c Binary files /dev/null and b/javaEE/day03/assets/1669304009602.png differ diff --git a/javaEE/day03/assets/1669304267724.png b/javaEE/day03/assets/1669304267724.png new file mode 100644 index 0000000..094adbc Binary files /dev/null and b/javaEE/day03/assets/1669304267724.png differ diff --git a/javaEE/day03/assets/1669304385826.png b/javaEE/day03/assets/1669304385826.png new file mode 100644 index 0000000..1b25a51 Binary files /dev/null and b/javaEE/day03/assets/1669304385826.png differ diff --git a/javaEE/day03/assets/1669304694076.png b/javaEE/day03/assets/1669304694076.png new file mode 100644 index 0000000..2d53220 Binary files /dev/null and b/javaEE/day03/assets/1669304694076.png differ diff --git a/javaEE/day03/assets/1669304930336.png b/javaEE/day03/assets/1669304930336.png new file mode 100644 index 0000000..f4e8405 Binary files /dev/null and b/javaEE/day03/assets/1669304930336.png differ diff --git a/javaEE/day03/assets/1669305068434.png b/javaEE/day03/assets/1669305068434.png new file mode 100644 index 0000000..2088e2d Binary files /dev/null and b/javaEE/day03/assets/1669305068434.png differ diff --git a/javaEE/day03/assets/1669305175744.png b/javaEE/day03/assets/1669305175744.png new file mode 100644 index 0000000..2088e2d Binary files /dev/null and b/javaEE/day03/assets/1669305175744.png differ diff --git a/javaEE/day03/assets/1669305444633.png b/javaEE/day03/assets/1669305444633.png new file mode 100644 index 0000000..df4dd43 Binary files /dev/null and b/javaEE/day03/assets/1669305444633.png differ diff --git a/javaEE/day03/assets/1669305565247.png b/javaEE/day03/assets/1669305565247.png new file mode 100644 index 0000000..c09b236 Binary files /dev/null and b/javaEE/day03/assets/1669305565247.png differ diff --git a/javaEE/day03/assets/1669305570022.png b/javaEE/day03/assets/1669305570022.png new file mode 100644 index 0000000..c09b236 Binary files /dev/null and b/javaEE/day03/assets/1669305570022.png differ diff --git a/javaEE/day03/assets/1669308098856.png b/javaEE/day03/assets/1669308098856.png new file mode 100644 index 0000000..e8e92f8 Binary files /dev/null and b/javaEE/day03/assets/1669308098856.png differ diff --git a/javaEE/day03/assets/1669313364004.png b/javaEE/day03/assets/1669313364004.png new file mode 100644 index 0000000..b3554b2 Binary files /dev/null and b/javaEE/day03/assets/1669313364004.png differ diff --git a/javaEE/day03/assets/1669313673752.png b/javaEE/day03/assets/1669313673752.png new file mode 100644 index 0000000..7620398 Binary files /dev/null and b/javaEE/day03/assets/1669313673752.png differ diff --git a/javaEE/day03/assets/1669313699186.png b/javaEE/day03/assets/1669313699186.png new file mode 100644 index 0000000..ac51abc Binary files /dev/null and b/javaEE/day03/assets/1669313699186.png differ diff --git a/javaEE/day03/assets/1669313894258.png b/javaEE/day03/assets/1669313894258.png new file mode 100644 index 0000000..01bd76f Binary files /dev/null and b/javaEE/day03/assets/1669313894258.png differ diff --git a/javaEE/day03/assets/1669314115641.png b/javaEE/day03/assets/1669314115641.png new file mode 100644 index 0000000..b83ab03 Binary files /dev/null and b/javaEE/day03/assets/1669314115641.png differ diff --git a/javaEE/day03/assets/1669357961971.png b/javaEE/day03/assets/1669357961971.png new file mode 100644 index 0000000..261d818 Binary files /dev/null and b/javaEE/day03/assets/1669357961971.png differ diff --git a/javaEE/day03/assets/1669358653297.png b/javaEE/day03/assets/1669358653297.png new file mode 100644 index 0000000..fb84c37 Binary files /dev/null and b/javaEE/day03/assets/1669358653297.png differ diff --git a/javaEE/day03/assets/1669358935188.png b/javaEE/day03/assets/1669358935188.png new file mode 100644 index 0000000..1ca3f6a Binary files /dev/null and b/javaEE/day03/assets/1669358935188.png differ diff --git a/javaEE/day03/assets/1669359233656.png b/javaEE/day03/assets/1669359233656.png new file mode 100644 index 0000000..60f97b1 Binary files /dev/null and b/javaEE/day03/assets/1669359233656.png differ diff --git a/javaEE/day03/assets/1669359450896.png b/javaEE/day03/assets/1669359450896.png new file mode 100644 index 0000000..fa5f332 Binary files /dev/null and b/javaEE/day03/assets/1669359450896.png differ diff --git a/javaEE/day03/assets/1669359839574.png b/javaEE/day03/assets/1669359839574.png new file mode 100644 index 0000000..384a31f Binary files /dev/null and b/javaEE/day03/assets/1669359839574.png differ diff --git a/javaEE/day03/assets/1669359904272.png b/javaEE/day03/assets/1669359904272.png new file mode 100644 index 0000000..ec1a284 Binary files /dev/null and b/javaEE/day03/assets/1669359904272.png differ diff --git a/javaEE/day03/assets/1669360120385.png b/javaEE/day03/assets/1669360120385.png new file mode 100644 index 0000000..874f44a Binary files /dev/null and b/javaEE/day03/assets/1669360120385.png differ diff --git a/javaEE/day03/assets/1669360320983.png b/javaEE/day03/assets/1669360320983.png new file mode 100644 index 0000000..3ea5188 Binary files /dev/null and b/javaEE/day03/assets/1669360320983.png differ diff --git a/javaEE/day03/assets/1669360502407.png b/javaEE/day03/assets/1669360502407.png new file mode 100644 index 0000000..ac6c8ad Binary files /dev/null and b/javaEE/day03/assets/1669360502407.png differ diff --git a/javaEE/day03/assets/1669361564197.png b/javaEE/day03/assets/1669361564197.png new file mode 100644 index 0000000..5d3e246 Binary files /dev/null and b/javaEE/day03/assets/1669361564197.png differ diff --git a/javaEE/day03/assets/1669362225501.png b/javaEE/day03/assets/1669362225501.png new file mode 100644 index 0000000..5a5d583 Binary files /dev/null and b/javaEE/day03/assets/1669362225501.png differ diff --git a/javaEE/day03/assets/1669362382846.png b/javaEE/day03/assets/1669362382846.png new file mode 100644 index 0000000..bcc2509 Binary files /dev/null and b/javaEE/day03/assets/1669362382846.png differ diff --git a/javaEE/day03/assets/1669362451236.png b/javaEE/day03/assets/1669362451236.png new file mode 100644 index 0000000..512dbc3 Binary files /dev/null and b/javaEE/day03/assets/1669362451236.png differ diff --git a/javaEE/day03/assets/1669363098610.png b/javaEE/day03/assets/1669363098610.png new file mode 100644 index 0000000..1ac047d Binary files /dev/null and b/javaEE/day03/assets/1669363098610.png differ diff --git a/javaEE/day03/assets/1669363190361.png b/javaEE/day03/assets/1669363190361.png new file mode 100644 index 0000000..1a941cf Binary files /dev/null and b/javaEE/day03/assets/1669363190361.png differ diff --git a/javaEE/day03/assets/1669363631302.png b/javaEE/day03/assets/1669363631302.png new file mode 100644 index 0000000..6001ef4 Binary files /dev/null and b/javaEE/day03/assets/1669363631302.png differ diff --git a/javaEE/day03/assets/1669363746409.png b/javaEE/day03/assets/1669363746409.png new file mode 100644 index 0000000..fe215a8 Binary files /dev/null and b/javaEE/day03/assets/1669363746409.png differ diff --git a/javaEE/day03/assets/1669363921750.png b/javaEE/day03/assets/1669363921750.png new file mode 100644 index 0000000..bb62c41 Binary files /dev/null and b/javaEE/day03/assets/1669363921750.png differ diff --git a/javaEE/day03/assets/1669364288179.png b/javaEE/day03/assets/1669364288179.png new file mode 100644 index 0000000..ce2ef32 Binary files /dev/null and b/javaEE/day03/assets/1669364288179.png differ diff --git a/javaEE/day03/assets/1669364403079.png b/javaEE/day03/assets/1669364403079.png new file mode 100644 index 0000000..07ffd32 Binary files /dev/null and b/javaEE/day03/assets/1669364403079.png differ diff --git a/javaEE/day03/assets/1669364533849.png b/javaEE/day03/assets/1669364533849.png new file mode 100644 index 0000000..2c5a9ad Binary files /dev/null and b/javaEE/day03/assets/1669364533849.png differ diff --git a/javaEE/day03/assets/1669364990991.png b/javaEE/day03/assets/1669364990991.png new file mode 100644 index 0000000..69e367e Binary files /dev/null and b/javaEE/day03/assets/1669364990991.png differ diff --git a/javaEE/day03/assets/1669365117644.png b/javaEE/day03/assets/1669365117644.png new file mode 100644 index 0000000..56da7af Binary files /dev/null and b/javaEE/day03/assets/1669365117644.png differ diff --git a/javaEE/day03/assets/1669365585379.png b/javaEE/day03/assets/1669365585379.png new file mode 100644 index 0000000..bffd4f7 Binary files /dev/null and b/javaEE/day03/assets/1669365585379.png differ diff --git a/javaEE/day03/assets/1669365791037.png b/javaEE/day03/assets/1669365791037.png new file mode 100644 index 0000000..11bbfc7 Binary files /dev/null and b/javaEE/day03/assets/1669365791037.png differ diff --git a/javaEE/day03/assets/1669365950945.png b/javaEE/day03/assets/1669365950945.png new file mode 100644 index 0000000..0fae538 Binary files /dev/null and b/javaEE/day03/assets/1669365950945.png differ diff --git a/javaEE/day03/assets/1669366365778.png b/javaEE/day03/assets/1669366365778.png new file mode 100644 index 0000000..f13076d Binary files /dev/null and b/javaEE/day03/assets/1669366365778.png differ diff --git a/javaEE/day03/assets/1669366903107.png b/javaEE/day03/assets/1669366903107.png new file mode 100644 index 0000000..4d1d77e Binary files /dev/null and b/javaEE/day03/assets/1669366903107.png differ diff --git a/javaEE/day03/assets/1669369572075.png b/javaEE/day03/assets/1669369572075.png new file mode 100644 index 0000000..77570a0 Binary files /dev/null and b/javaEE/day03/assets/1669369572075.png differ diff --git a/javaEE/day03/assets/1669369751014.png b/javaEE/day03/assets/1669369751014.png new file mode 100644 index 0000000..590680a Binary files /dev/null and b/javaEE/day03/assets/1669369751014.png differ diff --git a/javaEE/day03/assets/1669369856963.png b/javaEE/day03/assets/1669369856963.png new file mode 100644 index 0000000..2c87c32 Binary files /dev/null and b/javaEE/day03/assets/1669369856963.png differ diff --git a/javaEE/day03/assets/1669370230214.png b/javaEE/day03/assets/1669370230214.png new file mode 100644 index 0000000..a63e547 Binary files /dev/null and b/javaEE/day03/assets/1669370230214.png differ diff --git a/javaEE/day03/assets/1669371003680.png b/javaEE/day03/assets/1669371003680.png new file mode 100644 index 0000000..2fc66c9 Binary files /dev/null and b/javaEE/day03/assets/1669371003680.png differ diff --git a/javaEE/day03/assets/1669371163913.png b/javaEE/day03/assets/1669371163913.png new file mode 100644 index 0000000..05d01f9 Binary files /dev/null and b/javaEE/day03/assets/1669371163913.png differ diff --git a/javaEE/day03/assets/1669371448683.png b/javaEE/day03/assets/1669371448683.png new file mode 100644 index 0000000..531c675 Binary files /dev/null and b/javaEE/day03/assets/1669371448683.png differ diff --git a/javaEE/day03/assets/1669373199181.png b/javaEE/day03/assets/1669373199181.png new file mode 100644 index 0000000..08f5975 Binary files /dev/null and b/javaEE/day03/assets/1669373199181.png differ diff --git a/javaEE/day03/assets/1669373386131.png b/javaEE/day03/assets/1669373386131.png new file mode 100644 index 0000000..da85f55 Binary files /dev/null and b/javaEE/day03/assets/1669373386131.png differ diff --git a/javaEE/day03/assets/1669373639681.png b/javaEE/day03/assets/1669373639681.png new file mode 100644 index 0000000..aa8713b Binary files /dev/null and b/javaEE/day03/assets/1669373639681.png differ diff --git a/javaEE/day03/assets/1669374858620.png b/javaEE/day03/assets/1669374858620.png new file mode 100644 index 0000000..cfed8f5 Binary files /dev/null and b/javaEE/day03/assets/1669374858620.png differ diff --git a/javaEE/day03/assets/1669375414710.png b/javaEE/day03/assets/1669375414710.png new file mode 100644 index 0000000..60b081e Binary files /dev/null and b/javaEE/day03/assets/1669375414710.png differ diff --git a/javaEE/day03/assets/1669376226430.png b/javaEE/day03/assets/1669376226430.png new file mode 100644 index 0000000..48f99e9 Binary files /dev/null and b/javaEE/day03/assets/1669376226430.png differ diff --git a/javaEE/day03/assets/1669376499711.png b/javaEE/day03/assets/1669376499711.png new file mode 100644 index 0000000..ed0bd81 Binary files /dev/null and b/javaEE/day03/assets/1669376499711.png differ diff --git a/javaEE/day03/assets/1669376527001.png b/javaEE/day03/assets/1669376527001.png new file mode 100644 index 0000000..13431c1 Binary files /dev/null and b/javaEE/day03/assets/1669376527001.png differ diff --git a/javaEE/day03/assets/1669376996028.png b/javaEE/day03/assets/1669376996028.png new file mode 100644 index 0000000..741cb20 Binary files /dev/null and b/javaEE/day03/assets/1669376996028.png differ diff --git a/javaEE/day03/assets/1669377134623.png b/javaEE/day03/assets/1669377134623.png new file mode 100644 index 0000000..3990bbb Binary files /dev/null and b/javaEE/day03/assets/1669377134623.png differ diff --git a/javaEE/day03/assets/1669377371518.png b/javaEE/day03/assets/1669377371518.png new file mode 100644 index 0000000..256f1a7 Binary files /dev/null and b/javaEE/day03/assets/1669377371518.png differ diff --git a/javaEE/day03/assets/1669377946672.png b/javaEE/day03/assets/1669377946672.png new file mode 100644 index 0000000..cc0b042 Binary files /dev/null and b/javaEE/day03/assets/1669377946672.png differ diff --git a/javaEE/day03/assets/1669377954508.png b/javaEE/day03/assets/1669377954508.png new file mode 100644 index 0000000..cc0b042 Binary files /dev/null and b/javaEE/day03/assets/1669377954508.png differ diff --git a/javaEE/day03/assets/1669377989767.png b/javaEE/day03/assets/1669377989767.png new file mode 100644 index 0000000..39d4d40 Binary files /dev/null and b/javaEE/day03/assets/1669377989767.png differ diff --git a/javaEE/day03/assets/1669378005930.png b/javaEE/day03/assets/1669378005930.png new file mode 100644 index 0000000..3c0f63b Binary files /dev/null and b/javaEE/day03/assets/1669378005930.png differ diff --git a/javaEE/day03/assets/1669378360527.png b/javaEE/day03/assets/1669378360527.png new file mode 100644 index 0000000..752b942 Binary files /dev/null and b/javaEE/day03/assets/1669378360527.png differ diff --git a/javaEE/day03/assets/1669378670102.png b/javaEE/day03/assets/1669378670102.png new file mode 100644 index 0000000..4ae4148 Binary files /dev/null and b/javaEE/day03/assets/1669378670102.png differ diff --git a/javaEE/day03/assets/1669379153961.png b/javaEE/day03/assets/1669379153961.png new file mode 100644 index 0000000..363b419 Binary files /dev/null and b/javaEE/day03/assets/1669379153961.png differ diff --git a/javaEE/day03/assets/1669379291238.png b/javaEE/day03/assets/1669379291238.png new file mode 100644 index 0000000..2c13222 Binary files /dev/null and b/javaEE/day03/assets/1669379291238.png differ diff --git a/javaEE/day03/assets/1669380411564.png b/javaEE/day03/assets/1669380411564.png new file mode 100644 index 0000000..66d4022 Binary files /dev/null and b/javaEE/day03/assets/1669380411564.png differ diff --git a/javaEE/day03/assets/1669380607025.png b/javaEE/day03/assets/1669380607025.png new file mode 100644 index 0000000..82fe28b Binary files /dev/null and b/javaEE/day03/assets/1669380607025.png differ diff --git a/javaEE/day03/assets/1669381155917.png b/javaEE/day03/assets/1669381155917.png new file mode 100644 index 0000000..785a6b5 Binary files /dev/null and b/javaEE/day03/assets/1669381155917.png differ diff --git a/javaEE/day03/assets/1669381520004.png b/javaEE/day03/assets/1669381520004.png new file mode 100644 index 0000000..c0cac6a Binary files /dev/null and b/javaEE/day03/assets/1669381520004.png differ diff --git a/javaEE/day03/assets/1669381732234.png b/javaEE/day03/assets/1669381732234.png new file mode 100644 index 0000000..851fce0 Binary files /dev/null and b/javaEE/day03/assets/1669381732234.png differ diff --git a/javaEE/day03/assets/1669382161813.png b/javaEE/day03/assets/1669382161813.png new file mode 100644 index 0000000..e6168bd Binary files /dev/null and b/javaEE/day03/assets/1669382161813.png differ diff --git a/javaEE/day03/assets/1669382952832.png b/javaEE/day03/assets/1669382952832.png new file mode 100644 index 0000000..8d73a14 Binary files /dev/null and b/javaEE/day03/assets/1669382952832.png differ diff --git a/javaEE/day03/assets/1669383450054.png b/javaEE/day03/assets/1669383450054.png new file mode 100644 index 0000000..4ff615e Binary files /dev/null and b/javaEE/day03/assets/1669383450054.png differ diff --git a/javaEE/day03/assets/1669383786402.png b/javaEE/day03/assets/1669383786402.png new file mode 100644 index 0000000..4ef0cef Binary files /dev/null and b/javaEE/day03/assets/1669383786402.png differ diff --git a/javaEE/day03/assets/1669384072912.png b/javaEE/day03/assets/1669384072912.png new file mode 100644 index 0000000..6a09da6 Binary files /dev/null and b/javaEE/day03/assets/1669384072912.png differ diff --git a/javaEE/day03/assets/1669384537662.png b/javaEE/day03/assets/1669384537662.png new file mode 100644 index 0000000..620d69d Binary files /dev/null and b/javaEE/day03/assets/1669384537662.png differ diff --git a/javaEE/day03/assets/1669384726550.png b/javaEE/day03/assets/1669384726550.png new file mode 100644 index 0000000..6130aa6 Binary files /dev/null and b/javaEE/day03/assets/1669384726550.png differ diff --git a/javaEE/day03/assets/1669385311576.png b/javaEE/day03/assets/1669385311576.png new file mode 100644 index 0000000..cbf773d Binary files /dev/null and b/javaEE/day03/assets/1669385311576.png differ diff --git a/javaEE/day03/assets/1669385425617.png b/javaEE/day03/assets/1669385425617.png new file mode 100644 index 0000000..4e89b79 Binary files /dev/null and b/javaEE/day03/assets/1669385425617.png differ diff --git a/javaEE/day03/assets/1669385446343.png b/javaEE/day03/assets/1669385446343.png new file mode 100644 index 0000000..521d158 Binary files /dev/null and b/javaEE/day03/assets/1669385446343.png differ diff --git a/javaEE/day03/assets/1669385782145.png b/javaEE/day03/assets/1669385782145.png new file mode 100644 index 0000000..e42b9cb Binary files /dev/null and b/javaEE/day03/assets/1669385782145.png differ diff --git a/javaEE/day03/assets/1669386198014.png b/javaEE/day03/assets/1669386198014.png new file mode 100644 index 0000000..02161e5 Binary files /dev/null and b/javaEE/day03/assets/1669386198014.png differ diff --git a/javaEE/day03/assets/1669386261570.png b/javaEE/day03/assets/1669386261570.png new file mode 100644 index 0000000..c22ba9f Binary files /dev/null and b/javaEE/day03/assets/1669386261570.png differ diff --git a/javaEE/day03/assets/1669387519004.png b/javaEE/day03/assets/1669387519004.png new file mode 100644 index 0000000..1431768 Binary files /dev/null and b/javaEE/day03/assets/1669387519004.png differ diff --git a/javaEE/day03/assets/1669388755027.png b/javaEE/day03/assets/1669388755027.png new file mode 100644 index 0000000..1457906 Binary files /dev/null and b/javaEE/day03/assets/1669388755027.png differ diff --git a/javaEE/day03/assets/1669389052906.png b/javaEE/day03/assets/1669389052906.png new file mode 100644 index 0000000..c2703e9 Binary files /dev/null and b/javaEE/day03/assets/1669389052906.png differ diff --git a/javaEE/day03/assets/1669389147027.png b/javaEE/day03/assets/1669389147027.png new file mode 100644 index 0000000..7d9d537 Binary files /dev/null and b/javaEE/day03/assets/1669389147027.png differ diff --git a/javaEE/day03/assets/1669389642057.png b/javaEE/day03/assets/1669389642057.png new file mode 100644 index 0000000..ca70e82 Binary files /dev/null and b/javaEE/day03/assets/1669389642057.png differ diff --git a/javaEE/day03/assets/1669389698827.png b/javaEE/day03/assets/1669389698827.png new file mode 100644 index 0000000..ca70e82 Binary files /dev/null and b/javaEE/day03/assets/1669389698827.png differ diff --git a/javaEE/day03/assets/1669389950696.png b/javaEE/day03/assets/1669389950696.png new file mode 100644 index 0000000..a21ce3c Binary files /dev/null and b/javaEE/day03/assets/1669389950696.png differ diff --git a/javaEE/day03/assets/1669390029156.png b/javaEE/day03/assets/1669390029156.png new file mode 100644 index 0000000..8dc82d4 Binary files /dev/null and b/javaEE/day03/assets/1669390029156.png differ diff --git a/javaEE/day03/assets/1669390177896.png b/javaEE/day03/assets/1669390177896.png new file mode 100644 index 0000000..668696c Binary files /dev/null and b/javaEE/day03/assets/1669390177896.png differ diff --git a/javaEE/day03/assets/1669390312206.png b/javaEE/day03/assets/1669390312206.png new file mode 100644 index 0000000..c0d767f Binary files /dev/null and b/javaEE/day03/assets/1669390312206.png differ diff --git a/javaEE/day03/assets/image-20250611100856538.png b/javaEE/day03/assets/image-20250611100856538.png new file mode 100644 index 0000000..8ed4448 Binary files /dev/null and b/javaEE/day03/assets/image-20250611100856538.png differ diff --git a/javaEE/day03/assets/image-20250612142043097.png b/javaEE/day03/assets/image-20250612142043097.png new file mode 100644 index 0000000..013a36a Binary files /dev/null and b/javaEE/day03/assets/image-20250612142043097.png differ diff --git a/javaEE/day03/day03_Vue_Element-inmind.md b/javaEE/day03/day03_Vue_Element-inmind.md new file mode 100644 index 0000000..504fc00 --- /dev/null +++ b/javaEE/day03/day03_Vue_Element-inmind.md @@ -0,0 +1,2822 @@ +# day03_Vue_Element +## 1 Ajax + +### 1.1 Ajax介绍 + +#### 1.1.1 Ajax概述 + +我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序,所以必须涉及到2个程序的交互,所以这就需要用到我们接下来学习的Ajax技术。 + +![1669103527446](assets/1669103527446.png) + +Ajax: 全称Asynchronous JavaScript And XML,异步的JavaScript和XML。其作用有如下2点: + +- 与服务器进行数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 +- 异步交互:可以在**不重新加载整个页面**的情况下,与服务器交换数据并**更新部分网页**的技术,如:搜索联想、用户名是否可用的校验等等。 + + + +#### 1.1.2 Ajax作用 + +我们详细的解释一下Ajax技术的2个作用 + +- 与服务器进行数据交互 + + 如下图所示前端资源被浏览器解析,但是前端页面上缺少数据,前端可以通过Ajax技术,向后台服务器发起请求,后台服务器接受到前端的请求,从数据库中获取前端需要的资源,然后响应给前端,前端在通过我们学习的vue技术,可以将数据展示到页面上,这样用户就能看到完整的页面了。此处可以对比JavaSE中的网络编程技术来理解。 + + ![1669104661340](assets/1669104661340.png) + +- 异步交互:可以在**不重新加载整个页面**的情况下,与服务器交换数据并**更新部分网页**的技术。 + + 如下图所示,当我们再百度搜索java时,下面的联想数据是通过Ajax请求从后台服务器得到的,在整个过程中,我们的Ajax请求不会导致整个百度页面的重新加载,并且只针对搜索栏这局部模块的数据进行了数据的更新,不会对整个页面的其他地方进行数据的更新,这样就大大提升了页面的加载速度,用户体验高。 + + ![1669105041533](assets/1669105041533.png) + + + +#### 1.1.3 同步异步 + +针对于上述Ajax的局部刷新功能是因为Ajax请求是异步的,与之对应的有同步请求。接下来我们介绍一下异步请求和同步请求的区别。 + +- 同步请求发送过程如下图所示: + + ![1669105385944](assets/1669105385944.png) + + 浏览器页面在发送请求给服务器,在服务器处理请求的过程中,浏览器页面不能做其他的操作。只能等到服务器响应结束后才能,浏览器页面才能继续做其他的操作。 + +- 异步请求发送过程如下图所示: + + ![1669105479350](assets/1669105479350.png) + + 浏览器页面发送请求给服务器,在服务器处理请求的过程中,浏览器页面还可以做其他的操作。 + + + +### 1.2 原生Ajax + +对于Ajax技术有了充分的认知了,我们接下来通过代码来演示Ajax的效果。此处我们先采用原生的Ajax代码来演示。因为Ajax请求是基于客户端发送请求,服务器响应数据的技术。所以为了完成快速入门案例,我们需要提供服服务器端和编写客户端。 + +- 服务器端 + + 因为我们暂时还没学过服务器端的代码,所以此处已经直接提供好了服务器端的请求地址,我们前端直接通过Ajax请求访问该地址即可。**后台服务器地址**:https://m1.apifoxmock.com/m2/5879707-5566323-default/296951177 + + 上述地址我们也可以直接通过浏览器来访问,访问结果如图所示:只截取部分数据 + + ![image-20250611100856538](assets/image-20250611100856538.png) + +- 客户端 + + 客户端的Ajax请求代码如下有如下4步,接下来我们跟着步骤一起操作一下。 + + 第一步:首先我们再VS Code中创建AJAX的文件夹,并且创建名为01. Ajax-原生方式.html的文件,提供如下代码,主要是按钮绑定单击事件,我们希望点击按钮,来发送ajax请求 + + ~~~html + + + + + + + 原生Ajax + + + + + +
+ + + + + ~~~ + + 第二步:创建XMLHttpRequest对象,用于和服务器交换数据,也是原生Ajax请求的核心对象,提供了各种方法。代码如下: + + ~~~js + //1. 创建XMLHttpRequest + var xmlHttpRequest = new XMLHttpRequest(); + ~~~ + + 第三步:调用对象的open()方法设置请求的参数信息,例如请求地址,请求方式。然后调用send()方法向服务器发送请求,代码如下: + + ~~~js + //2. 发送异步请求 + xmlHttpRequest.open('GET','https://m1.apifoxmock.com/m2/5879707-5566323-default/296951177'); + xmlHttpRequest.send();//发送请求 + ~~~ + + 第四步:我们通过绑定事件的方式,来获取服务器响应的数据。 + + ~~~js + //3. 获取服务响应数据 + xmlHttpRequest.onreadystatechange = function(){ + //此处判断 4表示浏览器已经完全接受到Ajax请求得到的响应, 200表示这是一个正确的Http请求,没有错误 + if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){ + document.getElementById('div1').innerHTML = xmlHttpRequest.responseText; + } + } + ~~~ + + + + 最后我们通过浏览器打开页面,请求点击按钮,发送Ajax请求,最终显示结果如下图所示: + + ![1669106705778](assets/1669106850383.png) + + 并且通过浏览器的f12抓包,我们点击网络中的XHR请求,发现可以抓包到我们发送的Ajax请求。XHR代表的就是异步请求 + + + +### 1.3 Axios + +上述原生的Ajax请求的代码编写起来还是比较繁琐的,所以接下来我们学习一门更加简单的发送Ajax请求的技术Axios 。Axios是对原生的AJAX进行封装,简化书写。Axios官网是:`https://axios-http.com/` + +#### 1.3.1 Axios的基本使用 + +Axios的使用比较简单,主要分为2步: + +- 引入Axios文件 + + ~~~html + + ~~~ + +- 使用Axios发送请求,并获取响应结果,官方提供的api很多,此处给出2种,如下 + + - 发送 get 请求 + + ~~~js + axios({ + method:"get", + url:"http://localhost:8080/ajax-demo1/aJAXDemo1?username=zhangsan" + }).then(function (resp){ + alert(resp.data); + }) + ~~~ + + - 发送 post 请求 + + ```js + axios({ + method:"post", + url:"http://localhost:8080/ajax-demo1/aJAXDemo1", + data:"username=zhangsan" + }).then(function (resp){ + alert(resp.data); + }); + ``` + + axios()是用来发送异步请求的,小括号中使用 js的JSON对象传递请求相关的参数: + + - method属性:用来设置请求方式的。取值为 get 或者 post。 + - url属性:用来书写请求的资源路径。如果是 get 请求,需要将请求参数拼接到路径的后面,格式为: url?参数名=参数值&参数名2=参数值2。 + - data属性:作为请求体被发送的数据。也就是说如果是 post 请求的话,数据需要作为 data 属性的值。 + + then() 需要传递一个匿名函数。我们将 then()中传递的匿名函数称为 **回调函数**,意思是该匿名函数在发送请求时不会被调用,而是在成功响应后调用的函数。而该回调函数中的 resp 参数是对响应的数据进行封装的对象,通过 resp.data 可以获取到响应的数据。 + + + +#### 1.3.2 Axios快速入门 + +- 后端实现 + + 查询所有员工信息服务器地址:https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597 + + 根据员工id删除员工信息服务器地址:https://m1.apifoxmock.com/m2/5879707-5566323-default/296960718 + +- 前端实现 + + 首先在VS Code中创建js文件夹,与html同级,然后将**资料/axios-0.18.0.js** 文件拷贝到js目录下,然后创建名为02. Ajax-Axios.html的文件,工程结果如图所示: + + ![1669108792555](assets/1669108792555.png) + + + + 然后在html中引入axios所依赖的js文件,并且提供2个按钮,绑定单击事件,分别用于点击时发送ajax请求,完整代码如下: + + ~~~html + + + + + + + Ajax-Axios + + + + + + + + + + + + ~~~ + + 然后分别使用Axios的方法,完整get请求和post请求的发送 + + get请求代码如下: + + ~~~js + //通过axios发送异步请求-get + axios({ + method: "get", + url: "https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597" + }).then(result => { + console.log(result.data); + }) + ~~~ + + post请求代码如下: + + ~~~js + //通过axios发送异步请求-post + axios({ + method: "post", + url: "https://m1.apifoxmock.com/m2/5879707-5566323-default/296960718", + data: "id=1" + }).then(result => { + console.log(result.data); + }) + ~~~ + + 浏览器打开,f12抓包,然后分别点击2个按钮,查看控制台效果如下: + + ![1669109382408](assets/1669109382408.png) + + + + 完整代码如下: + + ~~~html + + + + + + + Ajax-Axios + + + + + + + + + + + + ~~~ + + + +#### 1.3.3 请求方法的别名 + +Axios还针对不同的请求,提供了别名方式的api,具体如下: + +| 方法 | 描述 | +| ---------------------------------- | -------------- | +| axios.get(url [, config]) | 发送get请求 | +| axios.delete(url [, config]) | 发送delete请求 | +| axios.post(url [, data[, config]]) | 发送post请求 | +| axios.put(url [, data[, config]]) | 发送put请求 | + +我们目前只关注get和post请求,所以在上述的入门案例中,我们可以将get请求代码改写成如下: + +~~~js +axios.get("https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597").then(result => { + console.log(result.data); +}) +~~~ + +post请求改写成如下: + +~~~js +axios.post("https://m1.apifoxmock.com/m2/5879707-5566323-default/296960718","id=1").then(result => { + console.log(result.data); +}) +~~~ + + + +#### 1.3.4 案例 + +- 需求:基于Vue及Axios完成数据的动态加载展示,如下图所示 + + ![1669139756551](assets/1669139756551.png) + + 其中数据是来自于后台程序的,地址是:https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597 + + + +- 分析: + + 前端首先是一张表格,我们缺少数据,而提供数据的地址已经有了,所以意味这我们需要使用Ajax请求获取后台的数据。但是Ajax请求什么时候发送呢?页面的数据应该是页面加载完成,自动发送请求,展示数据,所以我们需要借助vue的mounted钩子函数。那么拿到数据了,我们该怎么将数据显示表格中呢?这里就得借助v-for指令来遍历数据,展示数据。 + +- 步骤: + + 1. 首先创建文件,提前准备基础代码,包括表格以及vue.js和axios.js文件的引入 + 2. 我们需要在vue的mounted钩子函数中发送ajax请求,获取数据 + 3. 拿到数据,数据需要绑定给vue的data属性 + 4. 在<tr>标签上通过v-for指令遍历数据,展示数据 + +- 代码实现: + + 1. 首先创建文件,提前准备基础代码,包括表格以及vue.js和axios.js文件的引入 + + ![1669140682300](assets/1669140682300.png) + + 提供初始代码如下: + + ~~~html + + + + + + + Ajax-Axios-案例 + + + + +
+ + + + + + + + + + + + + + + + + + + + +
编号姓名图像性别职位入职日期最后操作时间
1Tom + + + + + 班主任2009-08-092009-08-09 12:00:00
+
+ + + + ~~~ + + 2. 在vue的mounted钩子函数,编写Ajax请求,请求数据,代码如下: + + ~~~js + mounted () { + //发送异步请求,加载数据 + axios.get("https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597").then(result => { + + }) + } + ~~~ + + 3. ajax请求的数据我们应该绑定给vue的data属性,之后才能进行数据绑定到视图;并且浏览器打开后台地址,数据返回格式如下图所示: + + ![1669141982809](assets/1669141982809.png) + + 因为服务器响应的json中的data属性才是我们需要展示的信息,所以我们应该将员工列表信息赋值给vue的data属性,代码如下: + + ~~~js + //发送异步请求,加载数据 + axios.get("https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597").then(result => { + this.emps = result.data.data; + }) + ~~~ + + 其中,data中生命emps变量,代码如下: + + ~~~js + data: { + emps:[] + }, + ~~~ + + 4. 在<tr>标签上通过v-for指令遍历数据,展示数据,其中需要注意的是图片的值,需要使用vue的属性绑定,男女的展示需要使用条件判断,其代码如下: + + ~~~html + + {{index + 1}} + {{emp.name}} + + + + + + + + {{emp.job}} + {{emp.entrydate}} + {{emp.updatetime}} + + ~~~ + +完整代码如下: + +~~~html + + + + + + + Ajax-Axios-案例 + + + + +
+ + + + + + + + + + + + + + + + + + + + +
编号姓名图像性别职位入职日期最后操作时间
{{index + 1}}{{emp.name}} + + + + + {{emp.job}}{{emp.entrydate}}{{emp.updatetime}}
+
+ + + +~~~ + + + +## 2 前后台分离开发 + +在之前的课程中,我们介绍过,前端开发有2种方式:**前后台混合开发**和**前后台分离开发**。 + +前后台混合开发,顾名思义就是前台后台代码混在一起开发,如下图所示: + +![1669142636044](assets/1669142636044.png) + +这种开发模式有如下缺点: + +- 沟通成本高:后台人员发现前端有问题,需要找前端人员修改,前端修改成功,再交给后台人员使用 +- 分工不明确:后台开发人员需要开发后台代码,也需要开发部分前端代码。很难培养专业人才 +- 不便管理:所有的代码都在一个工程中 +- 不便维护和扩展:前端代码更新,和后台无关,但是需要整个工程包括后台一起重新打包部署。 + + + +所以我们目前基本都是采用的前后台分离开发方式,如下图所示: + +![1669143264499](assets/1669143264499.png) + +我们将原先的工程分为前端工程和后端工程这2个工程,然后前端工程交给专业的前端人员开发,后端工程交给专业的后端人员开发。前端页面需要数据,可以通过发送异步请求,从后台工程获取。但是,我们前后台是分开来开发的,那么前端人员怎么知道后台返回数据的格式呢?后端人员开发,怎么知道前端人员需要的数据格式呢?所以针对这个问题,我们前后台统一指定一套规范!我们前后台开发人员都需要遵循这套规范开发,这就是我们的**接口文档**。接口文档有离线版和在线版本,接口文档示可以查询今天提供**资料/接口文档示例**里面的资料。那么接口文档的内容怎么来的呢?是我们后台开发者根据产品经理提供的产品原型和需求文档所撰写出来的,产品原型示例可以参考今天提供**资料/页面原型**里面的资料。 + +那么基于前后台分离开发的模式下,我们后台开发者开发一个功能的具体流程如何呢?如下图所示: + +![1669143781533](assets/1669143781533.png) + +1. 需求分析:首先我们需要阅读需求文档,分析需求,理解需求。 +2. 接口定义:查询接口文档中关于需求的接口的定义,包括地址,参数,响应数据类型等等 +3. 前后台并行开发:各自按照接口文档进行开发,实现需求 +4. 测试:前后台开发完了,各自按照接口文档进行测试 +5. 前后段联调测试:前段工程请求后端工程,测试功能 + + + + + +## 3 前端工程化 + +### 3.1 前端工程化介绍 + +我们目前的前端开发中,当我们需要使用一些资源时,例如:vue.js,和axios.js文件,都是直接再工程中导入的,如下图所示: + +![1669291953746](assets/1669291953746.png) + +但是上述开发模式存在如下问题: + +- 每次开发都是从零开始,比较麻烦 +- 多个页面中的组件共用性不好 +- js、图片等资源没有规范化的存储目录,没有统一的标准,不方便维护 + + + +所以现在企业开发中更加讲究前端工程化方式的开发,主要包括如下4个特点 + +- 模块化:将js和css等,做成一个个可复用模块 +- 组件化:我们将UI组件,css样式,js行为封装成一个个的组件,便于管理 +- 规范化:我们提供一套标准的规范的目录接口和编码规范,所有开发人员遵循这套规范 +- 自动化:项目的构建,测试,部署全部都是自动完成 + +所以对于前端工程化,说白了,就是在企业级的前端项目开发中,把前端开发所需要的工具、技术、流程、经验进行规范化和标准化。从而提升开发效率,降低开发难度等等。接下来我们就需要学习vue的官方提供的脚手架帮我们完成前端的工程化。 + + + +### 3.2 前端工程化入门 + +#### 3.2.1 环境准备 + +我们的前端工程化是通过vue官方提供的脚手架Vue-cli来完成的,用于快速的生成一个Vue的项目模板。Vue-cli主要提供了如下功能: + +- 统一的目录结构 +- 本地调试 +- 热部署 +- 单元测试 +- 集成打包上线 + +我们需要运行Vue-cli,需要依赖NodeJS,NodeJS是前端工程化依赖的环境。所以我们需要先安装NodeJS,然后才能安装Vue-cli + +- NodeJS安装和Vue-cli安装 + + 详细安装步骤,请参考**资料/NodeJS安装文档/NodeJS安装文档.md**文件 + + ![1669293955527](assets/1669293955527.png) + + + + + +#### 3.2.2 Vue项目简介 + +环境准备好了,接下来我们需要通过Vue-cli创建一个vue项目,然后再学习一下vue项目的目录结构。Vue-cli提供了如下2种方式创建vue项目: + +- 命令行:直接通过命令行方式创建vue项目 + + ~~~ + vue create vue-project01 + ~~~ + + + +- 图形化界面:通过命令先进入到图形化界面,然后再进行vue工程的创建 + + ~~~ + vue ui + ~~~ + + 图形化界面如下: + + ![1669294586147](assets/1669294586147.png) + + + +##### 3.2.2.1 创建vue项目 + +此处我们通过第二种图形化界面方式给大家演示。 + +首先,我们再桌面创建vue文件夹,然后双击进入文件夹,来到地址目录,输入cmd,然后进入到vue文件夹的cmd窗口界面,如下图所示: + +![1669294790640](assets/1669294790640.png) + +然后进入如下界面: + +![1669294846601](assets/1669294846601.png) + +然后再当前目录下,直接输入命令`vue ui`进入到vue的图形化界面,如下图所示: + +![1669294939067](assets/1669294939067.png) + +然后我门选择创建按钮,在vue文件夹下创建项目,如下图所示: + +![1669295020228](assets/1669295020228.png) + +然后来到如下界面,进行vue项目的创建 + +![1669301661722](assets/1669301661722.png) + +然后预设模板选择手动,如下图所示: + + ![1669301737491](assets/1669301737491.png) + +然后再功能页面开启路由功能,如下图所示: + +![1669301859936](assets/1669301859936.png) + +然后再配置页面选择语言版本和语法检查规范,如下图所示: + +![1669301965095](assets/1669301965095.png) + +然后创建项目,进入如下界面: + +![1669302091090](assets/1669302091090.png) + +最后我们只需要等待片刻,即可进入到创建创建成功的界面,如下图所示: + +![1669302171975](assets/1669302171975.png) + + 到此,vue项目创建结束 + + + +##### 3.2.2.2 vue项目目录结构介绍 + +我们通过VS Code打开之前创建的vue文件夹,打开之后,呈现如下图所示页面: + +![1669302718419](assets/1669302718419.png) + +vue项目的标准目录结构以及目录对应的解释如下图所示: + +![1669302973198](assets/1669302973198.png) + +其中我们平时开发代码就是在**src目录**下 + + + +##### 3.2.2.3 运行vue项目 + +那么vue项目开发好了,我们应该怎么运行vue项目呢?主要提供了2种方式 + +- 第一种方式:通过VS Code提供的图形化界面 ,如下图所示:(注意:NPM脚本窗口默认不显示,可以参考本节的最后调试出来) + + ![1669303687468](assets/1669303687468.png) + + 点击之后,我们等待片刻,即可运行,在终端界面中,我们发现项目是运行在本地服务的8080端口,我们直接通过浏览器打开地址 + + ![1669303846100](assets/1669303846100.png) + + 最终浏览器打开后,呈现如下界面,表示项目运行成功 + + ![1669304009602](assets/1669304009602.png) + + 其实此时访问的是 **src/App.vue**这个根组件,此时我们打开这个组件,修改代码:添加内容Vue + + ![1669304267724](assets/1669304267724.png) + + 只要我们保存更新的代码,我们直接打开浏览器,不需要做任何刷新,发现页面呈现内容发生了变化,如下图所示: + + ![1669304385826](assets/1669304385826.png) + + 这就是我们vue项目的热更新功能 + + 对于8080端口,经常被占用,所以我们可以去修改默认的8080端口。我们修改vue.config.js文件的内容,添加如下代码: + + ~~~json + devServer:{ + port:7000 + } + ~~~ + + 如下图所示,然后我们关闭服务器,并且重新启动, + + ![1669305444633](assets/1669305444633.png) + +​ 重新启动如下图所示: + +​ ![1669305570022](assets/1669305570022.png) + +​ 端口更改成功,可以通过浏览器访问7000端口来访问我们之前的项目 + +- 第二种方式:命令行方式 + + 直接基于cmd命令窗口,在vue目录下,执行输入命令`npm run serve`即可,如下图所示: + + ![1669304694076](assets/1669304694076.png) + + + +补充:NPM脚本窗口调试出来 + +第一步:通过**设置/用户设置/扩展/MPM**更改NPM默认配置,如下图所示 + +![1669304930336](assets/1669304930336.png) + +然后重启VS Code,并且**双击打开package.json文件**,然后点击**资源管理器处的3个小点**,**勾选npm脚本选项**,如图所示 + +![1669305068434](assets/1669305068434.png) + +然后就能都显示NPM脚本小窗口了。 + + + +#### 3.2.3 Vue项目开发流程 + +那么我们访问的首页是index.html,但是我们找到public/index.html文件,打开之后发现,里面没有什么代码,但是能够呈现内容丰富的首页:如下图所示: + +![1669308098856](assets/1669308098856.png) + +我们自习观察发现,index.html的代码很简洁,但是浏览器所呈现的index.html内容却很丰富,代码和内容不匹配,所以vue是如何做到的呢?接下来我们学习一下vue项目的开发流程。 + +对于vue项目,index.html文件默认是引入了入口函数main.js文件,我们找到**src/main.js**文件,其代码如下: + +~~~js +import Vue from 'vue' +import App from './App.vue' +import router from './router' + +Vue.config.productionTip = false + +new Vue({ + router, + render: h => h(App) +}).$mount('#app') + +~~~ + +上述代码中,包括如下几个关键点: + +- import: 导入指定文件,并且重新起名。例如上述代码`import App from './App.vue'`导入当前目录下得App.vue并且起名为App +- new Vue(): 创建vue对象 +- $mount('#app');将vue对象创建的dom对象挂在到id=app的这个标签区域中,作用和之前学习的vue对象的le属性一致。 +- router: 路由,详细在后面的小节讲解 +- render: 主要使用视图的渲染的。 + + + +来到**public/index.html**中,我们**删除div的id=app属性**,打开浏览器,发现之前访问的首页一片空白,如下图所示,这样就证明了,我们main.js中通过代码挂在到index.html的id=app的标签区域的。 + + + +此时我们知道了vue创建的dom对象挂在到id=app的标签区域,但是我们还是没有解决最开始的问题:首页内容如何呈现的?这就涉及到render中的App了,如下图所示: + +![1669313364004](assets/1669313364004.png) + +那么这个App对象怎么回事呢,我们打开App.vue,注意的是.vue结尾的都是vue组件。而vue的组件文件包含3个部分: + +- template: 模板部分,主要是HTML代码,用来展示页面主体结构的 +- script: js代码区域,主要是通过js代码来控制模板的数据来源和行为的 +- style: css样式部分,主要通过css样式控制模板的页面效果得 + +如下图所示就是一个vue组件的小案例: + +![1669313699186](assets/1669313699186.png) + + + +此时我们可以打开App.vue,观察App.vue的代码,其中可以发现,App.vue组件的template部分内容,和我们浏览器访问的首页内容是一致的,如下图所示: + +![1669313894258](assets/1669313894258.png) + +接下来我们可以简化模板部分内容,添加script部分的数据模型,删除css样式,完整代码如下: + +~~~html + + + + +~~~ + + + +保存直接,回到浏览器,我们发现首页展示效果发生了变化,如下图所示: + +![1669314115641](assets/1669314115641.png) + + + +## 4 Vue组件库Element + +### 4.1 Element介绍 + +不知道同学们还否记得我们之前讲解的前端开发模式MVVM,我们之前学习的vue是侧重于VM开发的,主要用于数据绑定到视图的,那么接下来我们学习的ElementUI就是一款侧重于V开发的前端框架,主要用于开发美观的页面的。 + +Element:是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页。 + +Element 提供了很多组件(组成网页的部件)供我们使用。例如 超链接、按钮、图片、表格等等。如下图所示就是我们开发的页面和ElementUI提供的效果对比:可以发现ElementUI提供的各式各样好看的按钮 + +![1669357961971](assets/1669357961971.png) + +ElementUI的学习方式和我们之前的学习方式不太一样,对于ElementUI,我们作为一个后台开发者,只需要**学会如何从ElementUI的官网拷贝组件到我们自己的页面中,并且做一些修改即可**。其官网地址:https://element.eleme.cn/#/zh-CN,我们主要学习的是ElementUI中提供的常用组件,至于其他组件同学们可以通过我们这几个组件的学习掌握到ElementUI的学习技巧,然后课后自行学习。 + + + +### 4.2 快速入门 + +首先我们要掌握ElementUI的快速入门,接下来同学们就一起跟着步骤来操作一下。 + +首先,我们先要安装ElementUI的组件库,打开VS Code,停止之前的项目,然后在命令行输入如下命令: + +~~~ +npm install element-ui@2.15.3 +~~~ + +具体操作如下图所示: + +![1669358653297](assets/1669358653297.png) + +然后我们需要在main.js这个入口js文件中引入ElementUI的组件库,其代码如下: + +~~~js +import ElementUI from 'element-ui'; +import 'element-ui/lib/theme-chalk/index.css'; + +Vue.use(ElementUI); +~~~ + +具体操作如图所示: + +![1669358935188](assets/1669358935188.png) + +然后我们需要按照vue项目的开发规范,在**src/views**目录下创建一个vue组件文件,注意组件名称后缀是.vue,并且在组件文件中编写之前介绍过的基本组件语法,代码如下: + +~~~html + + + + + +~~~ + +具体操作如图所示: + +![1669359450896](assets/1669359450896.png) + +最后我们只需要去ElementUI的官网,找到组件库,然后找到按钮组件,抄写代码即可,具体操作如下图所示: + +![1669359839574](assets/1669359839574.png) + +然后找到按钮的代码,如下图所示: + +![1669359904272](assets/1669359904272.png) + + + +紧接着我们复制组件代码到我们的vue组件文件中,操作如下图所示: + +![1669360120385](assets/1669360120385.png) + +最后,我们需要在默认访问的根组件**src/App.vue**中引入我们自定义的组件,具体操作步骤如下: + +![1669360320983](assets/1669360320983.png) + +然后App.vue组件中的具体代码如下,**代码是我们通过上述步骤引入element-view组件时自动生成的**。 + +~~~html + + + + + +~~~ + +然后运行我们的vue项目,浏览器直接访问之前的7000端口,展示效果如下图所示: + +![1669360502407](assets/1669360502407.png) + +到此,我们ElementUI的入门程序编写成功 + + + +### 4.3 Element组件 + +接下来我们来学习一下ElementUI的常用组件,对于组件的学习比较简单,我们只需要参考官方提供的代码,然后复制粘贴即可。 + +#### 4.3.1 Table表格 + +##### 4.3.1.1 组件演示 + +Table 表格:用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。 + +接下来我们通过代码来演示。 + +首先我们需要来到ElementUI的组件库中,找到表格组件,如下图所示: + +![1669361564197](assets/1669361564197.png) + + + +然后复制代码到我们之前的ElementVue.vue组件中,需要注意的是,我们组件包括了3个部分,如果官方有除了template部分之外的style和script都需要复制。具体操作如下图所示: + +template模板部分: + +![1669362225501](assets/1669362225501.png) + +script脚本部分 + +![1669362382846](assets/1669362382846.png) + +ElementView.vue组件文件整体代码如下: + +~~~html + + + + + + +~~~ + +此时回到浏览器,我们页面呈现如下效果: + +![1669362451236](assets/1669362451236.png) + + + +##### 4.3.1.2 组件属性详解 + +那么我们的ElementUI是如何将数据模型绑定到视图的呢?主要通过如下几个属性: + +- data: 主要定义table组件的数据模型 +- prop: 定义列的数据应该绑定data中定义的具体的数据模型 +- label: 定义列的标题 +- width: 定义列的宽度 + +其具体示例含义如下图所示: + +![1669363098610](assets/1669363098610.png) + +**PS:Element组件的所有属性都可以在组件页面的最下方找到**,如下图所示: + +![1669363190361](assets/1669363190361.png) + + + +#### 4.3.2 Pagination分页 + +##### 4.3.2.1 组件演示 + +Pagination: 分页组件,主要提供分页工具条相关功能。其展示效果图下图所示: + +![1669363631302](assets/1669363631302.png) + +接下来我们通过代码来演示功能。 + +首先在官网找到分页组件,我们选择带背景色分页组件,如下图所示: + +![1669363746409](assets/1669363746409.png) + + + +然后复制代码到我们的ElementView.vue组件文件的template中,拷贝如下代码: + +~~~html + + +~~~ + +浏览器打开呈现如下效果: + +![1669363921750](assets/1669363921750.png) + + + +##### 4.3.2.2 组件属性详解 + +对于分页组件我们需要关注的是如下几个重要属性(可以通过查阅官网组件中最下面的组件属性详细说明得到): + +- background: 添加北京颜色,也就是上图蓝色背景色效果。 +- layout: 分页工具条的布局,其具体值包含`sizes`, `prev`, `pager`, `next`, `jumper`, `->`, `total`, `slot` 这些值 +- total: 数据的总数量 + + + +然后根据官方分页组件提供的layout属性说明,如下图所示: + +![1669364288179](assets/1669364288179.png) + +我们修改layout属性如下: + +~~~js + layout="sizes,prev, pager, next,jumper,total" +~~~ + +浏览器打开呈现如下效果: + +![1669364403079](assets/1669364403079.png) + +发现在原来的功能上,添加了一些额外的功能,其具体对应关系如下图所示: + +![1669364533849](assets/1669364533849.png) + + + +##### 4.3.2.3 组件事件详解 + +对于分页组件,除了上述几个属性,还有2个非常重要的事件我们需要去学习: + +- size-change : pageSize 改变时会触发 +- current-change :currentPage 改变时会触发 + +其官方详细解释含义如下图所示: + +![1669364990991](assets/1669364990991.png) + +对于这2个事件的参考代码,我们同样可以通过官方提供的完整案例中找到,如下图所示: + +![1669365117644](assets/1669365117644.png) + + + +然后我们找到对应的代码,首先复制事件,复制代码如下: + +~~~js +@size-change="handleSizeChange" +@current-change="handleCurrentChange" +~~~ + +此时Panigation组件的template完整代码如下: + +~~~html + + + +~~~ + + + +紧接着需要复制事件需要的2个函数,需要注意methods属性和data同级,其代码如下: + +~~~json +methods: { + handleSizeChange(val) { + console.log(`每页 ${val} 条`); + }, + handleCurrentChange(val) { + console.log(`当前页: ${val}`); + } + }, +~~~ + +此时Panigation组件的script部分完整代码如下: + +~~~html + +~~~ + +回到浏览器中,我们f12打开开发者控制台,然后切换当前页码和切换每页显示的数量,呈现如下效果: + +![1669365585379](assets/1669365585379.png) + + + +#### 4.3.3 Dialog对话框 + +##### 4.3.3.1 组件演示 + +Dialog: 在保留当前页面状态的情况下,告知用户并承载相关操作。其企业开发应用场景示例如下图所示: + +![1669365791037](assets/1669365791037.png) + +首先我们需要在ElementUI官方找到Dialog组件,如下图所示: + +![1669365950945](assets/1669365950945.png) + + + +然后复制如下代码到我们的组件文件的template模块中 + +~~~html +

+ + +打开嵌套表格的 Dialog + + + + + + + + +~~~ + + + +并且复制数据模型script模块中: + +~~~ + gridData: [{ + date: '2016-05-02', + name: '王小虎', + address: '上海市普陀区金沙江路 1518 弄' + }, { + date: '2016-05-04', + name: '王小虎', + address: '上海市普陀区金沙江路 1518 弄' + }, { + date: '2016-05-01', + name: '王小虎', + address: '上海市普陀区金沙江路 1518 弄' + }, { + date: '2016-05-03', + name: '王小虎', + address: '上海市普陀区金沙江路 1518 弄' + }], + dialogTableVisible: false, +~~~ + +其完整的script部分代码如下: + +~~~html + +~~~ + +然后我们打开浏览器,点击按钮,呈现如下效果: + +![1669366365778](assets/1669366365778.png) + + + +##### 4.3.3.2 组件属性详解 + +那么ElementUI是如何做到对话框的显示与隐藏的呢?是通过如下的属性: + +- visible.sync :是否显示 Dialog + +具体释意如下图所示: + +![1669366903107](assets/1669366903107.png) + +visible属性绑定的dialogTableVisble属性一开始默认是false,所以对话框隐藏;然后我们点击按钮,触发事件,修改属性值为true, + +然后对话框visible属性值为true,所以对话框呈现出来。 + + + +#### 4.3.4 Form表单 + +##### 4.3.4.1 组件演示 + +Form 表单:由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据。 + +表单在我们前端的开发中使用的还是比较多的,接下来我们学习这个组件,与之前的流程一样,我们首先需要在ElementUI的官方找到对应的组件示例:如下图所示: + +![1669369751014](assets/1669369751014.png) + +我们的需求效果是:在对话框中呈现表单内容,类似如下图所示: + +![1669365791037](assets/1669365791037.png) + +所以,首先我们先要根据上一小结所学习的内容,制作一个新的对话框,其代码如下: + +~~~html +

+ +打开嵌套Form的 Dialog + + + + +~~~ + +还需要注意的是,针对这个新的对话框,我们需要在data中声明新的变量dialogFormVisible来控制对话框的隐藏与显示,代码如下: + +~~~ + dialogFormVisible: false, +~~~ + +打开浏览器,此时呈现如图所示的效果: + +![1669370230214](assets/1669370230214.png) + + + +然后我们**复制官网提供的template部分代码到我们的vue组件文件的Dialog组件中**,但是,此处官方提供的表单项标签太多,所以我们只需要保留前面3个表单项组件,其他多余的删除,所以最终template部分代码如下: + +~~~html + + + + + + + + + + + + + + + + + - + + + + + + + 立即创建 + 取消 + + + +~~~ + +观察上述代码,我们发现其中表单项标签使用了v-model双向绑定,所以我们需要在vue的数据模型中声明变量,同样可以从官方提供的代码中复制粘贴,但是我们需要去掉我们不需要的属性,通过观察上述代码,我们发现双向绑定的属性有4个,分别是form.name,form.region,form.date1,form.date2,所以最终数据模型如下: + +![1669371003680](assets/1669371003680.png) + +~~~ + form: { + name: '', + region: '', + date1: '', + date2:'' + }, +~~~ + +同样,官方的代码中,在script部分中,还提供了onSubmit函数,表单的立即创建按钮绑定了此函数,我们可以输入表单的内容,而表单的内容是双向绑定到form对象的,所以我们修改官方的onSubmit函数如下即可,而且我们还需要关闭对话框,最终函数代码如下: + +![1669371163913](assets/1669371163913.png) + + + +~~~ + onSubmit() { + console.log(this.form); //输出表单内容到控制台 + this.dialogFormVisible=false; //关闭表案例的对话框 + } +~~~ + +然后打开浏览器,我们打开对话框,并且输入表单内容,点击立即创建按钮,呈现如下效果; + +![1669371448683](assets/1669371448683.png) + + + +最终vue组件完整代码如下,同学们可以针对form表单案例,参考该案例对应的template部分和script部分代码 + +~~~html + + + + + + +~~~ + + + + + +### 4.4 案例 + +#### 4.4.1 案例需求 + +参考 **资料/页面原型/tlias智能学习辅助系统/首页.html** 文件,浏览器打开,点击页面中的左侧栏的员工管理,如下所示: + +![1669373199181](assets/1669373199181.png) + +需求说明: + +1. 制作类似格式的页面 + + 即上面是标题,左侧栏是导航,右侧是数据展示区域 + +2. 右侧需要展示搜索表单 + +3. 右侧表格数据是动态展示的,数据来自于后台 + +4. 实际示例效果如下图所示: + + ![1669373639681](assets/1669373639681.png) + + + + + +数据Mock地址:https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597,浏览器打开,数据格式如下图所示: + +![image-20250612142043097](assets/image-20250612142043097.png) + +通过观察数据,我们发现返回的json数据的data属性中,才是返回的人员列表信息 + + + +#### 4.4.2 案例分析 + +整个案例相对来说功能比较复杂,需求较多,所以我们需要先整体,后局部细节。整个页面我们可以分为3个部分,如下图所示: + +![1669374858620](assets/1669374858620.png) + +一旦这样拆分,那么我们的思路就清晰了,主要步骤如下: + +1. 创建页面,完成页面的整体布局规划 +2. 然后分别针对3个部分进行各自组件的具体实现 +3. 针对于右侧核心内容展示区域,需要使用异步加载数据,以表格渲染数据 + +#### 4.4.3 代码实现 + +##### 4.4.3.1 环境搭建 + +首先我们来到VS Code中,在views目录下创建 tlias/EmpView.vue这个vue组件,并且编写组件的基本模板代码,其效果如下图所示:其中模板代码在之前的案例中已经提供,此处不再赘述 + +![1669375414710](assets/1669375414710.png) + +并且需要注意的是,我们默认访问的是App.vue这个组件,而我们App.vue这个组件之前是引入了element-view这个组件,此时我们需要修改成引入emp-view这个组件,并且注释掉之前的element-view这个组件,此时App.vue整体代码如下: + +~~~html + + + + + +~~~ + +打开浏览器,我们发现之前的element案例内容没了,从而呈现的是一片空白,那么接下来我们就可以继续开发了。 + + + +##### 4.4.3.2 整体布局 + +此处肯定不需要我们自己去布局的,我们直接来到ElementUI的官网,找到布局组件,如下图所示: + +![1669376226430](assets/1669376226430.png) + +从官网提供的示例,我们发现由现成的满足我们需求的布局,所以我们只需要做一位代码搬运工即可。拷贝官方提供的如下代码直接粘贴到我们EmpView.vue组件的template模块中即可: + +~~~html + + Header + + Aside + Main + + +~~~ + +打开浏览器,此时呈现如下效果: + +![1669376527001](assets/1669376527001.png) + +因为我们没有拷贝官方提供的css样式,所以和官方案例的效果不太一样,但是我们需要的布局格式已经有,具体内容我们有自己的安排。首先我们需要调整整体布局的高度,所以我们需要在<el-container>上添加一些样式,代码如下: + +~~~html + + +~~~ + +到此我们布局功能就完成了 + +##### 4.4.3.3 顶部标题 + +对于顶部,我们需要实现的效果如下图所示: + +![1669376996028](assets/1669376996028.png) + +所以我们需要修改顶部的文本内容,并且提供背景色的css样式,具体代码如下: + +~~~html +tlias 智能学习辅助系统 +~~~ + +此时浏览器打开,呈现效果如下图所示: + +![1669377134623](assets/1669377134623.png) + +至此,我们的顶部标题就搞定了 + +此时整体代码如下: + +~~~html + + + + + + +~~~ + + + +##### 4.4.3.4 左侧导航栏 + +接下来我们来实现左侧导航栏,那么还是在上述布局组件中提供的案例,找到左侧栏的案例,如下图所示: + +![1669377371518](assets/1669377371518.png) + +所以我们依然只需要搬运代码,然后做简单修改即可。官方提供的导航太多,我们不需要,所以我们需要做删减,在我们的左侧导航栏中粘贴如下代码即可: + +~~~html + + + + + 选项1 + 选项2 + + + + +~~~ + +删减前后对比图: + +![1669377954508](assets/1669377954508.png) + +然后我们打开浏览器,展示如下内容: + +![1669378005930](assets/1669378005930.png) + +最后我们只需要替换文字内容即可。 + +此时整体代码如下: + +~~~html + + + + + + +~~~ + + + +##### 4.4.3.5 右侧核心内容 + +###### 4.4.3.5.1 表格编写 + +右侧显示的是表单和表格,首先我们先来完成表格的制作,我们同样在官方直接找表格组件,也可以直接通过我们上述容器组件中提供的案例中找到表格相关的案例,如下图所示: + +![1669378360527](assets/1669378360527.png) + +然后找到表格的代码,复制到我们布局容器的主题区域,template模块代码如下: + +~~~html + + + + + + + + +~~~ + +表格是有数据模型的绑定的,所以我们需要继续拷贝数据模型,代码如下: + +~~~js + data() { + return { + tableData: [ + { + date: '2016-05-02', + name: '王小虎', + address: '上海市普陀区金沙江路 1518 弄' + } + ] + } +~~~ + +浏览器打开,呈现如下效果: + +![1669378670102](assets/1669378670102.png) + +但是这样的表格和数据并不是我们所需要的,所以,接下来我们需要修改表格,添加列,并且修改列名。代码如下: + +~~~html + + + + + + + + 编辑 + 删除 + +~~~ + +需要注意的是,我们列名的prop属性值得内容并不是乱写的,因为我们将来需要绑定后台的数据的,所以如下图所示: + +![1669379153961](assets/1669379153961.png) + +并且此时我们data中之前的数据模型就不可用了,所以需要清空数据,设置为空数组,代码 如下: + +~~~js + data() { + return { + tableData: [ + + ] + } + } +~~~ + +此时打开浏览器,呈现如下效果: + +![1669379291238](assets/1669379291238.png) + +此时整体页面代码如下: + +~~~html + + + + + + +~~~ + + + +###### 4.4.3.5.2 表单编写 + +在表格的上方,还需要如下图所示的表单: + +![1669380411564](assets/1669380411564.png) + +所以接下来我们需要去ElementUI官网,在表单组件中找到与之类似的示例,加以修改从而打成我们希望的效果,官方示例如下图所示: + +![1669380607025](assets/1669380607025.png) + +所以我们直接拷贝代码主体区域的table组件的上方即可,并且我们需要修改数据绑定的的变量名,最终代码如下: + +~~~html + + + + + + + + + + + + + 查询 + + +~~~ + + + +代码修改前后对比图: + +![1669381155917](assets/1669381155917.png) + +既然我们表单使用v-model进行数据的双向绑定了,所以我们紧接着需要在data中定义searchForm的数据模型,代码如下: + +~~~js + data() { + return { + tableData: [ + + ], + searchForm:{ + name:'', + gender:'' + } + } + } +~~~ + +而且,表单的提交按钮,绑定了onSubmit函数,所以我们还需要在methods中定义onSubmit函数,代码如下: + +注意的是methods属性需要和data属性同级 + +~~~ + methods:{ + onSubmit:function(){ + console.log(this.searchForm); + } +} +~~~ + +浏览器打开如图所示: + +![1669381520004](1669381520004.png) + +可以发现我们还缺少一个时间,所以可以从elementUI官网找到日期组件,如下图所示: + +![1669381732234](assets/1669381732234.png) + +参考官方代码,然后在我们之前的表单中添加一个日期表单,具体代码如下: + +~~~html + + + + + +~~~ + + + +我们添加了双向绑定,所以我们需要在data的searchForm中定义出来,需要注意的是这个日期包含2个值,所以我们定义为数组,代码如下: + +~~~ + searchForm:{ + name:'', + gender:'', + entrydate:[] +} +~~~ + +此时我们打开浏览器,填写表单,并且点击查询按钮,查看浏览器控制台,可以看到表单的内容,效果如下图所示: + +![1669382161813](assets/1669382161813.png) + + + +此时完整代码如下所示: + +~~~html + + + + + + +~~~ + + + +###### 4.4.3.5.3 分页工具栏 + +分页条我们之前做过,所以我们直接找到之前的案例,复制即可,代码如下: + +其中template模块代码如下: + +~~~html + + + +~~~ + +同时methods中需要声明2个函数,代码如下: + +~~~js +handleSizeChange(val) { + console.log(`每页 ${val} 条`); + }, + handleCurrentChange(val) { + console.log(`当前页: ${val}`); + } +~~~ + +此时打开浏览器,效果如下图所示: + +![1669382952832](assets/1669382952832.png) + +此时整体代码如下: + +~~~html + + + + + + +~~~ + + + +##### 4.4.3.6 异步数据加载 + +###### 4.4.3.6.1 异步加载数据 + +对于案例,我们只差最后的数据了,而数据的mock地址已经提供:https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597 + +我们最后要做的就是异步加载数据,所以我们需要使用axios发送ajax请求。 + +在vue项目中,对于axios的使用,分为如下2步: + +1. 安装axios: npm install axios +2. 需要使用axios时,导入axios: import axios 'axios' + + + +接下来我们先来到项目的执行终端,然后输入命令,安装axios,具体操作如下图所示: + +![1669383450054](assets/1669383450054.png) + +然后**重启项目**,来到我们的EmpView.vue组件页面,通过import命令导入axios,代码如下: + +~~~ +import axios 'axios'; +~~~ + +那么我们什么时候发送axios请求呢?页面加载完成,自动加载,所以可以使用之前的mounted钩子函数,并且我们需要将得到的员工数据要展示到表格,所以数据需要赋值给数据模型tableData,所以我们编写如下代码: + +~~~js + mounted(){ + axios.get("https://m1.apifoxmock.com/m2/5879707-5566323-default/296962597") + .then(resp=>{ + this.tableData=resp.data.data; //响应数据赋值给数据模型 + }); + } +~~~ + +此时浏览器打开,呈现如下效果: + +![1669383786402](assets/1669383786402.png) + +但是很明显,性别和图片的内容显示不正确,所以我们需要修复。 + +###### 4.4.3.6.2 性别内容展示修复 + +首先我们来到ElementUI提供的表格组件,找到如下示例: + +![1669384072912](assets/1669384072912.png) + +我们仔细对比效果和功能实现代码,发现其中涉及2个非常重要的点: + +- <template> : 用于自定义列的内容 + - slot-scope: 通过属性的row获取当前行的数据 + +所以接下来,我们可以通过上述的标签自定义列的内容即可,修改性别列的内容代码如下: + +~~~html + + + +~~~ + +此时打开浏览器,效果如下图所示:性别一列的值修复成功 + +![1669384537662](assets/1669384537662.png) + + + +###### 4.4.3.6.3 图片内容展示修复 + +图片内容的修复和上述一致,需要借助<template>标签自定义列的内容,需要需要展示图片,直接借助<img>标签即可,并且需要设置图片的宽度和高度,所以直接修改图片列的代码如下: + +~~~html + + + +~~~ + +此时回到浏览器,效果如下图所示:图片展示修复成功 + +![1669384726550](assets/1669384726550.png) + + + +此时整个案例完整,其完整代码如下: + +~~~html + + + + + + +~~~ + + + +## 5 Vue路由 + +### 5.1 路由介绍 + +将资代码/vue-project(路由)/vue-project/src/views/tlias/DeptView.vue拷贝到我们当前EmpView.vue同级,其结构如下: + +![1669385311576](assets/1669385311576.png) + +此时我们希望基于4.4案例中的功能,实现点击侧边栏的部门管理,显示部门管理的信息,点击员工管理,显示员工管理的信息,效果如下图所示: + +![1669385425617](assets/1669385425617.png) + + + +![1669385446343](assets/1669385446343.png) + +这就需要借助我们的vue的路由功能了。 + +前端路由:URL中的hash(#号之后的内容)与组件之间的对应关系,如下图所示: + +![1669385782145](assets/1669385782145.png) + +当我们点击左侧导航栏时,浏览器的地址栏会发生变化,路由自动更新显示与url所对应的vue组件。 + + + +而我们vue官方提供了路由插件Vue Router,其主要组成如下: + +- VueRouter:路由器类,根据路由请求在路由视图中动态渲染选中的组件 +- <router-link>:请求链接组件,浏览器会解析成<a> +- <router-view>:动态视图组件,用来渲染展示与路由路径对应的组件 + + + +其工作原理如下图所示: + +![1669386261570](assets/1669386261570.png) + +首先VueRouter根据我们配置的url的hash片段和路由的组件关系去维护一张路由表; + +然后我们页面提供一个<router-link>组件,用户点击,发出路由请求; + +接着我们的VueRouter根据路由请求,在路由表中找到对应的vue组件; + +最后VueRouter会切换<router-view>中的组件,从而进行视图的更新 + + + +### 5.2 路由入门 + +接下来我们来演示vue的路由功能。 + +首先我们需要先安装vue-router插件,可以通过如下命令 + +~~~ +npm install vue-router@3.5.1 +~~~ + +**但是我们不需要安装,因为当初我们再创建项目时,已经勾选了路由功能,已经安装好了。** + +然后我们需要在**src/router/index.js**文件中定义路由表,根据其提供的模板代码进行修改,最终代码如下: + +~~~js +import Vue 'vue' +import VueRouter 'vue-router' + +Vue.use(VueRouter) + +const routes = [ + { + path: '/emp', //地址hash + name: 'emp', + component: () => import('../views/tlias/EmpView.vue') //对应的vue组件 + }, + { + path: '/dept', + name: 'dept', + component: () => import('../views/tlias/DeptView.vue') + } +] + +const router = new VueRouter({ + routes +}) + +export default router + +~~~ + +注意需要去掉没有引用的import模块。 + +在main.js中,我们已经引入了router功能,如下图所示: + +![1669387519004](assets/1669387519004.png) + +路由基本信息配置好了,路由表已经被加载,此时我们还缺少2个东西,就是<router-lin>和<router-view>,所以我们需要修改2个页面(EmpView.vue和DeptView.vue)我们左侧栏的2个按钮为router-link,其代码如下: + +~~~html + + 部门管理 + + + 员工管理 + +~~~ + +然后我们还需要在内容展示区域即App.vue中定义route-view,作为组件的切换,其App.vue的完整代码如下: + +~~~html + + + + + +~~~ + +但是我们浏览器打开地址: http://localhost:7000/ ,发现一片空白,因为我们默认的路由路径是/,但是路由配置中没有对应的关系, + +所以我们需要在路由配置中/对应的路由组件,代码如下: + +~~~js +const routes = [ + { + path: '/emp', + name: 'emp', + component: () => import('../views/tlias/EmpView.vue') + }, + { + path: '/dept', + name: 'dept', + component: () => import('../views/tlias/DeptView.vue') + }, + { + path: '/', + redirect:'/emp' //表示重定向到/emp即可 + }, +] +~~~ + +此时我们打开浏览器,访问http://localhost:7000 发现直接访问的是emp的页面,并且能够进行切换了,其具体如下图所示: + +![1669388755027](assets/1669388755027.png) + +到此我们的路由实现成功。 + + + +## 6 打包部署 + +我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步: + +1. 前端工程打包 +2. 通过nginx服务器发布前端工程 + +### 6.1 前端工程打包 + +接下来我们先来对前端工程进行打包 + +我们直接通过VS Code的NPM脚本中提供的build按钮来完整,如下图所示,直接点击即可: + +![1669389052906](assets/1669389052906.png) + +然后会在工程目录下生成一个dist目录,用于存放需要发布的前端资源,如下图所示: + +![1669389147027](assets/1669389147027.png) + + + +### 6.2 部署前端工程 + +#### 6.2.1 nginx介绍 + +nginx: Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,在各大型互联网公司都有非常广泛的使用。 + +niginx在windows中的安装是比较方便的,直接解压即可。所以我们直接将资料中的nginx-1.22.0.zip压缩文件拷贝到**无中文的目录下**,直接解压即可,如下图所示就是nginx的解压目录以及目录结构说明: + +![1669389642057](assets/1669389642057.png) + +**很明显,我们如果要发布,直接将资源放入到html目录中。** + + + +#### 6.2.2 部署 + +将我们之前打包的前端工程dist目录下得内容拷贝到nginx的html目录下,如下图所示: + +![1669389950696](assets/1669389950696.png) + +然后我们通过双击nginx下得nginx.exe文件来启动nginx,如下图所示: + +![1669390029156](assets/1669390029156.png) + +nginx服务器的端口号是80,所以启动成功之后,我们浏览器直接访问http://localhost:80 即可,其中80端口可以省略,其浏览器展示效果如图所示: + +![1669390177896](assets/1669390177896.png) + +到此,我们的前端工程发布成功。 + + + +PS: 如果80端口被占用,我们需要通过**conf/nginx.conf**配置文件来修改端口号。如下图所示: + +![1669390312206](assets/1669390312206.png) + diff --git a/javaEE/day04/SpringBootWeb入门-inmind.md b/javaEE/day04/SpringBootWeb入门-inmind.md new file mode 100644 index 0000000..3a20bba --- /dev/null +++ b/javaEE/day04/SpringBootWeb入门-inmind.md @@ -0,0 +1,906 @@ +# day04 SpringBootWeb入门 +## SpringBoot基础 + +### 课程内容 + +> 1. SpringBootWeb入门 +> +> 2. HTTP协议 +> +> 3. Web服务器-Tomcat + + + + + + + +### 前言 + +![image-20221130095316032](assets/image-20221130095316032.png) + +下面我们将进入SpringBoot基础阶段的学习。 + +在没有正式的学习SpringBoot之前,我们要先来了解下什么是Spring。 + +我们可以打开Spring的官网(https://spring.io),去看一下Spring的简介:Spring makes Java simple。 + +![](assets/image-20220617222738668.png) + +Spring的官方提供很多开源的项目,我们可以点击上面的projects,看到spring家族旗下的项目,按照流行程度排序为: + +![](assets/image-20220617222925923.png) + + + +Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。而我们在项目开发时,一般会偏向于选择这一套spring家族的技术,来解决对应领域的问题,那我们称这一套技术为**spring全家桶**。 + +![](assets/image-20220617222609699.png) + + + +而Spring家族旗下这么多的技术,最基础、最核心的是 SpringFramework。其他的spring家族的技术,都是基于SpringFramework的,SpringFramework中提供很多实用功能,如:依赖注入、事务管理、web开发支持、数据访问、消息服务等等。 + +![](assets/image-20220617224427947.png) + + + +而如果我们在项目中,直接基于SpringFramework进行开发,存在两个问题:配置繁琐、入门难度大。 + +![](assets/image-20220823185227296.png) + +所以基于此呢,spring官方推荐我们从另外一个项目开始学习,那就是目前最火爆的SpringBoot。 + +通过springboot就可以快速的帮我们构建应用程序,所以springboot呢,最大的特点有两个 : + +- 简化配置 +- 快速开发 + +**Spring Boot 可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。** + + + + + +接下来,我们就直接通过一个SpringBoot的web入门程序,让大家快速感受一下,基于SpringBoot进行Web开发的便捷性。 + + + + + +### 1. SpringBootWeb快速入门 + +#### 1.1 需求 + +需求:基于SpringBoot的方式开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串 “Hello World ~”。 + +![](assets/image-20220823191003444.png) + + + +#### 1.2 开发步骤 + +第1步:创建SpringBoot工程项目 + +第2步:定义HelloController类,添加方法hello,并添加注解 + +第3步:测试运行 + + + +##### 1.2.1 创建SpringBoot工程(需要联网) + +基于Spring官方骨架,创建SpringBoot工程。 + +<img src="assets/image-20221201184702136.png" alt="image-20221201184702136" style="zoom:80%;" /> + +基本信息描述完毕之后,勾选web开发相关依赖。 + +<img src="assets/image-20221201184850248.png" alt="image-20221201184850248" style="zoom:80%;" /> + +点击Finish之后,就会联网创建这个SpringBoot工程,创建好之后,结构如下: + +- ==注意:在联网创建过程中,会下载相关资源(请耐心等待)== + +![image-20250614215627770](assets/image-20250614215627770.png) + + + + + +##### 1.2.2 定义请求处理类 + +在com.inmind这个包下创建一个子包controller + +![image-20250614215747861](assets/image-20250614215747861.png) + +然后在controller包下新建一个类:HelloController + +![image-20250614215835081](assets/image-20250614215835081.png) + +```java +package com.inmind.controller; +import org.springframework.web.bind.annotation.*; + +@RestController +public class HelloController { + + @RequestMapping("/hello") + public String hello(){ + System.out.println("Hello World ~"); + return "Hello World ~"; + } + +} +``` + + + +##### 1.2.3 运行测试 + +运行SpringBoot自动生成的引导类 + +![image-20250614215932495](assets/image-20250614215932495.png) + + ![image-20250614220021560](assets/image-20250614220021560.png) + +打开浏览器,输入 `http://localhost:8080/hello` + +<img src="assets/image-20220823195048415.png" style="zoom:80%;" /> + + + +#### 1.3 Web分析 + +![image-20221201224603497](assets/image-20221201224603497.png) + +浏览器: + +- 输入网址:`http://192.168.100.11:8080/hello` + + - 通过IP地址192.168.100.11定位到网络上的一台计算机 + + > 我们之前在浏览器中输入的localhost,就是127.0.0.1(本机) + + - 通过端口号8080找到计算机上运行的程序 + + > `localhost:8080` , 意思是在本地计算机中找到正在运行的8080端口的程序 + + - /hello是请求资源位置 + + - 资源:对计算机而言资源就是数据 + - web资源:通过网络可以访问到的资源(通常是指存放在服务器上的数据) + + > `localhost:8080/hello` ,意思是向本地计算机中的8080端口程序,获取资源位置是/hello的数据 + > + > - 8080端口程序,在服务器找/hello位置的资源数据,发给浏览器 + +服务器:(可以理解为ServerSocket) + +- 接收到浏览器发送的信息(如:/hello) +- 在服务器上找到/hello的资源 +- 把资源发送给浏览器 + +> 我们在JavaSE阶段学习网络编程时,有讲过网络三要素: +> +> - IP :网络中计算机的唯一标识 +> - 端口 :计算机中运行程序的唯一标识 +> - 协议 :网络中计算机之间交互的规则 +> +> **问题:浏览器和服务器两端进行数据交互,使用什么协议?** +> +> **答案:http协议** + + + + + + + + + +### 2. HTTP协议 + +#### 2.1 HTTP-概述 + +##### 2.1.1 介绍 + +![](assets/image-20220823200024507.png) + +HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。 + +- http是互联网上应用最为广泛的一种网络协议 +- http协议要求:浏览器在向服务器发送请求数据时,或是服务器在向浏览器发送响应数据时,都必须按照固定的格式进行数据传输 + + + +如果想知道http协议的数据传输格式有哪些,可以打开浏览器,点击`F12`打开开发者工具,点击`Network`来查看 + +![image-20221202105735230](assets/image-20221202105735230.png) + +浏览器向服务器进行请求时: + +- 服务器按照固定的格式进行解析 + +![image-20221202111044434](assets/image-20221202111044434.png) + +服务器向浏览器进行响应时: + +- 浏览器按照固定的格式进行解析 + +![image-20221202111307819](assets/image-20221202111307819.png) + +**所以,我们学习HTTP主要就是学习请求和响应数据的具体格式内容。** + + + + + +##### 2.2.2 特点 + +我们刚才初步认识了HTTP协议,那么我们在看看HTTP协议有哪些特点: + +* **基于TCP协议: ** 面向连接,安全 + + > TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全 + +* **基于请求-响应模型:** 一次请求对应一次响应(先请求后响应) + + > 请求和响应是一一对应关系,没有请求,就没有响应 + +* **HTTP协议是无状态协议:** 对于数据没有记忆能力。每次请求-响应都是独立的 + + > 无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。 + > + > - 缺点: 多次请求间不能共享数据 + > - 优点: 速度快 + > + > 请求之间无法共享数据会引发的问题: + > + > - 如:京东购物。加入购物车和去购物车结算是两次请求 + > - 由于HTTP协议的无状态特性,加入购物车请求响应结束后,并未记录加入购物车是何商品 + > - 发起去购物车结算的请求后,因为无法获取哪些商品加入了购物车,会导致此次请求无法正确展示数据 + > + > 具体使用的时候,我们发现京东是可以正常展示数据的,原因是Java早已考虑到这个问题,并提出了使用会话技术(Cookie、Session)来解决这个问题。具体如何来做,我们后面课程中会讲到。 + + 刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢? + + + + + +#### 2.2 HTTP-请求协议 + +浏览器和服务器是按照HTTP协议进行数据通信的。 + +HTTP协议又分为:请求协议和响应协议 + +- 请求协议:浏览器将数据以请求格式发送到服务器 + - 包括:**请求行**、**请求头** 、**请求体** +- 响应协议:服务器将数据以响应格式返回给浏览器 + - 包括:**响应行** 、**响应头** 、**响应体** + + + +在HTTP1.1版本中,浏览器访问服务器的几种方式: + +| 请求方式 | 请求说明 | +| :------: | :----------------------------------------------------------- | +| **GET** | 获取资源。<br/>向特定的资源发出请求。例:http://www.baidu.com/s?wd=inmind | +| **POST** | 传输实体主体。<br/>向指定资源提交数据进行处理请求(例:上传文件),数据被包含在请求体中。 | +| OPTIONS | 返回服务器针对特定资源所支持的HTTP请求方式。<br/>因为并不是所有的服务器都支持规定的方法,为了安全有些服务器可能会禁止掉一些方法,例如:DELETE、PUT等。那么OPTIONS就是用来询问服务器支持的方法。 | +| HEAD | 获得报文首部。<br/>HEAD方法类似GET方法,但是不同的是HEAD方法不要求返回数据。通常用于确认URI的有效性及资源更新时间等。 | +| PUT | 传输文件。<br/>PUT方法用来传输文件。类似FTP协议,文件内容包含在请求报文的实体中,然后请求保存到URL指定的服务器位置。 | +| DELETE | 删除文件。<br/>请求服务器删除Request-URI所标识的资源 | +| TRACE | 追踪路径。<br/>回显服务器收到的请求,主要用于测试或诊断 | +| CONNECT | 要求用隧道协议连接代理。<br/>HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 | + +在我们实际应用中常用的也就是 :**GET、POST** + + + +**GET方式的请求协议:** + +![](assets/image-20220823200708026.png) + +* 请求行 :HTTP请求中的第一行数据。由:`请求方式`、`资源路径`、`协议/版本`组成(之间使用空格分隔) + + * 请求方式:GET + * 资源路径:/brand/findAll?name=OPPO&status=1 + * 请求路径:/brand/findAll + * 请求参数:name=OPPO&status=1 + * 请求参数是以key=value形式出现 + * 多个请求参数之间使用`&`连接 + * 请求路径和请求参数之间使用`?`连接 + * 协议/版本:HTTP/1.1 + +* 请求头 :第二行开始,上图黄色部分内容就是请求头。格式为key: value形式 + + - http是个无状态的协议,所以在请求头设置浏览器的一些自身信息和想要响应的形式。这样服务器在收到信息后,就可以知道是谁,想干什么了 + + 常见的HTTP请求头有: + + ~~~ + Host: 表示请求的主机名 + + User-Agent: 浏览器版本。 例如:Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79 ,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko + + Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有; + + Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页; + + Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。 + + Content-Type:请求主体的数据类型 + + Content-Length:数据主体的大小(单位:字节) + ~~~ + +> 举例说明:服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息服务端就可以处理不同的业务需求。 +> +> 比如: +> +> - 不同浏览器解析HTML和CSS标签的结果会有不一致,所以就会导致相同的代码在不同的浏览器会出现不同的效果 +> - 服务端根据客户端请求头中的数据获取到客户端的浏览器类型,就可以根据不同的浏览器设置不同的代码来达到一致的效果(这就是我们常说的浏览器兼容问题) + +- 请求体 :存储请求参数 + - GET请求的请求参数在请求行中,故不需要设置请求体 + + + +**POST方式的请求协议:** + +![](assets/image-20220823201303601.png) + + + +- 请求行(以上图中红色部分):包含请求方式、资源路径、协议/版本 + - 请求方式:POST + - 资源路径:/brand + - 协议/版本:HTTP/1.1 +- 请求头(以上图中黄色部分) +- 请求体(以上图中绿色部分) :存储请求参数 + - 请求体和请求头之间是有一个空行隔开(作用:用于标记请求头结束) + + + +GET请求和POST请求的区别: + +| 区别方式 | GET请求 | POST请求 | +| ------------ | ------------------------------------------------------------ | -------------------- | +| 请求参数 | 请求参数在请求行中。<br/>例:/brand/findAll?name=OPPO&status=1 | 请求参数在请求体中 | +| 请求参数长度 | 请求参数长度有限制(浏览器不同限制也不同) | 请求参数长度没有限制 | +| 安全性 | 安全性低。原因:请求参数暴露在浏览器地址栏中。 | 安全性相对高 | + + + + + +#### 2.3 HTTP-响应协议 + +##### 2.3.1 格式介绍 + +与HTTP的请求一样,HTTP响应的数据也分为3部分:**响应行**、**响应头** 、**响应体** + +![](assets/image-20220823202344149.png) + +* 响应行(以上图中红色部分):响应数据的第一行。响应行由`协议及版本`、`响应状态码`、`状态码描述`组成 + + * 协议/版本:HTTP/1.1 + * 响应状态码:200 + * 状态码描述:OK + +* 响应头(以上图中黄色部分):响应数据的第二行开始。格式为key:value形式 + + * http是个无状态的协议,所以可以在请求头和响应头中设置一些信息和想要执行的动作,这样,对方在收到信息后,就可以知道你是谁,你想干什么 + + 常见的HTTP响应头有: + + ~~~ + Content-Type:表示该响应内容的类型,例如text/html,image/jpeg ; + + Content-Length:表示该响应内容的长度(字节数); + + Content-Encoding:表示该响应压缩算法,例如gzip ; + + Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒 ; + + Set-Cookie: 告诉浏览器为当前页面所在的域设置cookie ; + ~~~ + +- 响应体(以上图中绿色部分): 响应数据的最后一部分。存储响应的数据 + - 响应体和响应头之间有一个空行隔开(作用:用于标记响应头结束) + + + +##### 2.3.2 响应状态码 + +| 状态码分类 | 说明 | +| ---------- | ------------------------------------------------------------ | +| 1xx | **响应中** --- 临时状态码。表示请求已经接受,告诉客户端应该继续请求或者如果已经完成则忽略 | +| 2xx | **成功** --- 表示请求已经被成功接收,处理已完成 | +| 3xx | **重定向** --- 重定向到其它地方,让客户端再发起一个请求以完成整个处理 | +| 4xx | **客户端错误** --- 处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 | +| 5xx | **服务器端错误** --- 处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等 | + +参考: 资料/SpringbootWeb/响应状态码.md + +关于响应状态码,我们先主要认识三个状态码,其余的等后期用到了再去掌握: + +* 200 ok 客户端请求成功 +* 404 Not Found 请求资源不存在 +* 500 Internal Server Error 服务端发生不可预期的错误 + + + + + +#### 2.4 HTTP-协议解析 + +将资料中准备好的Demo工程,导入到我们的IDEA中,有一个Server.java类,这里面就是自定义的一个服务器代码,主要使用到的是`ServerSocket`和`Socket` + +> ==说明:以下代码大家不需要自己写,我们主要是通过代码,让大家了解到服务器针对HTTP协议的解析机制== + +```java +package com.inmind; + +import java.io.*; +import java.net.ServerSocket; +import java.net.Socket; +import java.nio.charset.StandardCharsets; + +/* + * 自定义web服务器 + */ +public class Server { + public static void main(String[] args) throws IOException { + ServerSocket ss = new ServerSocket(8080); // 监听指定端口 + System.out.println("server is running..."); + + while (true){ + Socket sock = ss.accept(); + System.out.println("connected from " + sock.getRemoteSocketAddress()); + Thread t = new Handler(sock); + t.start(); + } + } +} + +class Handler extends Thread { + Socket sock; + + public Handler(Socket sock) { + this.sock = sock; + } + + public void run() { + try (InputStream input = this.sock.getInputStream(); + OutputStream output = this.sock.getOutputStream()) { + handle(input, output); + } catch (Exception e) { + try { + this.sock.close(); + } catch (IOException ioe) { + } + System.out.println("client disconnected."); + } + } + + private void handle(InputStream input, OutputStream output) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8)); + // 读取HTTP请求: + boolean requestOk = false; + String first = reader.readLine(); + if (first.startsWith("GET / HTTP/1.")) { + requestOk = true; + } + for (;;) { + String header = reader.readLine(); + if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕 + break; + } + System.out.println(header); + } + System.out.println(requestOk ? "Response OK" : "Response Error"); + + if (!requestOk) {// 发送错误响应: + writer.write("HTTP/1.0 404 Not Found\r\n"); + writer.write("Content-Length: 0\r\n"); + writer.write("\r\n"); + writer.flush(); + } else {// 发送成功响应: + //读取html文件,转换为字符串 + InputStream is = Server.class.getClassLoader().getResourceAsStream("html/a.html"); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + StringBuilder data = new StringBuilder(); + String line = null; + while ((line = br.readLine()) != null){ + data.append(line); + } + br.close(); + int length = data.toString().getBytes(StandardCharsets.UTF_8).length; + + writer.write("HTTP/1.1 200 OK\r\n"); + writer.write("Connection: keep-alive\r\n"); + writer.write("Content-Type: text/html\r\n"); + writer.write("Content-Length: " + length + "\r\n"); + writer.write("\r\n"); // 空行标识Header和Body的分隔 + writer.write(data.toString()); + writer.flush(); + } + } +} + +``` + +启动ServerSocket程序: + +![image-20250615082738427](assets/image-20250615082738427.png) + + + +浏览器输入:`http://localhost:8080` 就会访问到ServerSocket程序 + +- ServerSocket程序,会读取服务器上`html/a.html`文件,并把文件数据发送给浏览器 +- 浏览器接收到a.html文件中的数据后进行解析,显示以下内容 + +![image-20221202171204705](assets/image-20221202171204705.png) + + + +现在大家知道了服务器是可以使用java完成编写,是可以接受页面发送的请求和响应数据给前端浏览器的,而在开发中真正用到的Web服务器,我们不会自己写的,都是使用目前比较流行的web服务器。如:**Tomcat** + +![](assets/image-20220824233452167.png) + + + + + + + + + +### 3. WEB服务器-Tomcat + +#### 3.1 简介 + +##### 3.1.1 服务器概述 + +**服务器硬件** + +- 指的也是计算机,只不过服务器要比我们日常使用的计算机大很多。 + +![image-20221202173148317](assets/image-20221202173148317.png) + +服务器,也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。 + +服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。 + +在网络环境下,根据服务器提供的服务类型不同,可分为:文件服务器,数据库服务器,应用程序服务器,WEB服务器等。 + +服务器只是一台设备,必须安装服务器软件才能提供相应的服务。 + +**服务器软件** + +服务器软件:基于ServerSocket编写的程序 + +- 服务器软件本质是一个运行在服务器设备上的应用程序 +- 能够接收客户端请求,并根据请求给客户端响应数据 + +![1530625192392](assets/1530625192392.png) + + + +##### 3.1.2 Web服务器 + +Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作(不用程序员自己写代码去解析http协议规则),让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。 + +![](assets/image-20220824233614686.png) + +Web服务器是安装在服务器端的一款软件,将来我们把自己写的Web项目部署到Tomcat服务器软件中,当Web服务器软件启动后,部署在Web服务器软件中的页面就可以直接通过浏览器来访问了。 + + + +**Web服务器软件使用步骤** + +* 准备静态资源 +* 下载安装Web服务器软件 +* 将静态资源部署到Web服务器上 +* 启动Web服务器使用浏览器访问对应的资源 + +第1步:准备静态资源 + +- 在提供的资料中找到静态资源文件 + +![image-20221202180119859](assets/image-20221202180119859.png) + +第2步:下载安装Web服务器软件 + +![image-20221202181110555](assets/image-20221202181110555.png) + +第3步:将静态资源部署到Web服务器上 + +![image-20221202180805686](assets/image-20221202180805686.png) + +第4步:启动Web服务器使用浏览器访问对应的资源 + +![image-20221202181346327](assets/image-20221202181346327.png) + +浏览器输入:`http://localhost:8080/demo/index.html` + +![image-20221202181651469](assets/image-20221202181651469.png) + +上述内容在演示的时候,使用的是Apache下的Tomcat软件,至于Tomcat软件如何使用,后面会详细的讲到。而对于Web服务器来说,实现的方案有很多,Tomcat只是其中的一种,而除了Tomcat以外,还有很多优秀的Web服务器,比如: + +![image-20220824233728524](assets/image-20220824233728524.png) + +Tomcat就是一款软件,我们主要是以学习如何去使用为主。具体我们会从以下这些方向去学习: + +1. 简介:初步认识下Tomcat + +2. 基本使用: 安装、卸载、启动、关闭、配置和项目部署,这些都是对Tomcat的基本操作 + +3. IDEA中如何创建Maven Web项目 + +4. IDEA中如何使用Tomcat,后面这两个都是我们以后开发经常会用到的方式 + +首选我们来认识下Tomcat。 + + + + + +##### 3.1.3 Tomcat + +Tomcat服务器软件是一个免费的开源的web应用服务器。是Apache软件基金会的一个核心项目。由Apache,Sun和其他一些公司及个人共同开发而成。 + +由于Tomcat只支持Servlet/JSP少量JavaEE规范,所以是一个开源免费的轻量级Web服务器。 + +> JavaEE规范: JavaEE => Java Enterprise Edition(Java企业版) +> +> avaEE规范就是指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF + +因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。JavaWeb程序需要依赖Tomcat才能运行。 + +Tomcat的官网: https://tomcat.apache.org/ + +![image-20220824233903517](assets/image-20220824233903517.png) + + + + + + + +#### 3.2 基本使用 + +##### 3.2.1 下载 + +直接从官方网站下载:https://tomcat.apache.org/download-90.cgi + +![](assets/image-20220824234407828.png) + +> Tomcat软件类型说明: +> +> - tar.gz文件,是linux和mac操作系统下的压缩版本 +> - zip文件,是window操作系统下压缩版本(我们选择zip文件) + +大家可以自行下载,也可以直接使用资料中已经下载好的资源, + +Tomcat的软件程序 :/资料/SpringbootWeb/apache-tomcat-9.0.27-windows-x64.zip + +![](assets/image-20220824234527743.png) + + + + + +##### 3.2.2 安装与卸载 + +**安装:** Tomcat是绿色版,直接解压即安装 + +> 在E盘的develop目录下,将`apache-tomcat-9.0.27-windows-x64.zip`进行解压缩,会得到一个`apache-tomcat-9.0.27`的目录,Tomcat就已经安装成功。 + +![image-20221202184545321](assets/image-20221202184545321.png) + +==注意,Tomcat在解压缩的时候,解压所在的目录可以任意,但最好解压到一个不包含中文和空格的目录,因为后期在部署项目的时候,如果路径有中文或者空格可能会导致程序部署失败。== + + + +打开`apache-tomcat-9.0.27`目录就能看到如下目录结构,每个目录中包含的内容需要认识下 + +![](assets/image-20220824234652173.png) + +bin:目录下有两类文件,一种是以`.bat`结尾的,是Windows系统的可执行文件,一种是以`.sh`结尾的,是Linux系统的可执行文件。 + +webapps:就是以后项目部署的目录 + + + +**卸载:**卸载比较简单,可以直接删除目录即可 + + + + + +##### 3.2.3 启动与关闭 + +**启动Tomcat** + +- 双击tomcat解压目录/bin/**startup.bat**文件即可启动tomcat + +![image-20221202183201663](assets/image-20221202183201663.png) + +==注意: tomcat服务器启动后,黑窗口不会关闭,只要黑窗口不关闭,就证明tomcat服务器正在运行== + +![image-20221202183409304](assets/image-20221202183409304.png) + +Tomcat的默认端口为8080,所以在浏览器的地址栏输入:`http://127.0.0.1:8080` 即可访问tomcat服务器 + +> 127.0.0.1 也可以使用localhost代替。如:`http://localhost:8080` + +![image-20221202183550682](assets/image-20221202183550682.png) + +- 能看到以上图片中Apache Tomcat的内容就说明Tomcat已经启动成功 + +==注意事项== :Tomcat启动的过程中,遇到控制台有中文乱码时,可以通常修改conf/logging.prooperties文件解决 + +![image-20220825083848086](assets/image-20220825083848086.png) + + + +**关闭:** 关闭有三种方式 + +1、强制关闭:直接x掉Tomcat窗口(不建议) + +![image-20221202184753808](assets/image-20221202184753808.png) + +2、正常关闭:bin\shutdown.bat + +![image-20221202185103941](assets/image-20221202185103941.png) + +3、正常关闭:在Tomcat启动窗口中按下 Ctrl+C + +- 说明:如果按下Ctrl+C没有反映,可以多按几次 + + + + + +##### 3.2.4 常见问题 + +**问题1:Tomcat启动时,窗口一闪而过** + +- 检查JAVA_HOME环境变量是否正确配置 + +![image-20221202190033167](assets/image-20221202190033167.png) + + + +**问题2:端口号冲突** + +![image-20220825084104447](assets/image-20220825084104447.png) + +- 发生问题的原因:Tomcat使用的端口被占用了。 + +- 解决方案:换Tomcat端口号 + - 要想修改Tomcat启动的端口号,需要修改 conf/server.xml文件 + +<img src="assets/image-20220825084017185.png" alt="image-20220825084017185" style="zoom:80%;" /> + +> 注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。 + + + +#### 3.3 入门程序解析 + +关于web开发的基础知识,我们可以告一段落了。下面呢,我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 + +##### 3.3.1 Spring官方骨架 + +之前我们创建的SpringBoot入门案例,是基于Spring官方提供的骨架实现的。 + +Spring官方骨架,可以理解为Spring官方为程序员提供一个搭建项目的模板。 + +![image-20221202195646621](assets/image-20221202195646621.png) + +我们可以通过访问:https://start.spring.io/ ,进入到官方骨架页面 + +![image-20221202201623424](assets/image-20221202201623424.png) + +![image-20221202200356398](assets/image-20221202200356398.png) + +![image-20221202200547676](assets/image-20221202200547676.png) + +![image-20221202200708988](assets/image-20221202200708988.png) + +Spring官方生成的SpringBoot项目,怎么使用呢? + +- 解压缩后,就会得到一个SpringBoot项目工程 + +![image-20221202201042109](assets/image-20221202201042109.png) + +![image-20221202201221136](assets/image-20221202201221136.png) + +打开pom.xml文件,我们可以看到springboot项目中引入了web依赖和test依赖 + +![image-20221202201826364](assets/image-20221202201826364.png) + +> **结论:不论使用IDEA创建SpringBoot项目,还是直接在官方网站利用骨架生成SpringBoot项目,项目的结构和pom.xml文件中内容是相似的。** + + + +##### 3.3.2 起步依赖 + +在我们之前讲解的SpringBoot快速入门案例中,同样也引用了:web依赖和test依赖 + +![image-20221202202305118](assets/image-20221202202305118.png) + +spring-boot-starter-web和spring-boot-starter-test,在SpringBoot中又称为:起步依赖 + +而在SpringBoot的项目中,有很多的起步依赖,他们有一个共同的特征:就是以`spring-boot-starter-`作为开头。在以后大家遇到spring-boot-starter-xxx这类的依赖,都为起步依赖。 + +起步依赖有什么特殊之处呢,这里我们以入门案例中引入的起步依赖做为讲解: + +- spring-boot-starter-web:包含了web应用开发所需要的常见依赖 +- spring-boot-starter-test:包含了单元测试所需要的常见依赖 + +> **spring-boot-starter-web**内部把关于Web开发所有的依赖都已经导入并且指定了版本,只需引入 `spring-boot-starter-web` 依赖就可以实现Web开发的需要的功能 +> +> ![image-20221202204013113](assets/image-20221202204013113.png) + +Spring的官方提供了很多现成的starter(起步依赖),我们在开发相关应用时,只需要引入对应的starter即可。 + +官方地址:https://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/#using.build-systems.starters + +![image-20221202204536647](assets/image-20221202204536647.png) + +每一个起步依赖,都用于开发一个特定的功能。 + +> 举例:当我们开发中需要使用redis数据库时,只需要在SpringBoot项目中,引入:spring-boot-starter-redis ,即可导入redis开发所需要的依赖。 + + + + + +##### 3.3.2 SpringBoot父工程 + +在我们之前开发的SpringBoot入门案例中,我们通过maven引入的依赖,是没有指定具体的依赖版本号的。 + +![image-20221202205103486](assets/image-20221202205103486.png) + + + +为什么没有指定<version>版本号,可以正常使用呢? + +- 因为每一个SpringBoot工程,都有一个父工程。依赖的版本号,在父工程中统一管理。 + +![image-20221202205318778](assets/image-20221202205318778.png) + + + + + +##### 3.3.3 内嵌Tomcat + +问题:为什么我们之前书写的SpringBoot入门程序中,并没有把程序部署到Tomcat的webapps目录下,也可以运行呢? + +原因呢,是因为在我们的SpringBoot中,引入了web运行环境(也就是引入spring-boot-starter-web起步依赖),其内部已经集成了内置的Tomcat服务器。 + +我们可以通过IDEA开发工具右侧的maven面板中,就可以看到当前工程引入的依赖。其中已经将Tomcat的相关依赖传递下来了,也就是说在SpringBoot中可以直接使用Tomcat服务器。 + +![](assets/image-20220825194553137.png) + +当我们运行SpringBoot的引导类时(运行main方法),就会看到命令行输出的日志,其中占用8080端口的就是Tomcat。 + +![image-20220825195359993](assets/image-20220825195359993.png) + + + + + + + + + diff --git a/javaEE/day04/assets/1530625192392.png b/javaEE/day04/assets/1530625192392.png new file mode 100644 index 0000000..ab2413c Binary files /dev/null and b/javaEE/day04/assets/1530625192392.png differ diff --git a/javaEE/day04/assets/image-20220617222609699.png b/javaEE/day04/assets/image-20220617222609699.png new file mode 100644 index 0000000..2278c8b Binary files /dev/null and b/javaEE/day04/assets/image-20220617222609699.png differ diff --git a/javaEE/day04/assets/image-20220617222738668.png b/javaEE/day04/assets/image-20220617222738668.png new file mode 100644 index 0000000..9556249 Binary files /dev/null and b/javaEE/day04/assets/image-20220617222738668.png differ diff --git a/javaEE/day04/assets/image-20220617222925923.png b/javaEE/day04/assets/image-20220617222925923.png new file mode 100644 index 0000000..b98b142 Binary files /dev/null and b/javaEE/day04/assets/image-20220617222925923.png differ diff --git a/javaEE/day04/assets/image-20220617224427947.png b/javaEE/day04/assets/image-20220617224427947.png new file mode 100644 index 0000000..9d73d15 Binary files /dev/null and b/javaEE/day04/assets/image-20220617224427947.png differ diff --git a/javaEE/day04/assets/image-20220823185227296.png b/javaEE/day04/assets/image-20220823185227296.png new file mode 100644 index 0000000..188d307 Binary files /dev/null and b/javaEE/day04/assets/image-20220823185227296.png differ diff --git a/javaEE/day04/assets/image-20220823191003444.png b/javaEE/day04/assets/image-20220823191003444.png new file mode 100644 index 0000000..408a916 Binary files /dev/null and b/javaEE/day04/assets/image-20220823191003444.png differ diff --git a/javaEE/day04/assets/image-20220823195048415.png b/javaEE/day04/assets/image-20220823195048415.png new file mode 100644 index 0000000..5be0a07 Binary files /dev/null and b/javaEE/day04/assets/image-20220823195048415.png differ diff --git a/javaEE/day04/assets/image-20220823200024507.png b/javaEE/day04/assets/image-20220823200024507.png new file mode 100644 index 0000000..0b18e2b Binary files /dev/null and b/javaEE/day04/assets/image-20220823200024507.png differ diff --git a/javaEE/day04/assets/image-20220823200708026.png b/javaEE/day04/assets/image-20220823200708026.png new file mode 100644 index 0000000..721c5a9 Binary files /dev/null and b/javaEE/day04/assets/image-20220823200708026.png differ diff --git a/javaEE/day04/assets/image-20220823201303601.png b/javaEE/day04/assets/image-20220823201303601.png new file mode 100644 index 0000000..99049e8 Binary files /dev/null and b/javaEE/day04/assets/image-20220823201303601.png differ diff --git a/javaEE/day04/assets/image-20220823202344149.png b/javaEE/day04/assets/image-20220823202344149.png new file mode 100644 index 0000000..9ec1b9e Binary files /dev/null and b/javaEE/day04/assets/image-20220823202344149.png differ diff --git a/javaEE/day04/assets/image-20220824233452167.png b/javaEE/day04/assets/image-20220824233452167.png new file mode 100644 index 0000000..5855a6a Binary files /dev/null and b/javaEE/day04/assets/image-20220824233452167.png differ diff --git a/javaEE/day04/assets/image-20220824233614686.png b/javaEE/day04/assets/image-20220824233614686.png new file mode 100644 index 0000000..d26ed9f Binary files /dev/null and b/javaEE/day04/assets/image-20220824233614686.png differ diff --git a/javaEE/day04/assets/image-20220824233728524.png b/javaEE/day04/assets/image-20220824233728524.png new file mode 100644 index 0000000..42e22b0 Binary files /dev/null and b/javaEE/day04/assets/image-20220824233728524.png differ diff --git a/javaEE/day04/assets/image-20220824233903517.png b/javaEE/day04/assets/image-20220824233903517.png new file mode 100644 index 0000000..ef941a7 Binary files /dev/null and b/javaEE/day04/assets/image-20220824233903517.png differ diff --git a/javaEE/day04/assets/image-20220824234407828.png b/javaEE/day04/assets/image-20220824234407828.png new file mode 100644 index 0000000..6a93060 Binary files /dev/null and b/javaEE/day04/assets/image-20220824234407828.png differ diff --git a/javaEE/day04/assets/image-20220824234527743.png b/javaEE/day04/assets/image-20220824234527743.png new file mode 100644 index 0000000..08faea3 Binary files /dev/null and b/javaEE/day04/assets/image-20220824234527743.png differ diff --git a/javaEE/day04/assets/image-20220824234652173.png b/javaEE/day04/assets/image-20220824234652173.png new file mode 100644 index 0000000..6b181ec Binary files /dev/null and b/javaEE/day04/assets/image-20220824234652173.png differ diff --git a/javaEE/day04/assets/image-20220825083848086.png b/javaEE/day04/assets/image-20220825083848086.png new file mode 100644 index 0000000..816853b Binary files /dev/null and b/javaEE/day04/assets/image-20220825083848086.png differ diff --git a/javaEE/day04/assets/image-20220825084017185.png b/javaEE/day04/assets/image-20220825084017185.png new file mode 100644 index 0000000..a78701b Binary files /dev/null and b/javaEE/day04/assets/image-20220825084017185.png differ diff --git a/javaEE/day04/assets/image-20220825084104447.png b/javaEE/day04/assets/image-20220825084104447.png new file mode 100644 index 0000000..2c61ebb Binary files /dev/null and b/javaEE/day04/assets/image-20220825084104447.png differ diff --git a/javaEE/day04/assets/image-20220825194553137.png b/javaEE/day04/assets/image-20220825194553137.png new file mode 100644 index 0000000..7186fa0 Binary files /dev/null and b/javaEE/day04/assets/image-20220825194553137.png differ diff --git a/javaEE/day04/assets/image-20220825195359993.png b/javaEE/day04/assets/image-20220825195359993.png new file mode 100644 index 0000000..5004ee9 Binary files /dev/null and b/javaEE/day04/assets/image-20220825195359993.png differ diff --git a/javaEE/day04/assets/image-20221130095316032.png b/javaEE/day04/assets/image-20221130095316032.png new file mode 100644 index 0000000..6b441d9 Binary files /dev/null and b/javaEE/day04/assets/image-20221130095316032.png differ diff --git a/javaEE/day04/assets/image-20221201184702136.png b/javaEE/day04/assets/image-20221201184702136.png new file mode 100644 index 0000000..406a3be Binary files /dev/null and b/javaEE/day04/assets/image-20221201184702136.png differ diff --git a/javaEE/day04/assets/image-20221201184850248.png b/javaEE/day04/assets/image-20221201184850248.png new file mode 100644 index 0000000..09d01c2 Binary files /dev/null and b/javaEE/day04/assets/image-20221201184850248.png differ diff --git a/javaEE/day04/assets/image-20221201185910596.png b/javaEE/day04/assets/image-20221201185910596.png new file mode 100644 index 0000000..c9cf0e2 Binary files /dev/null and b/javaEE/day04/assets/image-20221201185910596.png differ diff --git a/javaEE/day04/assets/image-20221201190541295.png b/javaEE/day04/assets/image-20221201190541295.png new file mode 100644 index 0000000..30a90a8 Binary files /dev/null and b/javaEE/day04/assets/image-20221201190541295.png differ diff --git a/javaEE/day04/assets/image-20221201190825439.png b/javaEE/day04/assets/image-20221201190825439.png new file mode 100644 index 0000000..259bc55 Binary files /dev/null and b/javaEE/day04/assets/image-20221201190825439.png differ diff --git a/javaEE/day04/assets/image-20221201191028124.png b/javaEE/day04/assets/image-20221201191028124.png new file mode 100644 index 0000000..45fd022 Binary files /dev/null and b/javaEE/day04/assets/image-20221201191028124.png differ diff --git a/javaEE/day04/assets/image-20221201191348924.png b/javaEE/day04/assets/image-20221201191348924.png new file mode 100644 index 0000000..95be672 Binary files /dev/null and b/javaEE/day04/assets/image-20221201191348924.png differ diff --git a/javaEE/day04/assets/image-20221201224603497.png b/javaEE/day04/assets/image-20221201224603497.png new file mode 100644 index 0000000..cf17972 Binary files /dev/null and b/javaEE/day04/assets/image-20221201224603497.png differ diff --git a/javaEE/day04/assets/image-20221202105735230.png b/javaEE/day04/assets/image-20221202105735230.png new file mode 100644 index 0000000..eec3e86 Binary files /dev/null and b/javaEE/day04/assets/image-20221202105735230.png differ diff --git a/javaEE/day04/assets/image-20221202111044434.png b/javaEE/day04/assets/image-20221202111044434.png new file mode 100644 index 0000000..3d3e055 Binary files /dev/null and b/javaEE/day04/assets/image-20221202111044434.png differ diff --git a/javaEE/day04/assets/image-20221202111307819.png b/javaEE/day04/assets/image-20221202111307819.png new file mode 100644 index 0000000..0884040 Binary files /dev/null and b/javaEE/day04/assets/image-20221202111307819.png differ diff --git a/javaEE/day04/assets/image-20221202170430928.png b/javaEE/day04/assets/image-20221202170430928.png new file mode 100644 index 0000000..79bf44d Binary files /dev/null and b/javaEE/day04/assets/image-20221202170430928.png differ diff --git a/javaEE/day04/assets/image-20221202171204705.png b/javaEE/day04/assets/image-20221202171204705.png new file mode 100644 index 0000000..d39cec0 Binary files /dev/null and b/javaEE/day04/assets/image-20221202171204705.png differ diff --git a/javaEE/day04/assets/image-20221202173148317.png b/javaEE/day04/assets/image-20221202173148317.png new file mode 100644 index 0000000..ce82558 Binary files /dev/null and b/javaEE/day04/assets/image-20221202173148317.png differ diff --git a/javaEE/day04/assets/image-20221202180119859.png b/javaEE/day04/assets/image-20221202180119859.png new file mode 100644 index 0000000..28ae10b Binary files /dev/null and b/javaEE/day04/assets/image-20221202180119859.png differ diff --git a/javaEE/day04/assets/image-20221202180805686.png b/javaEE/day04/assets/image-20221202180805686.png new file mode 100644 index 0000000..2d9c414 Binary files /dev/null and b/javaEE/day04/assets/image-20221202180805686.png differ diff --git a/javaEE/day04/assets/image-20221202181110555.png b/javaEE/day04/assets/image-20221202181110555.png new file mode 100644 index 0000000..6e8738f Binary files /dev/null and b/javaEE/day04/assets/image-20221202181110555.png differ diff --git a/javaEE/day04/assets/image-20221202181346327.png b/javaEE/day04/assets/image-20221202181346327.png new file mode 100644 index 0000000..daf6978 Binary files /dev/null and b/javaEE/day04/assets/image-20221202181346327.png differ diff --git a/javaEE/day04/assets/image-20221202181651469.png b/javaEE/day04/assets/image-20221202181651469.png new file mode 100644 index 0000000..4d7fea0 Binary files /dev/null and b/javaEE/day04/assets/image-20221202181651469.png differ diff --git a/javaEE/day04/assets/image-20221202183201663.png b/javaEE/day04/assets/image-20221202183201663.png new file mode 100644 index 0000000..7466c93 Binary files /dev/null and b/javaEE/day04/assets/image-20221202183201663.png differ diff --git a/javaEE/day04/assets/image-20221202183409304.png b/javaEE/day04/assets/image-20221202183409304.png new file mode 100644 index 0000000..0fcfcf4 Binary files /dev/null and b/javaEE/day04/assets/image-20221202183409304.png differ diff --git a/javaEE/day04/assets/image-20221202183550682.png b/javaEE/day04/assets/image-20221202183550682.png new file mode 100644 index 0000000..3823d80 Binary files /dev/null and b/javaEE/day04/assets/image-20221202183550682.png differ diff --git a/javaEE/day04/assets/image-20221202184545321.png b/javaEE/day04/assets/image-20221202184545321.png new file mode 100644 index 0000000..837b846 Binary files /dev/null and b/javaEE/day04/assets/image-20221202184545321.png differ diff --git a/javaEE/day04/assets/image-20221202184753808.png b/javaEE/day04/assets/image-20221202184753808.png new file mode 100644 index 0000000..8404cd2 Binary files /dev/null and b/javaEE/day04/assets/image-20221202184753808.png differ diff --git a/javaEE/day04/assets/image-20221202185103941.png b/javaEE/day04/assets/image-20221202185103941.png new file mode 100644 index 0000000..81ff42b Binary files /dev/null and b/javaEE/day04/assets/image-20221202185103941.png differ diff --git a/javaEE/day04/assets/image-20221202190033167.png b/javaEE/day04/assets/image-20221202190033167.png new file mode 100644 index 0000000..80b309f Binary files /dev/null and b/javaEE/day04/assets/image-20221202190033167.png differ diff --git a/javaEE/day04/assets/image-20221202195646621.png b/javaEE/day04/assets/image-20221202195646621.png new file mode 100644 index 0000000..df26150 Binary files /dev/null and b/javaEE/day04/assets/image-20221202195646621.png differ diff --git a/javaEE/day04/assets/image-20221202200356398.png b/javaEE/day04/assets/image-20221202200356398.png new file mode 100644 index 0000000..cdc5eb0 Binary files /dev/null and b/javaEE/day04/assets/image-20221202200356398.png differ diff --git a/javaEE/day04/assets/image-20221202200547676.png b/javaEE/day04/assets/image-20221202200547676.png new file mode 100644 index 0000000..be92111 Binary files /dev/null and b/javaEE/day04/assets/image-20221202200547676.png differ diff --git a/javaEE/day04/assets/image-20221202200708988.png b/javaEE/day04/assets/image-20221202200708988.png new file mode 100644 index 0000000..6e89719 Binary files /dev/null and b/javaEE/day04/assets/image-20221202200708988.png differ diff --git a/javaEE/day04/assets/image-20221202201042109.png b/javaEE/day04/assets/image-20221202201042109.png new file mode 100644 index 0000000..ab6c82b Binary files /dev/null and b/javaEE/day04/assets/image-20221202201042109.png differ diff --git a/javaEE/day04/assets/image-20221202201221136.png b/javaEE/day04/assets/image-20221202201221136.png new file mode 100644 index 0000000..eda3807 Binary files /dev/null and b/javaEE/day04/assets/image-20221202201221136.png differ diff --git a/javaEE/day04/assets/image-20221202201623424.png b/javaEE/day04/assets/image-20221202201623424.png new file mode 100644 index 0000000..63a6231 Binary files /dev/null and b/javaEE/day04/assets/image-20221202201623424.png differ diff --git a/javaEE/day04/assets/image-20221202201826364.png b/javaEE/day04/assets/image-20221202201826364.png new file mode 100644 index 0000000..f3b14a7 Binary files /dev/null and b/javaEE/day04/assets/image-20221202201826364.png differ diff --git a/javaEE/day04/assets/image-20221202202305118.png b/javaEE/day04/assets/image-20221202202305118.png new file mode 100644 index 0000000..2c2a7f2 Binary files /dev/null and b/javaEE/day04/assets/image-20221202202305118.png differ diff --git a/javaEE/day04/assets/image-20221202204013113.png b/javaEE/day04/assets/image-20221202204013113.png new file mode 100644 index 0000000..c2b05fe Binary files /dev/null and b/javaEE/day04/assets/image-20221202204013113.png differ diff --git a/javaEE/day04/assets/image-20221202204536647.png b/javaEE/day04/assets/image-20221202204536647.png new file mode 100644 index 0000000..1546dab Binary files /dev/null and b/javaEE/day04/assets/image-20221202204536647.png differ diff --git a/javaEE/day04/assets/image-20221202205103486.png b/javaEE/day04/assets/image-20221202205103486.png new file mode 100644 index 0000000..ae5e644 Binary files /dev/null and b/javaEE/day04/assets/image-20221202205103486.png differ diff --git a/javaEE/day04/assets/image-20221202205318778.png b/javaEE/day04/assets/image-20221202205318778.png new file mode 100644 index 0000000..31f6e54 Binary files /dev/null and b/javaEE/day04/assets/image-20221202205318778.png differ diff --git a/javaEE/day04/assets/image-20250614215627770.png b/javaEE/day04/assets/image-20250614215627770.png new file mode 100644 index 0000000..4d209a1 Binary files /dev/null and b/javaEE/day04/assets/image-20250614215627770.png differ diff --git a/javaEE/day04/assets/image-20250614215747861.png b/javaEE/day04/assets/image-20250614215747861.png new file mode 100644 index 0000000..b05909f Binary files /dev/null and b/javaEE/day04/assets/image-20250614215747861.png differ diff --git a/javaEE/day04/assets/image-20250614215835081.png b/javaEE/day04/assets/image-20250614215835081.png new file mode 100644 index 0000000..e562cdf Binary files /dev/null and b/javaEE/day04/assets/image-20250614215835081.png differ diff --git a/javaEE/day04/assets/image-20250614215932495.png b/javaEE/day04/assets/image-20250614215932495.png new file mode 100644 index 0000000..7cd17dc Binary files /dev/null and b/javaEE/day04/assets/image-20250614215932495.png differ diff --git a/javaEE/day04/assets/image-20250614220021560.png b/javaEE/day04/assets/image-20250614220021560.png new file mode 100644 index 0000000..2396ff4 Binary files /dev/null and b/javaEE/day04/assets/image-20250614220021560.png differ diff --git a/javaEE/day04/assets/image-20250614220224536.png b/javaEE/day04/assets/image-20250614220224536.png new file mode 100644 index 0000000..95d553c Binary files /dev/null and b/javaEE/day04/assets/image-20250614220224536.png differ diff --git a/javaEE/day04/assets/image-20250614220232904.png b/javaEE/day04/assets/image-20250614220232904.png new file mode 100644 index 0000000..95d553c Binary files /dev/null and b/javaEE/day04/assets/image-20250614220232904.png differ diff --git a/javaEE/day04/assets/image-20250615082738427.png b/javaEE/day04/assets/image-20250615082738427.png new file mode 100644 index 0000000..92e7a84 Binary files /dev/null and b/javaEE/day04/assets/image-20250615082738427.png differ diff --git a/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102018021.png b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102018021.png new file mode 100644 index 0000000..8bfba90 Binary files /dev/null and b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102018021.png differ diff --git a/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102023027.png b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102023027.png new file mode 100644 index 0000000..8bfba90 Binary files /dev/null and b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102023027.png differ diff --git a/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102133907.png b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102133907.png new file mode 100644 index 0000000..3d3e3fe Binary files /dev/null and b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102133907.png differ diff --git a/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102246482.png b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102246482.png new file mode 100644 index 0000000..fcc22a7 Binary files /dev/null and b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102246482.png differ diff --git a/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102446287.png b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102446287.png new file mode 100644 index 0000000..349150d Binary files /dev/null and b/javaEE/day05/SpringBootWeb请求响应-inmind.assets/image-20250620102446287.png differ diff --git a/javaEE/day05/SpringBootWeb请求响应.md b/javaEE/day05/SpringBootWeb请求响应.md new file mode 100644 index 0000000..8f482ce --- /dev/null +++ b/javaEE/day05/SpringBootWeb请求响应.md @@ -0,0 +1,1773 @@ +# SpringBootWeb请求响应 + + + + +## 前言 + +在上一次的课程中,我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。 + +![image-20220826161735076](assets/image-20220826161735076.png) + +其实呢,是我们在浏览器发起请求,请求了我们的后端web服务器(也就是内置的Tomcat)。而我们在开发web程序时呢,定义了一个控制器类Controller,请求会被部署在Tomcat中的Controller接收,然后Controller再给浏览器一个响应,响应一个字符串 “Hello World”。 而在请求响应的过程中是遵循HTTP协议的。 + +但是呢,这里要告诉大家的时,其实在Tomcat这类Web服务器中,是不识别我们自己定义的Controller的。但是我们前面讲到过Tomcat是一个Servlet容器,是支持Serlvet规范的,所以呢,在tomcat中是可以识别 Servlet程序的。 那我们所编写的XxxController 是如何处理请求的,又与Servlet之间有什么联系呢? + +其实呢,在SpringBoot进行web程序开发时,它内置了一个核心的Servlet程序 DispatcherServlet,称之为 核心控制器。 DispatcherServlet 负责接收页面发送的请求,然后根据执行的规则,将请求再转发给后面的请求处理器Controller,请求处理器处理完请求之后,最终再由DispatcherServlet给浏览器响应数据。 + +![image-20220826165340157](assets/image-20220826165340157.png) + +那将来浏览器发送请求,会携带请求数据,包括:请求行、请求头;请求到达tomcat之后,tomcat会负责解析这些请求数据,然后呢将解析后的请求数据会传递给Servlet程序的HttpServletRequest对象,那也就意味着 HttpServletRequest 对象就可以获取到请求数据。 而Tomcat,还给Servlet程序传递了一个参数 HttpServletResponse,通过这个对象,我们就可以给浏览器设置响应数据 。 + +![image-20220826171407354](assets/image-20220826171407354.png) + +那上述所描述的这种浏览器/服务器的架构模式呢,我们称之为:BS架构。 + +![image-20220826171454775](assets/image-20220826171454775.png) + +• BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 + +那今天呢,我们的课程内容主要就围绕着:请求、响应进行。 今天课程内容,主要包含三个部分: + +> - 请求 +> - 响应 +> - 分层解耦 + + + + + + + + + + + +## 1. 请求 + +在本章节呢,我们主要讲解,如何接收页面传递过来的请求数据。 + +### 1.1 Postman + +之前我们课程中有提到当前最为主流的开发模式:前后端分离 + +![image-20221203095553048](assets/image-20221203095553048.png) + +在这种模式下,前端技术人员基于"接口文档",开发前端程序;后端技术人员也基于"接口文档",开发后端程序。 + +由于前后端分离,对我们后端技术人员来讲,在开发过程中,是没有前端页面的,那我们怎么测试自己所开发的程序呢? + +方式1:像之前SpringBoot入门案例中一样,直接使用浏览器。在浏览器中输入地址,测试后端程序。 + +- 弊端:在浏览器地址栏中输入地址这种方式都是GET请求,如何我们要用到POST请求怎么办呢? + - 要解决POST请求,需要程序员自己编写前端代码(比较麻烦) + +方式2:使用专业的接口测试工具(课程中我们使用Postman工具) + +#### 1.1.1 介绍 + +![image-20220826173003949](assets/image-20220826173003949.png) + +- Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 + + > Postman原是Chrome浏览器的插件,可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求 + > + > 使用Postman还可以在发起请求时,携带一些请求参数、请求头等信息 + +- 作用:常用于进行接口测试 + +- 特征 + + - 简单 + - 实用 + - 美观 + - 大方 + + + +#### 1.1.2 安装 + +![image-20220826173919556](assets/image-20220826173919556.png) + +双击资料中提供的`Postman-win64-8.3.1-Setup.exe`即可自动安装。 + +![image-20220826174601266](assets/image-20220826174601266.png) + +安装完成之后,进入页面中会提示有新版本可以升级(无需升级) + +![image-20220826174900779](assets/image-20220826174900779.png) + +![image-20221203112117979](assets/image-20221203112117979.png) + +界面介绍: + +![image-20220826175306141](assets/image-20220826175306141.png) + + + +**如果我们需要将测试的请求信息保存下来,就需要创建一个postman的账号,然后登录之后才可以。** + +![image-20221203103623435](assets/image-20221203103623435.png) + +![image-20221203112252985](assets/image-20221203112252985.png) + +![image-20221203112320687](assets/image-20221203112320687.png) + +登录完成之后,可以创建工作空间: + +![image-20221203113552785](assets/image-20221203113552785.png) + +![image-20221203113925733](assets/image-20221203113925733.png) + +![image-20221203113847126](assets/image-20221203113847126.png) + +创建请求: + +![image-20221203114031824](assets/image-20221203114031824.png) + +点击"Save",保存当前请求 + +![image-20221203114231572](assets/image-20221203114231572.png) + +![image-20221203114806665](assets/image-20221203114806665.png) + +![image-20221203114852752](assets/image-20221203114852752.png) + +![image-20221203115001098](assets/image-20221203115001098.png) + +![image-20221203115041949](assets/image-20221203115041949.png) + +![image-20221203115110440](assets/image-20221203115110440.png) + + + + + + + +### 1.2 简单参数 + +简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。 + +![image-20220826180550583](assets/image-20220826180550583.png) + +那么在后端程序中,如何接收传递过来的普通参数数据呢? + +我们在这里讲解两种方式: + +1. 原始方式 +2. SpringBoot方式 + +#### 1.2.1 原始方式 + +在原始的Web程序当中,需要通过Servlet中提供的API:HttpServletRequest(请求对象),获取请求的相关信息。比如获取请求参数: + +> Tomcat接收到http请求时:把请求的相关信息封装到HttpServletRequest对象中 + +在Controller中,我们要想获取Request对象,可以直接在方法的形参中声明 HttpServletRequest 对象。然后就可以通过该对象来获取请求信息: + +```json +//根据指定的参数名获取请求参数的数据值 +String request.getParameter("参数名") +``` + +```java +@RestController +public class RequestController { + //原始方式 + @RequestMapping("/simpleParam") + public String simpleParam(HttpServletRequest request){ + // http://localhost:8080/simpleParam?name=Tom&age=10 + // 请求参数: name=Tom&age=10 (有2个请求参数) + // 第1个请求参数: name=Tom 参数名:name,参数值:Tom + // 第2个请求参数: age=10 参数名:age , 参数值:10 + + String name = request.getParameter("name");//name就是请求参数名 + String ageStr = request.getParameter("age");//age就是请求参数名 + + int age = Integer.parseInt(ageStr);//需要手动进行类型转换 + System.out.println(name+" : "+age); + return "OK"; + } +} +``` + +> 以上这种方式,我们仅做了解。(在以后的开发中不会使用到) + + + +#### 1.2.2 SpringBoot方式 + +在Springboot的环境中,对原始的API进行了封装,接收参数的形式更加简单。 如果是简单参数,参数名与形参变量名相同,定义同名的形参即可接收参数。 + +~~~java +@RestController +public class RequestController { + // http://localhost:8080/simpleParam?name=Tom&age=10 + // 第1个请求参数: name=Tom 参数名:name,参数值:Tom + // 第2个请求参数: age=10 参数名:age , 参数值:10 + + //springboot方式 + @RequestMapping("/simpleParam") + public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致 + System.out.println(name+" : "+age); + return "OK"; + } +} +~~~ + +**postman测试( GET 请求):** + +![image-20221203122405075](assets/image-20221203122405075.png) + +**postman测试( POST请求 ):** + +![image-20220826181117898](assets/image-20220826181117898.png) + +> **结论:不论是GET请求还是POST请求,对于简单参数来讲,只要保证==请求参数名和Controller方法中的形参名保持一致==,就可以获取到请求参数中的数据值。** + + + +#### 1.2.3 参数名不一致 + +如果方法形参名称与请求参数名称不一致,controller方法中的形参还能接收到请求参数值吗? + +~~~java +@RestController +public class RequestController { + // http://localhost:8080/simpleParam?name=Tom&age=20 + // 请求参数名:name + + //springboot方式 + @RequestMapping("/simpleParam") + public String simpleParam(String username , Integer age ){//请求参数名和形参名不相同 + System.out.println(username+" : "+age); + return "OK"; + } +} +~~~ + +答案:运行没有报错。 controller方法中的username值为:null,age值为20 + +- 结论:对于简单参数来讲,请求参数名和controller方法中的形参名不一致时,无法接收到请求数据 + +那么如果我们开发中,遇到了这种请求参数名和controller方法中的形参名不相同,怎么办? + +解决方案:可以使用Spring提供的@RequestParam注解完成映射 + +在方法形参前面加上 @RequestParam 然后通过value属性执行请求参数名,从而完成映射。代码如下: + +```java +@RestController +public class RequestController { + // http://localhost:8080/simpleParam?name=Tom&age=20 + // 请求参数名:name + + //springboot方式 + @RequestMapping("/simpleParam") + public String simpleParam(@RequestParam("name") String username , Integer age ){ + System.out.println(username+" : "+age); + return "OK"; + } +} +``` + +> **注意事项:** +> +> @RequestParam中的required属性默认为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错 +> +> ![image-20221203130726310](assets/image-20221203130726310.png) +> +> 如果该参数是可选的,可以将required属性设置为false +> +> ~~~java +> @RequestMapping("/simpleParam") +> public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){ +> System.out.println(username+ ":" + age); +> return "OK"; +> } +> ~~~ + + + + + + + +### 1.3 实体参数 + +在使用简单参数做为数据传递方式时,前端传递了多少个请求参数,后端controller方法中的形参就要书写多少个。如果请求参数比较多,通过上述的方式一个参数一个参数的接收,会比较繁琐。 + +此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:**请求参数名与实体类的属性名相同** + +![image-20221203131954932](assets/image-20221203131954932.png) + +#### 1.3.1 简单实体对象 + +定义POJO实体类: + +```java +public class User { + private String name; + private Integer age; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "User{" + + "name='" + name + '\'' + + ", age=" + age + + '}'; + } +} + +``` + +Controller方法: + +```java +@RestController +public class RequestController { + //实体参数:简单实体对象 + @RequestMapping("/simplePojo") + public String simplePojo(User user){ + System.out.println(user); + return "OK"; + } +} +``` + +Postman测试: + +- 参数名和实体类属性名一致时 + +![image-20221203161246168](assets/image-20221203161246168.png) + +- 参数名和实体类属性名不一致时 + +![image-20221203161004349](assets/image-20221203161004349.png) + + + + + +#### 1.3.2 复杂实体对象 + +上面我们讲的呢是简单的实体对象,下面我们在来学习下复杂的实体对象。 + +复杂实体对象指的是,在实体类中有一个或多个属性,也是实体对象类型的。如下: + +- User类中有一个Address类型的属性(Address是一个实体类) + +![image-20221203160447953](assets/image-20221203160447953.png) + +复杂实体对象的封装,需要遵守如下规则: + +- **请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套实体类属性参数。** + +定义POJO实体类: + +- Address实体类 + +```java +public class Address { + private String province; + private String city; + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + '}'; + } +} +``` + +- User实体类 + +```java +public class User { + private String name; + private Integer age; + private Address address; //地址对象 + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + @Override + public String toString() { + return "User{" + + "name='" + name + '\'' + + ", age=" + age + + ", address=" + address + + '}'; + } +} +``` + +Controller方法: + +```java +@RestController +public class RequestController { + //实体参数:复杂实体对象 + @RequestMapping("/complexPojo") + public String complexPojo(User user){ + System.out.println(user); + return "OK"; + } +} +``` + +Postman测试: + +![image-20221203162706175](assets/image-20221203162706175.png) + + + + + +### 1.4 数组集合参数 + +数组集合参数的使用场景:在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。 + +![image-20221203164114083](assets/image-20221203164114083.png) + +多个值是怎么提交的呢?其实多个值也是一个一个的提交。 + +![image-20221203164944144](assets/image-20221203164944144.png) + +后端程序接收上述多个值的方式有两种: + +1. 数组 +2. 集合 + + + +#### 1.4.1 数组 + +数组参数:**请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数** + +![image-20221203190218468](assets/image-20221203190218468.png) + +Controller方法: + +```java +@RestController +public class RequestController { + //数组集合参数 + @RequestMapping("/arrayParam") + public String arrayParam(String[] hobby){ + System.out.println(Arrays.toString(hobby)); + return "OK"; + } +} +``` + +Postman测试: + +在前端请求时,有两种传递形式: + +方式一: xxxxxxxxxx?hobby=game&hobby=java + +![image-20221203191732601](assets/image-20221203191732601.png) + +方式二:xxxxxxxxxxxxx?hobby=game,java + +![image-20221203191822996](assets/image-20221203191822996.png) + + + + + +#### 1.4.2 集合 + +集合参数:**请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系** + +> 默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用@RequestParam绑定参数关系 + +![image-20221203211640646](assets/image-20221203211640646.png) + +Controller方法: + +```java +@RestController +public class RequestController { + //数组集合参数 + @RequestMapping("/listParam") + public String listParam(@RequestParam List hobby){ + System.out.println(hobby); + return "OK"; + } +} +``` + +Postman测试: + +方式一: xxxxxxxxxx?hobby=game&hobby=java + +![image-20221203212221939](assets/image-20221203212221939.png) + +方式二:xxxxxxxxxxxxx?hobby=game,java + +![image-20221203212024679](assets/image-20221203212024679.png) + + + + + +### 1.5 日期参数 + +上述演示的都是一些普通的参数,在一些特殊的需求中,可能会涉及到日期类型数据的封装。比如,如下需求: + +![image-20220826194159343](assets/image-20220826194159343.png) + +因为日期的格式多种多样(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。 + +![image-20221203213120692](assets/image-20221203213120692.png) + +- @DateTimeFormat注解的pattern属性中指定了哪种日期格式,前端的日期参数就必须按照指定的格式传递。 +- 后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。 + +Controller方法: + +```java +@RestController +public class RequestController { + //日期时间参数 + @RequestMapping("/dateParam") + public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){ + System.out.println(updateTime); + return "OK"; + } +} +``` + +Postman测试: + +![image-20221203214600716](assets/image-20221203214600716.png) + + + + + +### 1.6 JSON参数 + +在学习前端技术时,我们有讲到过JSON,而在前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。 (JSON是开发中最常用的前后端数据交互方式) + +我们学习JSON格式参数,主要从以下两个方面着手: + +1. Postman在发送请求时,如何传递json格式的请求参数 +2. 在服务端的controller方法中,如何接收json格式的请求参数 + +Postman发送JSON格式数据: + +![image-20221203225623337](assets/image-20221203225623337.png) + +服务端Controller方法接收JSON格式数据: + +- 传递json格式的参数,在Controller中会使用实体类进行封装。 +- 封装规则:**JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。** + +![image-20221203230457901](assets/image-20221203230457901.png) + +- @RequestBody注解:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致) + +实体类:Address + +```java +public class Address { + private String province; + private String city; + + //省略GET , SET 方法 +} +``` + +实体类:User + +```java +public class User { + private String name; + private Integer age; + private Address address; + + //省略GET , SET 方法 +} +``` + +Controller方法: + +```java +@RestController +public class RequestController { + //JSON参数 + @RequestMapping("/jsonParam") + public String jsonParam(@RequestBody User user){ + System.out.println(user); + return "OK"; + } +} +``` + +Postman测试: + +![image-20221203231803000](assets/image-20221203231803000.png) + + + + + +### 1.7 路径参数 + +传统的开发中请求参数是放在请求体(POST请求)传递或跟在URL后面通过?key=value的形式传递(GET请求)。 + +![image-20221203235715804](assets/image-20221203235715804.png) + +在现在的开发中,经常还会直接在请求的URL中传递参数。例如: + +~~~ +http://localhost:8080/user/1 +http://localhost:880/user/1/0 +~~~ + +上述的这种传递请求参数的形式呢,我们称之为:路径参数。 + +学习路径参数呢,主要掌握在后端的controller方法中,如何接收路径参数。 + +路径参数: + +- 前端:通过请求URL直接传递参数 +- 后端:使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数 + +![image-20221204001520756](assets/image-20221204001520756.png) + +Controller方法: + +```java +@RestController +public class RequestController { + //路径参数 + @RequestMapping("/path/{id}") + public String pathParam(@PathVariable Integer id){ + System.out.println(id); + return "OK"; + } +} +``` + +Postman测试: + +![image-20221204002040184](assets/image-20221204002040184.png) + + + +**传递多个路径参数:** + +Postman: + +![image-20221204002306288](assets/image-20221204002306288.png) + +Controller方法: + +~~~java +@RestController +public class RequestController { + //路径参数 + @RequestMapping("/path/{id}/{name}") + public String pathParam2(@PathVariable Integer id, @PathVariable String name){ + System.out.println(id+ " : " +name); + return "OK"; + } +} +~~~ + + + + + +## 2. 响应 + +前面我们学习过HTTL协议的交互方式:请求响应模式(有请求就有响应) + +那么Controller程序呢,除了接收请求外,还可以进行响应。 + +### 2.1 @ResponseBody + +在我们前面所编写的controller方法中,都已经设置了响应数据。 + +![image-20221204100656376](assets/image-20221204100656376.png) + +controller方法中的return的结果,怎么就可以响应给浏览器呢? + +答案:使用@ResponseBody注解 + +**@ResponseBody注解:** + +- 类型:方法注解、类注解 +- 位置:书写在Controller方法上或类上 +- 作用:将方法返回值直接响应给浏览器 + - 如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器 + +但是在我们所书写的Controller中,只在类上添加了@RestController注解、方法添加了@RequestMapping注解,并没有使用@ResponseBody注解,怎么给浏览器响应呢? + +~~~java +@RestController +public class HelloController { + @RequestMapping("/hello") + public String hello(){ + System.out.println("Hello World ~"); + return "Hello World ~"; + } +} +~~~ + +原因:在类上添加的@RestController注解,是一个组合注解。 + +- @RestController = @Controller + @ResponseBody + +@RestController源码: + +~~~java +@Target({ElementType.TYPE}) //元注解(修饰注解的注解) +@Retention(RetentionPolicy.RUNTIME) //元注解 +@Documented //元注解 +@Controller +@ResponseBody +public @interface RestController { + @AliasFor( + annotation = Controller.class + ) + String value() default ""; +} +~~~ + +结论:在类上添加@RestController就相当于添加了@ResponseBody注解。 + +- 类上有@RestController注解或@ResponseBody注解时:表示当前类下所有的方法返回值做为响应数据 + - 方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器 + + + +下面我们来测试下响应数据: + +~~~java +@RestController +public class ResponseController { + //响应字符串 + @RequestMapping("/hello") + public String hello(){ + System.out.println("Hello World ~"); + return "Hello World ~"; + } + //响应实体对象 + @RequestMapping("/getAddr") + public Address getAddr(){ + Address addr = new Address();//创建实体类对象 + addr.setProvince("广东"); + addr.setCity("深圳"); + return addr; + } + //响应集合数据 + @RequestMapping("/listAddr") + public List
listAddr(){ + List
list = new ArrayList<>();//集合对象 + + Address addr = new Address(); + addr.setProvince("广东"); + addr.setCity("深圳"); + + Address addr2 = new Address(); + addr2.setProvince("陕西"); + addr2.setCity("西安"); + + list.add(addr); + list.add(addr2); + return list; + } +} +~~~ + +在服务端响应了一个对象或者集合,那私前端获取到的数据是什么样子的呢?我们使用postman发送请求来测试下。测试效果如下: + +![image-20221204172339375](assets/image-20221204172339375.png) + +![image-20221204172705426](assets/image-20221204172705426.png) + + + +### 2.2 统一响应结果 + +大家有没有发现一个问题,我们在前面所编写的这些Controller方法中,返回值各种各样,没有任何的规范。 + +![image-20221204174052622](assets/image-20221204174052622.png) + +如果我们开发一个大型项目,项目中controller方法将成千上万,使用上述方式将造成整个项目难以维护。那在真实的项目开发中是什么样子的呢? + +在真实的项目开发中,无论是哪种方法,我们都会定义一个统一的返回结果。方案如下: + +![image-20221204174537686](assets/image-20221204174537686.png) + +> 前端:只需要按照统一格式的返回结果进行解析(仅一种解析方案),就可以拿到数据。 + +统一的返回结果使用类来描述,在这个结果中包含: + +- 响应状态码:当前请求是成功,还是失败 + +- 状态码信息:给页面的提示信息 + +- 返回的数据:给前端响应的数据(字符串、对象、集合) + +定义在一个实体类Result来包含以上信息。代码如下: + +```java +public class Result { + private Integer code;//响应码,1 代表成功; 0 代表失败 + private String msg; //响应码 描述字符串 + private Object data; //返回的数据 + + public Result() { } + public Result(Integer code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + //增删改 成功响应(不需要给前端返回数据) + public static Result success(){ + return new Result(1,"success",null); + } + //查询 成功响应(把查询结果做为返回数据响应给前端) + public static Result success(Object data){ + return new Result(1,"success",data); + } + //失败响应 + public static Result error(String msg){ + return new Result(0,msg,null); + } +} +``` + +改造Controller: + +~~~java +@RestController +public class ResponseController { + //响应统一格式的结果 + @RequestMapping("/hello") + public Result hello(){ + System.out.println("Hello World ~"); + //return new Result(1,"success","Hello World ~"); + return Result.success("Hello World ~"); + } + + //响应统一格式的结果 + @RequestMapping("/getAddr") + public Result getAddr(){ + Address addr = new Address(); + addr.setProvince("广东"); + addr.setCity("深圳"); + return Result.success(addr); + } + + //响应统一格式的结果 + @RequestMapping("/listAddr") + public Result listAddr(){ + List
list = new ArrayList<>(); + + Address addr = new Address(); + addr.setProvince("广东"); + addr.setCity("深圳"); + + Address addr2 = new Address(); + addr2.setProvince("陕西"); + addr2.setCity("西安"); + + list.add(addr); + list.add(addr2); + return Result.success(list); + } +} +~~~ + +使用Postman测试: + +![image-20221204180946963](assets/image-20221204180946963.png) + +![image-20221204180744084](assets/image-20221204180744084.png) + + + + + +### 2.3 案例 + +下面我们通过一个案例,来加强对请求响应的学习。 + +#### 2.3.1 需求说明 + +需求:加载并解析xml文件中的数据,完成数据处理,并在页面展示 + +![image-20221204185928260](assets/image-20221204185928260.png) + +- 获取员工数据,返回统一响应结果,在页面渲染展示 + + + +#### 2.3.2 准备工作 + +案例准备: + +1. XML文件 + - 已经准备好(emp.xml),直接导入进来,放在 src/main/resources目录下 +2. 工具类 + - 已经准备好解析XML文件的工具类,无需自己实现 + - 直接在创建一个包 com.inmind.utils ,然后将工具类拷贝进来 + +3. 前端页面资源 + - 已经准备好,直接拷贝进来,放在src/main/resources下的static目录下 + +Springboot项目的静态资源(html,css,js等前端资源)默认存放目录为:classpath:/static 、 classpath:/public、 classpath:/resources + +> 在SpringBoot项目中,静态资源默认可以存放的目录: +> +> - classpath:/static/ +> - classpath:/public/ +> - classpath:/resources/ +> - classpath:/META-INF/resources/ +> +> classpath: +> +> - 代表的是类路径,在maven的项目中,其实指的就是 src/main/resources 或者 src/main/java,但是java目录是存放java代码的,所以相关的配置文件及静态资源文档,就放在 src/main/resources下。 + + + +#### 2.3.3 实现步骤 + +1. 在pom.xml文件中引入dom4j的依赖,用于解析XML文件 + + ~~~xml + + org.dom4j + dom4j + 2.1.3 + + ~~~ + +2. 引入资料中提供的:解析XML的工具类XMLParserUtils、实体类Emp、XML文件emp.xml + + ![image-20250620102023027](\SpringBootWeb请求响应-inmind.assets\image-20250620102023027.png) + +3. 引入资料中提供的静态页面文件,放在resources下的static目录下 + + ![image-20250620102133907](\SpringBootWeb请求响应-inmind.assets\image-20250620102133907.png) + +4. 创建EmpController类,编写Controller程序,处理请求,响应数据 + + ![image-20250620102246482](\SpringBootWeb请求响应-inmind.assets\image-20250620102246482.png) + + + +#### 2.3.4 代码实现 + +Contriller代码: + +```java +@RestController +public class EmpController { + @RequestMapping("/listEmp") + public Result list(){ + //1. 加载并解析emp.xml + String file = this.getClass().getClassLoader().getResource("emp.xml").getFile(); + //System.out.println(file); + List empList = XmlParserUtils.parse(file, Emp.class); + + //2. 对数据进行转换处理 - gender, job + empList.stream().forEach(emp -> { + //处理 gender 1: 男, 2: 女 + String gender = emp.getGender(); + if("1".equals(gender)){ + emp.setGender("男"); + }else if("2".equals(gender)){ + emp.setGender("女"); + } + + //处理job - 1: 讲师, 2: 班主任 , 3: 就业指导 + String job = emp.getJob(); + if("1".equals(job)){ + emp.setJob("讲师"); + }else if("2".equals(job)){ + emp.setJob("班主任"); + }else if("3".equals(job)){ + emp.setJob("就业指导"); + } + }); + //3. 响应数据 + return Result.success(empList); + } +} +``` + +统一返回结果实体类: + +~~~java +public class Result { + private Integer code ;//1 成功 , 0 失败 + private String msg; //提示信息 + private Object data; //数据 date + + public Result() { + } + public Result(Integer code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + public Integer getCode() { + return code; + } + public void setCode(Integer code) { + this.code = code; + } + public String getMsg() { + return msg; + } + public void setMsg(String msg) { + this.msg = msg; + } + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public static Result success(Object data){ + return new Result(1, "success", data); + } + public static Result success(){ + return new Result(1, "success", null); + } + public static Result error(String msg){ + return new Result(0, msg, null); + } +} +~~~ + + + +#### 2.3.5 测试 + +代码编写完毕之后,我们就可以运行引导类,启动服务进行测试了。 + +使用Postman测试: + +![image-20221204190341389](assets/image-20221204190341389.png) + +打开浏览器,在浏览器地址栏输入: http://localhost:8080/emp.html + +![image-20221204185455556](assets/image-20221204185455556.png) + + + + + +#### 2.3.6 问题分析 + +上述案例的功能,我们虽然已经实现,但是呢,我们会发现案例中:解析XML数据,获取数据的代码,处理数据的逻辑的代码,给页面响应的代码全部都堆积在一起了,全部都写在controller方法中了。 + +![image-20221204190712411](assets/image-20221204190712411.png) + +当前程序的这个业务逻辑还是比较简单的,如果业务逻辑再稍微复杂一点,我们会看到Controller方法的代码量就很大了。 + +- 当我们要修改操作数据部分的代码,需要改动Controller + +- 当我们要完善逻辑处理部分的代码,需要改动Controller + +- 当我们需要修改数据响应的代码,还是需要改动Controller + +这样呢,就会造成我们整个工程代码的复用性比较差,而且代码难以维护。 那如何解决这个问题呢?其实在现在的开发中,有非常成熟的解决思路,那就是分层开发。 + + + + + +## 3. 分层解耦 + +### 3.1 三层架构 + +#### 3.1.1 介绍 + +在我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。 + +> 单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。 +> +> 这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利用后期的维护。 + +我们之前开发的程序呢,并不满足单一职责原则。下面我们来分析下之前的程序: + +![image-20221204191650390](assets/image-20221204191650390.png) + +那其实我们上述案例的处理逻辑呢,从组成上看可以分为三个部分: + +- 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作。 +- 逻辑处理:负责业务逻辑处理的代码。 +- 请求处理、响应数据:负责,接收页面的请求,给页面响应数据。 + +按照上述的三个组成部分,在我们项目开发中呢,可以将代码分为三层: + +![image-20221204193837678](assets/image-20221204193837678.png) + +- Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。 +- Service:业务逻辑层。处理具体的业务逻辑。 +- Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。 + + + +基于三层架构的程序执行流程: + +![image-20221204194207812](assets/image-20221204194207812.png) + +- 前端发起的请求,由Controller层接收(Controller响应数据给前端) +- Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层) +- Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取) +- Dao层操作文件中的数据(Dao拿到的数据会返回给Service层) + +> 思考:按照三层架构的思想,如何要对业务逻辑(Service层)进行变更,会影响到Controller层和Dao层吗? +> +> 答案:不会影响。 (程序的扩展性、维护性变得更好了) + + + + + +#### 3.1.2 代码拆分 + +我们使用三层架构思想,来改造下之前的程序: + +- 控制层包名:xxxx.controller +- 业务逻辑层包名:xxxx.service +- 数据访问层包名:xxxx.dao + +)![image-20250620102446287](\SpringBootWeb请求响应-inmind.assets\image-20250620102446287.png) + +**控制层:**接收前端发送的请求,对请求进行处理,并响应数据 + +```java +@RestController +public class EmpController { + //业务层对象 + private EmpService empService = new EmpServiceA(); + + @RequestMapping("/listEmp") + public Result list(){ + //1. 调用service层, 获取数据 + List empList = empService.listEmp(); + + //3. 响应数据 + return Result.success(empList); + } +} +``` + +**业务逻辑层:**处理具体的业务逻辑 + +- 业务接口 + +~~~java +//业务逻辑接口(制定业务标准) +public interface EmpService { + //获取员工列表 + public List listEmp(); +} +~~~ + +- 业务实现类 + +```java +//业务逻辑实现类(按照业务标准实现) +public class EmpServiceA implements EmpService { + //dao层对象 + private EmpDao empDao = new EmpDaoA(); + + @Override + public List listEmp() { + //1. 调用dao, 获取数据 + List empList = empDao.listEmp(); + + //2. 对数据进行转换处理 - gender, job + empList.stream().forEach(emp -> { + //处理 gender 1: 男, 2: 女 + String gender = emp.getGender(); + if("1".equals(gender)){ + emp.setGender("男"); + }else if("2".equals(gender)){ + emp.setGender("女"); + } + + //处理job - 1: 讲师, 2: 班主任 , 3: 就业指导 + String job = emp.getJob(); + if("1".equals(job)){ + emp.setJob("讲师"); + }else if("2".equals(job)){ + emp.setJob("班主任"); + }else if("3".equals(job)){ + emp.setJob("就业指导"); + } + }); + return empList; + } +} +``` + +**数据访问层:**负责数据的访问操作,包含数据的增、删、改、查 + +- 数据访问接口 + +~~~java +//数据访问层接口(制定标准) +public interface EmpDao { + //获取员工列表数据 + public List listEmp(); +} +~~~ + +- 数据访问实现类 + +```java +//数据访问实现类 +public class EmpDaoA implements EmpDao { + @Override + public List listEmp() { + //1. 加载并解析emp.xml + String file = this.getClass().getClassLoader().getResource("emp.xml").getFile(); + System.out.println(file); + List empList = XmlParserUtils.parse(file, Emp.class); + return empList; + } +} +``` + +![image-20221204201342490](assets/image-20221204201342490.png) + +三层架构的好处: + +1. 复用性强 +2. 便于维护 +3. 利用扩展 + + + + + +### 3.2 分层解耦 + +刚才我们学习过程序分层思想了,接下来呢,我们来学习下程序的解耦思想。 + +解耦:解除耦合。 + +#### 3.2.1 耦合问题 + +首先需要了解软件开发涉及到的两个概念:内聚和耦合。 + +- 内聚:软件中各个功能模块内部的功能联系。 + +- 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。 + +**软件设计原则:高内聚低耦合。** + +> 高内聚指的是:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 "高内聚"。 +> +> 低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。 + +程序中高内聚的体现: + +- EmpServiceA类中只编写了和员工相关的逻辑处理代码 + +![image-20221204202531571](assets/image-20221204202531571.png) + +程序中耦合代码的体现: + +- 把业务类变为EmpServiceB时,需要修改controller层中的代码 + +![image-20221204203904900](assets/image-20221204203904900.png) + +高内聚、低耦合的目的是使程序模块的可重用性、移植性大大增强。 + +![](assets/image-20220828215549593.png) + + + + + +#### 3.2.2 解耦思路 + +之前我们在编写代码时,需要什么对象,就直接new一个就可以了。 这种做法呢,层与层之间代码就耦合了,当service层的实现变了之后, 我们还需要修改controller层的代码。 + +![image-20221204204916033](assets/image-20221204204916033.png) + + 那应该怎么解耦呢? + +- 首先不能在EmpController中使用new对象。代码如下: + +![image-20221204205328069](assets/image-20221204205328069.png) + +- 此时,就存在另一个问题了,不能new,就意味着没有业务层对象(程序运行就报错),怎么办呢? + - 我们的解决思路是: + - 提供一个容器,容器中存储一些对象(例:EmpService对象) + - controller程序从容器中获取EmpService类型的对象 + +我们想要实现上述解耦操作,就涉及到Spring中的两个核心概念: + +- **控制反转:** Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。 + + > 对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器 + +- **依赖注入:** Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。 + + > 程序运行时需要某个资源,此时容器就为其提供这个资源。 + > + > 例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象 + +IOC容器中创建、管理的对象,称之为:bean对象 + + + + + +### 3.3 IOC&DI + +上面我们引出了Spring中IOC和DI的基本概念,下面我们就来具体学习下IOC和DI的代码实现。 + +#### 3.3.1 IOC&DI入门 + +任务:完成Controller层、Service层、Dao层的代码解耦 + +- 思路: + 1. 删除Controller层、Service层中new对象的代码 + 2. Service层及Dao层的实现类,交给IOC容器管理 + 3. 为Controller及Service注入运行时依赖的对象 + - Controller程序中注入依赖的Service层对象 + - Service程序中注入依赖的Dao层对象 + + + +第1步:删除Controller层、Service层中new对象的代码 + +![image-20221204212807207](assets/image-20221204212807207.png) + + + +第2步:Service层及Dao层的实现类,交给IOC容器管理 + +- 使用Spring提供的注解:@Component ,就可以实现类交给IOC容器管理 + +![image-20221204213328034](assets/image-20221204213328034.png) + + + +第3步:为Controller及Service注入运行时依赖的对象 + +- 使用Spring提供的注解:@Autowired ,就可以实现程序运行时IOC容器自动注入需要的依赖对象 + +![image-20221204213859112](assets/image-20221204213859112.png) + + + +完整的三层代码: + +- **Controller层:** + +~~~java +@RestController +public class EmpController { + + @Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量 + private EmpService empService ; + + @RequestMapping("/listEmp") + public Result list(){ + //1. 调用service, 获取数据 + List empList = empService.listEmp(); + + //3. 响应数据 + return Result.success(empList); + } +} +~~~ + +- **Service层:** + +~~~java +@Component //将当前对象交给IOC容器管理,成为IOC容器的bean +public class EmpServiceA implements EmpService { + + @Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量 + private EmpDao empDao ; + + @Override + public List listEmp() { + //1. 调用dao, 获取数据 + List empList = empDao.listEmp(); + + //2. 对数据进行转换处理 - gender, job + empList.stream().forEach(emp -> { + //处理 gender 1: 男, 2: 女 + String gender = emp.getGender(); + if("1".equals(gender)){ + emp.setGender("男"); + }else if("2".equals(gender)){ + emp.setGender("女"); + } + + //处理job - 1: 讲师, 2: 班主任 , 3: 就业指导 + String job = emp.getJob(); + if("1".equals(job)){ + emp.setJob("讲师"); + }else if("2".equals(job)){ + emp.setJob("班主任"); + }else if("3".equals(job)){ + emp.setJob("就业指导"); + } + }); + return empList; + } +} +~~~ + +**Dao层:** + +~~~java +@Component //将当前对象交给IOC容器管理,成为IOC容器的bean +public class EmpDaoA implements EmpDao { + @Override + public List listEmp() { + //1. 加载并解析emp.xml + String file = this.getClass().getClassLoader().getResource("emp.xml").getFile(); + System.out.println(file); + List empList = XmlParserUtils.parse(file, Emp.class); + return empList; + } +} +~~~ + + + +运行测试: + +- 启动SpringBoot引导类,打开浏览器,输入:http://localhost:8080/emp.html + +![image-20221204185455556](assets/image-20221204185455556.png) + + + + + + + +#### 3.3.2 IOC详解 + +通过IOC和DI的入门程序呢,我们已经基本了解了IOC和DI的基础操作。接下来呢,我们学习下IOC控制反转和DI依赖注入的细节。 + +##### 3.3.2.1 bean的声明 + +前面我们提到IOC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。 + +在之前的入门案例中,要把某个对象交给IOC容器管理,需要在类上添加一个注解:@Component + +而Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了@Component的衍生注解: + +- @Controller (标注在控制层类上) +- @Service (标注在业务层类上) +- @Repository (标注在数据访问层类上) + + + +修改入门案例代码: + +- **Controller层:** + +~~~java +@RestController //@RestController = @Controller + @ResponseBody +public class EmpController { + + @Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量 + private EmpService empService ; + + @RequestMapping("/listEmp") + public Result list(){ + //1. 调用service, 获取数据 + List empList = empService.listEmp(); + + //3. 响应数据 + return Result.success(empList); + } +} +~~~ + +- **Service层:** + +~~~java +@Service +public class EmpServiceA implements EmpService { + + @Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量 + private EmpDao empDao ; + + @Override + public List listEmp() { + //1. 调用dao, 获取数据 + List empList = empDao.listEmp(); + + //2. 对数据进行转换处理 - gender, job + empList.stream().forEach(emp -> { + //处理 gender 1: 男, 2: 女 + String gender = emp.getGender(); + if("1".equals(gender)){ + emp.setGender("男"); + }else if("2".equals(gender)){ + emp.setGender("女"); + } + + //处理job - 1: 讲师, 2: 班主任 , 3: 就业指导 + String job = emp.getJob(); + if("1".equals(job)){ + emp.setJob("讲师"); + }else if("2".equals(job)){ + emp.setJob("班主任"); + }else if("3".equals(job)){ + emp.setJob("就业指导"); + } + }); + return empList; + } +} +~~~ + +**Dao层:** + +~~~java +@Repository +public class EmpDaoA implements EmpDao { + @Override + public List listEmp() { + //1. 加载并解析emp.xml + String file = this.getClass().getClassLoader().getResource("emp.xml").getFile(); + System.out.println(file); + List empList = XmlParserUtils.parse(file, Emp.class); + return empList; + } +} +~~~ + + + +要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一: + +| 注解 | 说明 | 位置 | +| :---------- | -------------------- | ----------------------------------------------- | +| @Controller | @Component的衍生注解 | 标注在控制器类上 | +| @Service | @Component的衍生注解 | 标注在业务类上 | +| @Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) | +| @Component | 声明bean的基础注解 | 不属于以上三类时,用此注解 | + +> 查看源码:![image-20221204221320230](assets/image-20221204221320230.png) + +在IOC容器中,每一个Bean都有一个属于自己的名字,可以通过注解的value属性指定bean的名字。如果没有指定,默认为类名首字母小写。 + +![image-20221204222650873](assets/image-20221204222650873.png) + +> 注意事项: +> +> - 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。 +> - 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。 + + + + + +##### 3.3.2.2 组件扫描 + +问题:使用前面学习的四个注解声明的bean,一定会生效吗? + +答案:不一定。(原因:bean想要生效,还需要被组件扫描) + + + + 下面我们通过修改项目工程的目录结构,来测试bean对象是否生效: + +![image-20221204223602694](assets/image-20221204223602694.png) + +运行程序后,报错: + +![image-20221204223815554](assets/image-20221204223815554.png) + +为什么没有找到bean对象呢? + +- 使用四大注解声明的bean,要想生效,还需要被组件扫描注解@ComponentScan扫描 + +> @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中,==**默认扫描的范围是SpringBoot启动类所在包及其子包**==。 +> +> ![image-20221204224643683](assets/image-20221204224643683.png) + +- 解决方案:手动添加@ComponentScan注解,指定要扫描的包 (==仅做了解,不推荐==) + +![image-20221204225437297](assets/image-20221204225437297.png) + + + +推荐做法(如下图): + +- 将我们定义的controller,service,dao这些包呢,都放在引导类所在包com.inmind的子包下,这样我们定义的bean就会被自动的扫描到 + +![image-20221204225815624](assets/image-20221204225815624.png) + + + + + +#### 3.3.3 DI详解 + +上一小节我们讲解了控制反转IOC的细节,接下来呢,我们学习依赖注解DI的细节。 + +依赖注入,是指IOC容器要为应用程序去提供运行时所依赖的资源,而资源指的就是对象。 + +在入门程序案例中,我们使用了@Autowired这个注解,完成了依赖注入的操作,而这个Autowired翻译过来叫:自动装配。 + +@Autowired注解,默认是按照**类型**进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作) + +> 入门程序举例:在EmpController运行的时候,就要到IOC容器当中去查找EmpService这个类型的对象,而我们的IOC容器中刚好有一个EmpService这个类型的对象,所以就找到了这个类型的对象完成注入操作。 + + + +那如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢? + +![image-20221204232154445](assets/image-20221204232154445.png) + +- 程序运行会报错 + +![image-20221204231616724](assets/image-20221204231616724.png) + + + +如何解决上述问题呢?Spring提供了以下几种解决方案: + +- @Primary + +- @Qualifier + +- @Resource + + + +使用@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。 + +![image-20221204232501679](assets/image-20221204232501679.png) + + + +使用@Qualifier注解:指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。 + +- @Qualifier注解不能单独使用,必须配合@Autowired使用 + +![image-20221204233333606](assets/image-20221204233333606.png) + + + +使用@Resource注解:是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。 + +![image-20221204233637735](assets/image-20221204233637735.png) + + + +> 面试题 : @Autowird 与 @Resource的区别 +> +> - @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解 +> - @Autowired 默认是按照类型注入,而@Resource是按照名称注入 + + + + + + + + + + + diff --git a/javaEE/day05/assets/image-20220826161735076.png b/javaEE/day05/assets/image-20220826161735076.png new file mode 100644 index 0000000..9bf6ef2 Binary files /dev/null and b/javaEE/day05/assets/image-20220826161735076.png differ diff --git a/javaEE/day05/assets/image-20220826165340157.png b/javaEE/day05/assets/image-20220826165340157.png new file mode 100644 index 0000000..5c4fe77 Binary files /dev/null and b/javaEE/day05/assets/image-20220826165340157.png differ diff --git a/javaEE/day05/assets/image-20220826171407354.png b/javaEE/day05/assets/image-20220826171407354.png new file mode 100644 index 0000000..6908871 Binary files /dev/null and b/javaEE/day05/assets/image-20220826171407354.png differ diff --git a/javaEE/day05/assets/image-20220826171454775.png b/javaEE/day05/assets/image-20220826171454775.png new file mode 100644 index 0000000..9554ef3 Binary files /dev/null and b/javaEE/day05/assets/image-20220826171454775.png differ diff --git a/javaEE/day05/assets/image-20220826173003949.png b/javaEE/day05/assets/image-20220826173003949.png new file mode 100644 index 0000000..8c589be Binary files /dev/null and b/javaEE/day05/assets/image-20220826173003949.png differ diff --git a/javaEE/day05/assets/image-20220826173919556.png b/javaEE/day05/assets/image-20220826173919556.png new file mode 100644 index 0000000..21c90b5 Binary files /dev/null and b/javaEE/day05/assets/image-20220826173919556.png differ diff --git a/javaEE/day05/assets/image-20220826174601266.png b/javaEE/day05/assets/image-20220826174601266.png new file mode 100644 index 0000000..cca9698 Binary files /dev/null and b/javaEE/day05/assets/image-20220826174601266.png differ diff --git a/javaEE/day05/assets/image-20220826174900779.png b/javaEE/day05/assets/image-20220826174900779.png new file mode 100644 index 0000000..e7aa735 Binary files /dev/null and b/javaEE/day05/assets/image-20220826174900779.png differ diff --git a/javaEE/day05/assets/image-20220826175306141.png b/javaEE/day05/assets/image-20220826175306141.png new file mode 100644 index 0000000..2dc4114 Binary files /dev/null and b/javaEE/day05/assets/image-20220826175306141.png differ diff --git a/javaEE/day05/assets/image-20220826180550583.png b/javaEE/day05/assets/image-20220826180550583.png new file mode 100644 index 0000000..1ac98cd Binary files /dev/null and b/javaEE/day05/assets/image-20220826180550583.png differ diff --git a/javaEE/day05/assets/image-20220826181117898.png b/javaEE/day05/assets/image-20220826181117898.png new file mode 100644 index 0000000..7f8e2a6 Binary files /dev/null and b/javaEE/day05/assets/image-20220826181117898.png differ diff --git a/javaEE/day05/assets/image-20220826194159343.png b/javaEE/day05/assets/image-20220826194159343.png new file mode 100644 index 0000000..698af42 Binary files /dev/null and b/javaEE/day05/assets/image-20220826194159343.png differ diff --git a/javaEE/day05/assets/image-20220828215549593.png b/javaEE/day05/assets/image-20220828215549593.png new file mode 100644 index 0000000..18d6c86 Binary files /dev/null and b/javaEE/day05/assets/image-20220828215549593.png differ diff --git a/javaEE/day05/assets/image-20221203095553048.png b/javaEE/day05/assets/image-20221203095553048.png new file mode 100644 index 0000000..23e973d Binary files /dev/null and b/javaEE/day05/assets/image-20221203095553048.png differ diff --git a/javaEE/day05/assets/image-20221203103623435.png b/javaEE/day05/assets/image-20221203103623435.png new file mode 100644 index 0000000..3a2f7cc Binary files /dev/null and b/javaEE/day05/assets/image-20221203103623435.png differ diff --git a/javaEE/day05/assets/image-20221203112117979.png b/javaEE/day05/assets/image-20221203112117979.png new file mode 100644 index 0000000..ede5653 Binary files /dev/null and b/javaEE/day05/assets/image-20221203112117979.png differ diff --git a/javaEE/day05/assets/image-20221203112252985.png b/javaEE/day05/assets/image-20221203112252985.png new file mode 100644 index 0000000..ab798e4 Binary files /dev/null and b/javaEE/day05/assets/image-20221203112252985.png differ diff --git a/javaEE/day05/assets/image-20221203112320687.png b/javaEE/day05/assets/image-20221203112320687.png new file mode 100644 index 0000000..31e5dd7 Binary files /dev/null and b/javaEE/day05/assets/image-20221203112320687.png differ diff --git a/javaEE/day05/assets/image-20221203113552785.png b/javaEE/day05/assets/image-20221203113552785.png new file mode 100644 index 0000000..42c4ca9 Binary files /dev/null and b/javaEE/day05/assets/image-20221203113552785.png differ diff --git a/javaEE/day05/assets/image-20221203113847126.png b/javaEE/day05/assets/image-20221203113847126.png new file mode 100644 index 0000000..3f2d19d Binary files /dev/null and b/javaEE/day05/assets/image-20221203113847126.png differ diff --git a/javaEE/day05/assets/image-20221203113925733.png b/javaEE/day05/assets/image-20221203113925733.png new file mode 100644 index 0000000..c6cea36 Binary files /dev/null and b/javaEE/day05/assets/image-20221203113925733.png differ diff --git a/javaEE/day05/assets/image-20221203114031824.png b/javaEE/day05/assets/image-20221203114031824.png new file mode 100644 index 0000000..d6175e1 Binary files /dev/null and b/javaEE/day05/assets/image-20221203114031824.png differ diff --git a/javaEE/day05/assets/image-20221203114231572.png b/javaEE/day05/assets/image-20221203114231572.png new file mode 100644 index 0000000..51eba31 Binary files /dev/null and b/javaEE/day05/assets/image-20221203114231572.png differ diff --git a/javaEE/day05/assets/image-20221203114806665.png b/javaEE/day05/assets/image-20221203114806665.png new file mode 100644 index 0000000..2c1a633 Binary files /dev/null and b/javaEE/day05/assets/image-20221203114806665.png differ diff --git a/javaEE/day05/assets/image-20221203114852752.png b/javaEE/day05/assets/image-20221203114852752.png new file mode 100644 index 0000000..af34225 Binary files /dev/null and b/javaEE/day05/assets/image-20221203114852752.png differ diff --git a/javaEE/day05/assets/image-20221203115001098.png b/javaEE/day05/assets/image-20221203115001098.png new file mode 100644 index 0000000..430847b Binary files /dev/null and b/javaEE/day05/assets/image-20221203115001098.png differ diff --git a/javaEE/day05/assets/image-20221203115041949.png b/javaEE/day05/assets/image-20221203115041949.png new file mode 100644 index 0000000..d5aa206 Binary files /dev/null and b/javaEE/day05/assets/image-20221203115041949.png differ diff --git a/javaEE/day05/assets/image-20221203115110440.png b/javaEE/day05/assets/image-20221203115110440.png new file mode 100644 index 0000000..a21b9f8 Binary files /dev/null and b/javaEE/day05/assets/image-20221203115110440.png differ diff --git a/javaEE/day05/assets/image-20221203122405075.png b/javaEE/day05/assets/image-20221203122405075.png new file mode 100644 index 0000000..74a87de Binary files /dev/null and b/javaEE/day05/assets/image-20221203122405075.png differ diff --git a/javaEE/day05/assets/image-20221203130726310.png b/javaEE/day05/assets/image-20221203130726310.png new file mode 100644 index 0000000..9461e87 Binary files /dev/null and b/javaEE/day05/assets/image-20221203130726310.png differ diff --git a/javaEE/day05/assets/image-20221203131954932.png b/javaEE/day05/assets/image-20221203131954932.png new file mode 100644 index 0000000..9484df4 Binary files /dev/null and b/javaEE/day05/assets/image-20221203131954932.png differ diff --git a/javaEE/day05/assets/image-20221203160447953.png b/javaEE/day05/assets/image-20221203160447953.png new file mode 100644 index 0000000..79d752a Binary files /dev/null and b/javaEE/day05/assets/image-20221203160447953.png differ diff --git a/javaEE/day05/assets/image-20221203161004349.png b/javaEE/day05/assets/image-20221203161004349.png new file mode 100644 index 0000000..5bb1f6b Binary files /dev/null and b/javaEE/day05/assets/image-20221203161004349.png differ diff --git a/javaEE/day05/assets/image-20221203161246168.png b/javaEE/day05/assets/image-20221203161246168.png new file mode 100644 index 0000000..87c6d64 Binary files /dev/null and b/javaEE/day05/assets/image-20221203161246168.png differ diff --git a/javaEE/day05/assets/image-20221203162706175.png b/javaEE/day05/assets/image-20221203162706175.png new file mode 100644 index 0000000..b6416d1 Binary files /dev/null and b/javaEE/day05/assets/image-20221203162706175.png differ diff --git a/javaEE/day05/assets/image-20221203164114083.png b/javaEE/day05/assets/image-20221203164114083.png new file mode 100644 index 0000000..ee80220 Binary files /dev/null and b/javaEE/day05/assets/image-20221203164114083.png differ diff --git a/javaEE/day05/assets/image-20221203164944144.png b/javaEE/day05/assets/image-20221203164944144.png new file mode 100644 index 0000000..8cd5ff8 Binary files /dev/null and b/javaEE/day05/assets/image-20221203164944144.png differ diff --git a/javaEE/day05/assets/image-20221203190218468.png b/javaEE/day05/assets/image-20221203190218468.png new file mode 100644 index 0000000..267ec9b Binary files /dev/null and b/javaEE/day05/assets/image-20221203190218468.png differ diff --git a/javaEE/day05/assets/image-20221203191732601.png b/javaEE/day05/assets/image-20221203191732601.png new file mode 100644 index 0000000..8a5b89e Binary files /dev/null and b/javaEE/day05/assets/image-20221203191732601.png differ diff --git a/javaEE/day05/assets/image-20221203191822996.png b/javaEE/day05/assets/image-20221203191822996.png new file mode 100644 index 0000000..455c966 Binary files /dev/null and b/javaEE/day05/assets/image-20221203191822996.png differ diff --git a/javaEE/day05/assets/image-20221203211640646.png b/javaEE/day05/assets/image-20221203211640646.png new file mode 100644 index 0000000..80e5e5d Binary files /dev/null and b/javaEE/day05/assets/image-20221203211640646.png differ diff --git a/javaEE/day05/assets/image-20221203212024679.png b/javaEE/day05/assets/image-20221203212024679.png new file mode 100644 index 0000000..9b63838 Binary files /dev/null and b/javaEE/day05/assets/image-20221203212024679.png differ diff --git a/javaEE/day05/assets/image-20221203212221939.png b/javaEE/day05/assets/image-20221203212221939.png new file mode 100644 index 0000000..fb41abf Binary files /dev/null and b/javaEE/day05/assets/image-20221203212221939.png differ diff --git a/javaEE/day05/assets/image-20221203213120692.png b/javaEE/day05/assets/image-20221203213120692.png new file mode 100644 index 0000000..382325b Binary files /dev/null and b/javaEE/day05/assets/image-20221203213120692.png differ diff --git a/javaEE/day05/assets/image-20221203214600716.png b/javaEE/day05/assets/image-20221203214600716.png new file mode 100644 index 0000000..1ed1c75 Binary files /dev/null and b/javaEE/day05/assets/image-20221203214600716.png differ diff --git a/javaEE/day05/assets/image-20221203225623337.png b/javaEE/day05/assets/image-20221203225623337.png new file mode 100644 index 0000000..970ac3e Binary files /dev/null and b/javaEE/day05/assets/image-20221203225623337.png differ diff --git a/javaEE/day05/assets/image-20221203230457901.png b/javaEE/day05/assets/image-20221203230457901.png new file mode 100644 index 0000000..609ec26 Binary files /dev/null and b/javaEE/day05/assets/image-20221203230457901.png differ diff --git a/javaEE/day05/assets/image-20221203231803000.png b/javaEE/day05/assets/image-20221203231803000.png new file mode 100644 index 0000000..6bfb410 Binary files /dev/null and b/javaEE/day05/assets/image-20221203231803000.png differ diff --git a/javaEE/day05/assets/image-20221203235715804.png b/javaEE/day05/assets/image-20221203235715804.png new file mode 100644 index 0000000..f1d96c6 Binary files /dev/null and b/javaEE/day05/assets/image-20221203235715804.png differ diff --git a/javaEE/day05/assets/image-20221204001520756.png b/javaEE/day05/assets/image-20221204001520756.png new file mode 100644 index 0000000..fc4ed54 Binary files /dev/null and b/javaEE/day05/assets/image-20221204001520756.png differ diff --git a/javaEE/day05/assets/image-20221204002040184.png b/javaEE/day05/assets/image-20221204002040184.png new file mode 100644 index 0000000..3ac3a7c Binary files /dev/null and b/javaEE/day05/assets/image-20221204002040184.png differ diff --git a/javaEE/day05/assets/image-20221204002306288.png b/javaEE/day05/assets/image-20221204002306288.png new file mode 100644 index 0000000..1b2568a Binary files /dev/null and b/javaEE/day05/assets/image-20221204002306288.png differ diff --git a/javaEE/day05/assets/image-20221204100656376.png b/javaEE/day05/assets/image-20221204100656376.png new file mode 100644 index 0000000..7d5ef72 Binary files /dev/null and b/javaEE/day05/assets/image-20221204100656376.png differ diff --git a/javaEE/day05/assets/image-20221204172339375.png b/javaEE/day05/assets/image-20221204172339375.png new file mode 100644 index 0000000..aea5303 Binary files /dev/null and b/javaEE/day05/assets/image-20221204172339375.png differ diff --git a/javaEE/day05/assets/image-20221204172705426.png b/javaEE/day05/assets/image-20221204172705426.png new file mode 100644 index 0000000..afd18b4 Binary files /dev/null and b/javaEE/day05/assets/image-20221204172705426.png differ diff --git a/javaEE/day05/assets/image-20221204174052622.png b/javaEE/day05/assets/image-20221204174052622.png new file mode 100644 index 0000000..e9a2148 Binary files /dev/null and b/javaEE/day05/assets/image-20221204174052622.png differ diff --git a/javaEE/day05/assets/image-20221204174537686.png b/javaEE/day05/assets/image-20221204174537686.png new file mode 100644 index 0000000..4822e72 Binary files /dev/null and b/javaEE/day05/assets/image-20221204174537686.png differ diff --git a/javaEE/day05/assets/image-20221204180744084.png b/javaEE/day05/assets/image-20221204180744084.png new file mode 100644 index 0000000..8d6e971 Binary files /dev/null and b/javaEE/day05/assets/image-20221204180744084.png differ diff --git a/javaEE/day05/assets/image-20221204180946963.png b/javaEE/day05/assets/image-20221204180946963.png new file mode 100644 index 0000000..265060d Binary files /dev/null and b/javaEE/day05/assets/image-20221204180946963.png differ diff --git a/javaEE/day05/assets/image-20221204182828547.png b/javaEE/day05/assets/image-20221204182828547.png new file mode 100644 index 0000000..0e8d318 Binary files /dev/null and b/javaEE/day05/assets/image-20221204182828547.png differ diff --git a/javaEE/day05/assets/image-20221204183044848.png b/javaEE/day05/assets/image-20221204183044848.png new file mode 100644 index 0000000..94af08a Binary files /dev/null and b/javaEE/day05/assets/image-20221204183044848.png differ diff --git a/javaEE/day05/assets/image-20221204184313822.png b/javaEE/day05/assets/image-20221204184313822.png new file mode 100644 index 0000000..0b55fa1 Binary files /dev/null and b/javaEE/day05/assets/image-20221204184313822.png differ diff --git a/javaEE/day05/assets/image-20221204185455556.png b/javaEE/day05/assets/image-20221204185455556.png new file mode 100644 index 0000000..6dd3c02 Binary files /dev/null and b/javaEE/day05/assets/image-20221204185455556.png differ diff --git a/javaEE/day05/assets/image-20221204185928260.png b/javaEE/day05/assets/image-20221204185928260.png new file mode 100644 index 0000000..f2fdf4f Binary files /dev/null and b/javaEE/day05/assets/image-20221204185928260.png differ diff --git a/javaEE/day05/assets/image-20221204190341389.png b/javaEE/day05/assets/image-20221204190341389.png new file mode 100644 index 0000000..2caaece Binary files /dev/null and b/javaEE/day05/assets/image-20221204190341389.png differ diff --git a/javaEE/day05/assets/image-20221204190712411.png b/javaEE/day05/assets/image-20221204190712411.png new file mode 100644 index 0000000..3749b0c Binary files /dev/null and b/javaEE/day05/assets/image-20221204190712411.png differ diff --git a/javaEE/day05/assets/image-20221204191650390.png b/javaEE/day05/assets/image-20221204191650390.png new file mode 100644 index 0000000..fa57b5e Binary files /dev/null and b/javaEE/day05/assets/image-20221204191650390.png differ diff --git a/javaEE/day05/assets/image-20221204193837678.png b/javaEE/day05/assets/image-20221204193837678.png new file mode 100644 index 0000000..3203db5 Binary files /dev/null and b/javaEE/day05/assets/image-20221204193837678.png differ diff --git a/javaEE/day05/assets/image-20221204194207812.png b/javaEE/day05/assets/image-20221204194207812.png new file mode 100644 index 0000000..e43ad89 Binary files /dev/null and b/javaEE/day05/assets/image-20221204194207812.png differ diff --git a/javaEE/day05/assets/image-20221204195812200.png b/javaEE/day05/assets/image-20221204195812200.png new file mode 100644 index 0000000..495afb3 Binary files /dev/null and b/javaEE/day05/assets/image-20221204195812200.png differ diff --git a/javaEE/day05/assets/image-20221204201342490.png b/javaEE/day05/assets/image-20221204201342490.png new file mode 100644 index 0000000..e6986a9 Binary files /dev/null and b/javaEE/day05/assets/image-20221204201342490.png differ diff --git a/javaEE/day05/assets/image-20221204202531571.png b/javaEE/day05/assets/image-20221204202531571.png new file mode 100644 index 0000000..19db7fe Binary files /dev/null and b/javaEE/day05/assets/image-20221204202531571.png differ diff --git a/javaEE/day05/assets/image-20221204203904900.png b/javaEE/day05/assets/image-20221204203904900.png new file mode 100644 index 0000000..e0215dc Binary files /dev/null and b/javaEE/day05/assets/image-20221204203904900.png differ diff --git a/javaEE/day05/assets/image-20221204204916033.png b/javaEE/day05/assets/image-20221204204916033.png new file mode 100644 index 0000000..01f87ff Binary files /dev/null and b/javaEE/day05/assets/image-20221204204916033.png differ diff --git a/javaEE/day05/assets/image-20221204205328069.png b/javaEE/day05/assets/image-20221204205328069.png new file mode 100644 index 0000000..0776cf2 Binary files /dev/null and b/javaEE/day05/assets/image-20221204205328069.png differ diff --git a/javaEE/day05/assets/image-20221204212807207.png b/javaEE/day05/assets/image-20221204212807207.png new file mode 100644 index 0000000..649ad1e Binary files /dev/null and b/javaEE/day05/assets/image-20221204212807207.png differ diff --git a/javaEE/day05/assets/image-20221204213328034.png b/javaEE/day05/assets/image-20221204213328034.png new file mode 100644 index 0000000..d599c24 Binary files /dev/null and b/javaEE/day05/assets/image-20221204213328034.png differ diff --git a/javaEE/day05/assets/image-20221204213859112.png b/javaEE/day05/assets/image-20221204213859112.png new file mode 100644 index 0000000..594b506 Binary files /dev/null and b/javaEE/day05/assets/image-20221204213859112.png differ diff --git a/javaEE/day05/assets/image-20221204221320230.png b/javaEE/day05/assets/image-20221204221320230.png new file mode 100644 index 0000000..e44cfb4 Binary files /dev/null and b/javaEE/day05/assets/image-20221204221320230.png differ diff --git a/javaEE/day05/assets/image-20221204222650873.png b/javaEE/day05/assets/image-20221204222650873.png new file mode 100644 index 0000000..2f79229 Binary files /dev/null and b/javaEE/day05/assets/image-20221204222650873.png differ diff --git a/javaEE/day05/assets/image-20221204223602694.png b/javaEE/day05/assets/image-20221204223602694.png new file mode 100644 index 0000000..c25f832 Binary files /dev/null and b/javaEE/day05/assets/image-20221204223602694.png differ diff --git a/javaEE/day05/assets/image-20221204223815554.png b/javaEE/day05/assets/image-20221204223815554.png new file mode 100644 index 0000000..ed65b7e Binary files /dev/null and b/javaEE/day05/assets/image-20221204223815554.png differ diff --git a/javaEE/day05/assets/image-20221204224643683.png b/javaEE/day05/assets/image-20221204224643683.png new file mode 100644 index 0000000..3568ee1 Binary files /dev/null and b/javaEE/day05/assets/image-20221204224643683.png differ diff --git a/javaEE/day05/assets/image-20221204225437297.png b/javaEE/day05/assets/image-20221204225437297.png new file mode 100644 index 0000000..ccc63ef Binary files /dev/null and b/javaEE/day05/assets/image-20221204225437297.png differ diff --git a/javaEE/day05/assets/image-20221204225815624.png b/javaEE/day05/assets/image-20221204225815624.png new file mode 100644 index 0000000..b80791c Binary files /dev/null and b/javaEE/day05/assets/image-20221204225815624.png differ diff --git a/javaEE/day05/assets/image-20221204231616724.png b/javaEE/day05/assets/image-20221204231616724.png new file mode 100644 index 0000000..b6828ab Binary files /dev/null and b/javaEE/day05/assets/image-20221204231616724.png differ diff --git a/javaEE/day05/assets/image-20221204232154445.png b/javaEE/day05/assets/image-20221204232154445.png new file mode 100644 index 0000000..5dddbc2 Binary files /dev/null and b/javaEE/day05/assets/image-20221204232154445.png differ diff --git a/javaEE/day05/assets/image-20221204232501679.png b/javaEE/day05/assets/image-20221204232501679.png new file mode 100644 index 0000000..3abce32 Binary files /dev/null and b/javaEE/day05/assets/image-20221204232501679.png differ diff --git a/javaEE/day05/assets/image-20221204233333606.png b/javaEE/day05/assets/image-20221204233333606.png new file mode 100644 index 0000000..61225fc Binary files /dev/null and b/javaEE/day05/assets/image-20221204233333606.png differ diff --git a/javaEE/day05/assets/image-20221204233637735.png b/javaEE/day05/assets/image-20221204233637735.png new file mode 100644 index 0000000..3e2ff01 Binary files /dev/null and b/javaEE/day05/assets/image-20221204233637735.png differ diff --git a/javaEE/day06/MySQL基础-笔记.md b/javaEE/day06/MySQL基础-笔记.md new file mode 100644 index 0000000..8156934 --- /dev/null +++ b/javaEE/day06/MySQL基础-笔记.md @@ -0,0 +1,1045 @@ +# MYSQL基础语法 +### 学习目标 +1. 能够理解数据库的概念 +2. 能够安装MySQL数据库 +3. 能够启动,关闭及登录MySQL +4. 能够使用SQL语句操作数据库 +5. 能够使用SQL语句操作表结构 +6. 能够使用SQL语句进行数据的添加修改和删除的操作 +7. 能够使用SQL语句简单查询数据 + +## 第一章 数据库的基本知识 + +#### 目标 + +1. 能够掌握数据库的概念 +2. 能够说出常用的数据库 + +#### 讲解 + +##### 什么是数据库 + +存储数据的仓库 + +#### 数据的存储方式 +1. **数据保存在内存** + + ```java + int[] arr = new int[]{1, 2, 3, 4}; + ArrayListlist = new ArrayList(); + list.add(1); + list.add(2); + ``` + + new出来的对象存储在堆中.堆是内存中的一小块空间 + + 优点:内存速度快 + 缺点:断电/程序退出,数据就清除了.内存价格贵 + +2. **数据保存在普通文件** + 优点:永久保存 + 缺点:查找,增加,修改,删除数据比较麻烦,效率低 + +3. **数据保存在数据库** + 优点:永久保存,通过SQL语句比较方便的操作数据库 + +##### 数据库的优点 +​ 数据库是按照特定的格式将数据存储在文件中,通过SQL语句可以方便的对大量数据进行增、删、改、查操作,数据库是对大量的信息进行管理的高效的解决方案。 + +##### 常见数据库 +![常见数据库](img/常见数据库.PNG) +**Oracle**:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。 +**MYSQL**:开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。 +**DB2** :IBM公司的数据库产品,收费的。常应用在银行系统中. +**SQLServer**:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。 +**SyBase**:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。 +**SQLite**: 嵌入式的小型数据库,应用在手机端。 + +**常用数据库**:**MYSQL**,**Oracle** +在web应用中,使用的最多的就是MySQL数据库,原因如下: + +1. 开源、免费 +2. 功能足够强大,足以应付web应用开发(最高支持千万级别的并发访问) + +#### 小结 + +1. 说出数据库的概念:存储数据的仓库 +2. 说出常用的数据库:MYSQL, Oracle + +### 命令行客户端连接服务器 + +#### 目标 + +1. 能够打开和关闭mysql服务 +2. 能够连接到mysql + +#### 讲解 + +打开和关闭mysql服务 +![1550408825267](img/1550408825267.png) +![mysql启动02](img/mysql启动02.png) + + +![1550289380140](img/1550289380140.png) + +​ MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装时设置的密码即可登录 +1. 登录格式1:`mysql -u用户名 -p密码` + 例如: + + ```sql + mysql -uroot -proot + ``` + + ![MYSQL登录01](img/MYSQL登录01.png) + 后输入密码方式: + + ```sql + mysql -uroot -p + 下一行输入密码 + ``` + + ![MYSQL登录04](img/MYSQL登录04.png) + +2. 登录格式2:`mysql -hip地址 -u用户名 -p密码` + 例如: + + ```sql + mysql -h127.0.0.1 -uroot -proot + ``` + + ![MYSQL登录02](img/MYSQL登录02.png) + +3. 退出MySQL:`exit` + ![MYSQL登录03](img/MYSQL退出01.png) + +#### 小结 + +1. 打开和关闭mysql服务? +2. 连接到本机的mysql?mysql -uroot -proot +3. 连接到指定主机的mysql?mysql -hip地址 -uroot -proot + + + +### 服务器与数据库、表、记录的关系 + +#### 目标 + +能够理解mysql服务器与数据库、表、记录的关系 + +#### 讲解 + +![1550409365086](img/1550409365086.png) + +##### 实体类与表的对应关系 + +![实体类与表的对应关系](img/%E5%AE%9E%E4%BD%93%E7%B1%BB%E4%B8%8E%E8%A1%A8%E7%9A%84%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB.png) + +#### 小结 + +mysql服务器与数据库、表、记录的关系? + + +### SQL语句的分类和语法 + +#### 目标 + +1. 能够掌握SQL的概念和作用 + +#### 讲解 + +##### 什么是SQL +结构化查询语言(**S**tructured **Q**uery **L**anguage)简称SQL。 + +SQL语句就是对数据库进行操作的一种语言。 + +##### SQL作用 +通过SQL语句我们可以**方便**的操作数据库、表、数据。 +SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。 +![SQL规范](img/SQL规范.png) + +##### SQL语句分类 +1. DDL(Data Definition Language)数据定义语言 + 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter等 + +2. DML(Data Manipulation Language)数据操作语言 + 用来对数据库中表的数据进行增删改。关键字:insert, delete, update等 + +3. DQL(Data Query Language) 数据查询语言 + 对数据库进行数据查询,关键字select。 + +4. DCL(**Data Control Language**)数据控制语言(了解) + + 是用来设置或更改数据库用户或角色权限的语句,这个比较少用到。 + +##### SQL通用语法 +1. SQL语句可以单行或多行书写,以分号结尾。 + +2. 可使用空格和缩进来增强语句的可读性。 + +3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。 + ```sql + SELECT * FROM student; + ``` + +4. 3种注释 + 单行注释: -- 注释内容 + 多行注释: /* 注释 */ + + **\#** 注释内容(mysql特有的单行注释) +#### 小结 + +1. SQL的作用?对数据库进行操作的语句,增删改查 +2. SQL的分类? + DDL:操作数据和表 + DML:对表中的记录进行增删改 + DQL:对表中的记录进行查询 +3. SQL的语法特点? + 可以写一行,也可以写成多行,最好是以;结尾 + 关键字建议大写 + 可以任意缩进 + 单行注释: -- 开头 # 开头 + 多行注释: /* */ + +## 第二章 DDL操作数据库 + +#### 目标 + +能够掌握创建数据库的三种语法 + +#### 讲解 + +##### 创建数据库 + +1. 直接创建数据库 + + ```sql + CREATE DATABASE 数据库名; + ``` + +2. 判断是否存在并创建数据库 + + ```sql + CREATE DATABASE IF NOT EXISTS 数据库名; + ``` + +3. 创建数据库并指定字符集(编码表) + + ```sql + CREATE DATABASE 数据库名 character set 字符集; + ``` + +4. 具体操作: +* 直接创建数据库db1 + ```sql + CREATE DATABASE db1; + ``` + ![直接创建数据库](img/直接创建数据库.png) + +* 判断是否存在并创建数据库db2 + ```sql + CREATE DATABASE IF NOT EXISTS db2; + ``` + ![判断是否存在并创建数据库](img/判断是否存在并创建数据库.png) + +* 创建数据库db3并指定字符集为gbk + ```sql + CREATE DATABASE db2 CHARACTER SET gbk; + ``` + ![创建数据库并指定字符集](img/创建数据库并指定字符集.png) + +##### 查看数据库 +1. 查看所有的数据库 +```sql +SHOW DATABASES; +``` + ![查看所有数据库](img/查看所有数据库.png) +2. 查看某个数据库的定义信息 +```sql +SHOW CREATE DATABASE 数据库名; +``` + ![查看某个数据库的定义信息](img/查看某个数据库的定义信息.png) + +#### 小结 + +1. 创建数据库语法:CREATE DATABASE 数据库名; +2. 查看有哪些数据库:SHOW DATABASES; + +### DDL修改和删除数据库 + +#### 目标 + +1. 能够修改数据库的字符集 +2. 能够删除数据库 + +#### 讲解 + +##### 修改数据库字符集 + +```sql +ALTER 表示修改 +ALTER DATABASE 数据库 default character set 新的字符集; +``` + +具体操作: +* 将db3数据库的字符集改成utf8 + ```sql + ALTER DATABASE db3 DEFAULT CHARACTER SET utf8; + ``` + ![修改数据库字符集](img/修改数据库字符集.png) +##### 删除数据库 + +```sql +drop --表示删除数据库或表 +DROP DATABASE 数据库名; +``` + +具体操作: +* 删除db2数据库 + ```sql + DROP DATABASE db2; + ``` + ![删除数据库](img/删除数据库.png) + +#### 小结 + +1. 修改数据库的字符集格式?alter database 数据库 character set 新的字符集; +2. 删除数据库格式?drop database 数据库名; + +### DDL使用数据库 + +#### 目标 + +1. 能够掌握切换数据库语法 +2. 能够查看正在使用的数据库 + +#### 讲解 + +1. 查看正在使用的数据库 + + ```sql + select -- 查询 + SELECT DATABASE(); + ``` + +2. 使用/切换数据库 + + ```sql + USE 数据库名; + ``` + +具体操作: +* 查看正在使用的数据库 + ```sql + SELECT DATABASE(); + ``` + ![查看正在使用的数据库](img/查看正在使用的数据库.png) +* 使用db1数据库 + ```sql + USE db1; + ``` + ![使用db1数据库](img/使用db1数据库.png) + +#### 小结 + +| DDL语句操作 | 关键字 | +| ----------- | ------------------------------------ | +| 创建 | create database 数据库名; | +| 修改 | alter database character set 字符集; | +| 查看 | show databases; | +| 删除 | drop database 数据库名; | + + + +### DDL创建表 + +#### 目标 + +1. 能够掌握SQL创建表 + +#### 讲解 + +>**前提先使用某个数据库**(db1) +##### 创建表 +```sql +CREATE TABLE 表名 (字段名1 字段类型1, 字段名2 字段类型2...); +``` + +建议写成如下格式: +```sql +CREATE TABLE 表名 ( + 字段名1 字段类型1, + 字段名2 字段类型2 +); +``` +关键字说明: +```sql +CREATE -- 表示创建 +TABLE -- 表示表 +``` +##### MySQL数据类型 + +MySQL中的我们常使用的数据类型如下: +![MYSQL常用数据类型](img/MYSQL常用数据类型.png) + +详细的数据类型如下(不建议详细阅读!) + +![1550410505421](img/1550410505421.png) + +具体操作: + +创建student表包含id,name,birthday字段 + +```sql +CREATE TABLE student ( + id INT, + name VARCHAR(20), + birthday DATE +); +``` + +#### 小结 + +1. 创建表语句:CREATE TABLE 表名 (字段名 类型, 字段名 字段类型...); +2. 常用数据类型:int, double, varchar, date + +### DDL查看表 + +#### 目标 + +1. 能够查看某个数据库中的所有表 +2. 能够查看表结构 + +#### 讲解 + +1. 查看某个数据库中的所有表 + + ```sql + SHOW TABLES; + ``` + +2. 查看表结构 + + ```sql + DESC 表名; + ``` + +3. 查看创建表的SQL语句 + + ```sql + SHOW CREATE TABLE 表名; + ``` + + 具体操作: +* 查看mysql数据库中的所有表 + ```sql + SHOW TABLES; + ``` + ![查看某个数据库中的所有表](img/查看某个数据库中的所有表.png) + +* 查看student表的结构 + ```sql + DESC student; + ``` + ![查看student表的结构](img/查看student表的结构.png) +* 查看student的创建表SQL语句 + ```sql + SHOW CREATE TABLE student; + ``` + ![查看student的创建表SQL语句](img/查看student的创建表SQL语句.png) + +#### 小结 + +1. 查看某个数据库中的所有表:show tables; +2. 查看表结构:desc 表名; +3. 查看创建表的SQL语句:show create table 表名; + +### DDL删除表 + +#### 目标 + +1. 能够掌握删除表语法 +2. 能够掌握快速创建一个表结构相同的表 + +#### 讲解 + +##### 快速创建一个表结构相同的表 + +```sql +CREATE TABLE 表名 LIKE 其他表; +``` + +具体操作: + +- 创建s1表,s1表结构和student表结构相同 + + ```sql + CREATE TABLE s1 LIKE student; + ``` + + +##### 删除表 + +1. 直接删除表 + + ```sql + DROP TABLE 表名; + ``` + +2. 判断表是否存在并删除表 + + ```sql + DROP TABLE IF EXISTS 表名; + ``` + +具体操作: +* 直接删除表s1表 + ```sql + DROP TABLE s1; + ``` + ![直接删除表](img/直接删除表.png) +* 判断表是否存在并删除s1表 + ```sql + DROP TABLE IF EXISTS s1; + ``` + ![判断表存在并删除](img/判断表存在并删除.png) + +#### 小结 + +1. 快速创建一个表结构相同的表:CREATE TABLE 表名 LIKE 其他表; +2. 删除表语法:DROP TABLE 表名; + +### DDL修改表结构 + +#### 目标 + +能够掌握修改表结构的语法 + +#### 讲解 + +> 修改表结构使用不是很频繁,只需要了解,等需要使用的时候再回来查即可 +1. 添加表列 + + ```sql + ALTER TABLE 表名 ADD 字段名 类型; + ``` + + 具体操作: + * 为学生表添加一个新的字段remark,类型为varchar(20) + ```sql + ALTER TABLE student ADD remark VARCHAR(20); + ``` + ![添加字段](img/添加字段.png) + +2. 修改列类型 + + ```sql + ALTER TABLE 表名 MODIFY 字段名 新的类型; + ``` + + 具体操作: + + * 将student表中的remark字段的改成varchar(100) + ```sql + ALTER TABLE student MODIFY remark VARCHAR(100); + ``` + ![修改字段类型](img/修改字段类型.png) + +3. 修改列名 + + ```sql + ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型; + ``` + + 具体操作: + + * 将student表中的remark字段名改成intro,类型varchar(30) + ```sql + ALTER TABLE student CHANGE remark intro varchar(30); + ``` + ![修改表字段名称](img/修改表字段名称.png) + +4. 删除列 + + ```sql + ALTER TABLE 表名 DROP 字段名; + ``` + + 具体操作: + + * 删除student表中的字段intro + ```sql + ALTER TABLE student DROP intro; + ``` + ![删除字段](img/删除字段.png) + +5. 修改表名 + + ```sql + RENAME TABLE 表名 TO 新表名; + ``` + + 具体操作: + + * 将学生表student改名成student2,再删除student2表 + ```sql + RENAME TABLE student TO student2; + DROP TABLE student2; + ``` + ![修改表名](img/修改表名.png) + +6. 修改字符集 + + ```sql + ALTER TABLE 表名 character set 字符集; + ``` + + 具体操作: + + * 将sutden2表的编码修改成gbk + ```sql + ALTER TABLE student2 character set gbk; + ``` + ![修改字符集](img/修改字符集.png) + +#### 小结 + +1. 所有修改表前面的语法都是相同的?ALTER TABLE 表名 + +2. 添加一列:add 字段名 类型 +3. 修改类型:modify 字段名 新的类型 +4. 修改字段名和类型:change 旧字段名 新字段名 类型 +5. 删除一列:drop 字段名 +## 第三章 DML操作数据表 +### DML插入记录(重点) + +#### 目标 + +能够掌握往表中添加记录 + +#### 讲解 + +创建student表包含id,name,birthday,sex,address字段。 + +```sql +CREATE TABLE student ( + id INT, + name VARCHAR(20), + birthday DATE, + sex char(2), + address varchar(50) +); +``` + +##### 插入全部字段 +* 所有的字段名都写出来 + + ```sql + INSERT -- 表示往表里插入记录 + INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2...); + ``` + +* 不写字段名 + + ```sql + INSERT INTO 表名 VALUES (字段值1, 字段值2...); + ``` + +##### 插入部分数据 +```sql +INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2...); +``` + + +没有添加数据的字段会使用NULL + +1. 关键字说明 + ```sql + INSERT INTO 表名 – 表示往哪张表中添加数据 + (字段名1, 字段名2, …) -- 要给哪些字段设置值 + VALUES (值1, 值2, …); -- 设置具体的值 + ``` + +2. 具体操作: + + * 插入部分数据,往学生表中添加 id, name, age, sex数据 + ```sql + INSERT INTO student (id, NAME, age, sex) VALUES (1, '张三', 20, '男'); + ``` + ![添加部分数据](img/添加部分数据.png) + + * 向表中插入所有字段 + * 所有的字段名都写出来 + ```sql + INSERT INTO student (NAME, id, age, sex, address) VALUES ('李四', 2, 23, '女', '广州'); + ``` + ![所有字段都添加数据](img/所有字段都添加数据.png) + + * 不写字段名 + ```sql + INSERT INTO student VALUES (3, '王五', 18, '男', '北京'); + ``` + ![添加所有字段数据](img/添加所有字段数据.png) + + + +##### 注意 + +> - 值与字段必须对应,个数相同,类型相同 +> - 值的数据大小必须在字段的长度范围内 +> - 除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号) +> - 如果要插入空值,可以不写字段,或者插入null + +#### 小结 + +1. 向表中添加一条完整记录: + 所有的字段都写出来: INSERT INTO 表名 (字段1, 字段2, ....) VALUES (值1, 值2, ...); + 不写字段名: INSERT INTO 表名 VALUES (值1, 值2, ...); +2. 向表中添加一条记录部分列:必须写字段名,否则不知道添哪个字段. + INSERT INTO 表名 (字段1, 字段2, ....) VALUES (值1, 值2, ...); + +### DOS命令窗口操作数据乱码问题 + +#### 目标 + +能够理解DOS命令行乱码的原因 + +#### 讲解 + +>当我们使用DOS命令行进行SQL语句操作如有有中文会出现乱码,导致SQL执行失败 +>![DOS中文乱码01](img/DOS中文乱码01.png) +>错误原因:因为MySQL的客户端设置编码是utf8,而系统的DOS命令行编码是gbk,编码不一致导致的乱码 +>![1551157215427](img/1551157215427.png) + + + +解决方案: +1. 快捷设置 + ```sql + 在DOS命令行输入:set names gbk; + ``` + > 注意:以上方式为临时方案,退出DOS命令行就失效了,需要每次都配置 + +2. 修改MySQL安装目录下的my.ini文件,重启服务所有地方生效。此方案将所有编码都修改了[**不建议**] + ![DOS中文乱码04](img/DOS中文乱码04.png) + +#### 小结 + +如何解决DOS命令行乱码:set names gbk; + + +### DML更新表记录 + +#### 目标 + +能够掌握更新表记录 + +#### 讲解 + +1. 不带条件修改数据 + + ```sql + UPDATE 表名 SET 字段名=新的值; + ``` + +2. 带条件修改数据 + + ```sql + UPDATE 表名 SET 字段名=新的值 WHERE 条件 + ``` + +3. 关键字说明 + ```sql + UPDATE: 表示修改记录 + SET: 要改哪个字段 + WHERE: 设置条件 + ``` + +4. 具体操作: + * 不带条件修改数据,将所有的性别改成女 + ```sql + UPDATE student SET sex='女'; + ``` + ![修改所有数据](img/修改所有数据.png) + + * 带条件修改数据,将id号为2的学生性别改成男 + ```sql + UPDATE student SET sex='男' WHERE id=2; + ``` + ![带条件修改](img/带条件修改.png) + + * 一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京 + ```sql + UPDATE student SET age=26, address='北京' WHERE id=3; + ``` + ![一次性修改2个字段](img/一次性修改2个字段.png) + +#### 小结 + +1. 不带条件的更新数据库记录:UPDATE TABLE SET 字段名=新的值; +2. 带条件:UPDATE TABLE SET 字段名=新的值 WHERE 条件; + +### DML删除表记录 + +#### 目标 + +能够掌握删除表记录 + +#### 讲解 + +1. 不带条件删除数据 + + ```sql + DELETE -- 删除记录 + DELETE FROM 表名; + ``` + +2. 带条件删除数据 + + ```sql + DELETE FROM 表名 WHERE 条件; + ``` + +3. truncate删除表记录 + + ```sql + TRUNCATE TABLE 表名; + ``` + + >truncate和delete的区别: + >* delete是将表中的数据一条一条删除 + >* truncate是将整个表摧毁,重新创建一个新的表,新的表结构和原来表结构一模一样 + > ![truncate](img/truncate.png) + +4. 具体操作: + * 带条件删除数据,删除id为3的记录 + ```sql + DELETE FROM student WHERE id=3; + ``` + + ![删除满足条件的记录](img/删除满足条件的记录.png) + + * 不带条件删除数据,删除表中的所有数据 + ```sql + DELETE FROM student; + ``` + ![删除所有记录](img/删除所有记录.png) + +#### 小结 + +1. 指定条件删除:DELETE FROM 表名 WHERE 条件; +2. 没有条件删除所有的记录:DELETE FROM 表名; +3. 删除表结构再创建表:TRUNCATE TABLE 表名; + +## 第四章 DQL查询数据记录 +### DQL没有条件的简单查询 + +#### 目标 + +能够掌握简单查询 + +#### 讲解 + +>注意:查询不会对数据库中的数据进行修改,只是一种显示数据的方式。 +##### 查询表中所有列数据 +1. 写出查询每列的名称 +```sql +SELECT -- 表示查询 +SELECT 字段名1, 字段名2, ... FROM 表名; +``` + 具体操作: + + ```sql +SELECT id, NAME ,age, sex, address FROM student; + ``` + ![查询所有列](img/查询所有列.png) + +2. 使用*表示所有列 + + ```sql + SELECT * FROM 表名; + ``` + + 具体操作: + + ```sql + SELECT * FROM student; + ``` + ![查询所有列](img/查询所有列.png) + +##### 查询表中指定列数据 + +查询指定列的数据,多个列之间以逗号分隔 +```sql +SELECT 字段名1, 字段名2 FROM 表名; +``` + +具体操作: +查询student表中的name 和 age 列 + +```sql +SELECT NAME, age FROM student; +``` +![查询指定字段](img/查询指定字段.png) + +##### 别名查询 +1. 查询时给列、表指定别名需要使用AS关键字 +2. 使用别名的好处是方便观看和处理查询到的数据 + `SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名;` + `SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名;` + 注意: + + >查询给表取别名目前还看不到效果,需要到多表查询的时候才能体现出好处 + >AS关键字可以省略 + +3. 具体操作: + * 查询sudent表中name 和 age 列,name列的别名为”姓名”,age列的别名为”年龄” + ```sql + SELECT NAME AS 姓名, age AS 年龄 FROM student; + ``` + ![查询字段别名](img/查询字段别名.png) + +##### 清除重复值 +1. 查询指定列并且结果不出现重复数据 + + ```sql + SELECT DISTINCT 字段名 FROM 表名; + ``` + +2. 具体操作: + * 查询address列并且结果不出现重复的address + ```sql + SELECT DISTINCT address 城市 FROM student; + ``` + ![1550289641391](img/1550289641391.png) + +##### 查询结果参与运算 +1. 某列数据和固定值运算 + + ```sql + SELECT 列名1 FROM 表名; + SELECT 列名1 + 固定值 FROM 表名; + ``` + +2. 某列数据和其他列数据参与运算 + + ```sql + SELECT 列名1 + 列名2 FROM 表名; + ``` + + >注意: 参与运算的必须是数值类型 + +3. 需求: + * 添加数学,英语成绩列,给每条记录添加对应的数学和英语成绩 + * 查询的时候将数学和英语的成绩相加 + +4. 实现: + +* 修改student表结构,添加数学和英语成绩列 + ```sql + ALTER TABLE student ADD math INT; + ALTER TABLE student ADD english INT; + ``` +* 给每条记录添加对应的数学和英语成绩 + ![添加数学和英语成绩](img/添加数学和英语成绩.png) +* 查询math + english的和 + ```sql + SELECT math + english FROM student; + ``` + ![查询math和english的和](img/查询math和english的和.png) + + >结果确实将每条记录的math和english相加,但是效果不好看 + +* 查询math + english的和使用别名”总成绩” + ```sql + SELECT math + english 总成绩 FROM student; + ``` + ![组合查询结果取别名](img/组合查询结果取别名.png) + +* 查询所有列与math + english的和并使用别名”总成绩” + ```sql + SELECT *, math + english 总成绩 FROM student; + ``` + ![查询所有列数据和参与运算](img/查询所有列数据和参与运算.png) + +* 查询姓名、年龄,将每个人的数学增加10分 + ```sql + SELECT name, math + 10 FROM student; + ``` + +#### 小结 + +1. 简单查询格式:SELECT 字段名 FROM 表名; +2. 定义别名:SELECT 字段名 AS 别名 FROM 表名; +3. 去除重复行:SELECT DISTINCT 字段名 FROM 表名; +4. 数值列,可以进行计算,不会影响表中数据 + +| DML语句操作 | 关键字 | +| ----------- | -------------------------------------------- | +| 添加 | INSERT INTO 表名 (字段名...) VALUES (值...); | +| 修改 | UPDATE 表名 SET 字段名=新的值 WHERE 条件; | +| 删除 | DELETE FROM 表名 WHERE 条件; | +| 查询 | SELETE 字段名 FROM 表名; | + + +## 第五章 蠕虫复制 + +#### 目标 + +了解蠕虫复制 + +#### 讲解 + +什么是蠕虫复制:在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中 +语法格式: + +```sql +INSERT INTO 表名1 SELECT * FROM 表名2; +``` + +作用:将`表名2`中的数据复制到`表名1`中 + +具体操作: +* 创建student2表,student2结构和student表结构一样 +```sql +CREATE TABLE student2 LIKE student; +``` +* 将student表中的数据添加到student2表中 +```sql +INSERT INTO student2 SELECT * FROM student; +``` +>注意:如果只想复制student表中name,age字段数据到student2表中使用如下格式 +>`INSERT INTO student2(NAME, age) SELECT NAME, age FROM student;` +>![蠕虫复制](img/蠕虫复制.png) + + +### 总结 + +1. 能够理解数据库的概念 + 存储数据的仓库 +2. 能够安装MySQL数据库 + 一直下一步:解压,复制 + 配置MYSQL服务器:下一步 +3. 能够启动,关闭及登录MySQL + 在服务里面找到MySql,右键启动/关闭 + 登录MySQL: mysql -uroot -proot +4. 能够使用SQL语句操作数据库 + 创建数据库: CREATE DATABASE 数据库名; + 查看所有数据库: SHOW DATABASES; + 删除数据库: DROP DATABASE 数据库名; + 切换数据库: USE 数据库名; +5. 能够使用SQL语句操作表结构 + 创建表: CREATE TABLE 表名 (字段名 类型, 字段名 类型, ...); + 查看所有表: SHOW TABLES; + 修改表: ALTER TABLE 表名; + 添加一列: ADD 字段名 类型 + 修改字段类型: MODIFY 字段名 新的类型; + 修改字段名: CHANGE 旧字段名 新字段名 新的类型; + 删除一列: DROP 字段名; + 修改表名: REANME TABLE 表名 TO 新表名 + 删除表: DROP TABLE 表名; +6. 能够使用SQL语句进行数据的添加修改和删除的操作 + 添加数据: INSERT INTO 表名 (字段名) VALUES (值); + 修改数据: UPDATE 表名 SET 字段名=新的值 WHERE 条件; + 删除数据: DELETE FROM 表名 WHERE 条件; +7. 能够使用SQL语句简单查询数据 + SELECT 字段名1, 字段名2, ... FROM 表名; \ No newline at end of file diff --git a/javaEE/day06/img/1.jpg b/javaEE/day06/img/1.jpg new file mode 100644 index 0000000..2749cb3 Binary files /dev/null and b/javaEE/day06/img/1.jpg differ diff --git a/javaEE/day06/img/1550289366973.png b/javaEE/day06/img/1550289366973.png new file mode 100644 index 0000000..cdf1638 Binary files /dev/null and b/javaEE/day06/img/1550289366973.png differ diff --git a/javaEE/day06/img/1550289380140.png b/javaEE/day06/img/1550289380140.png new file mode 100644 index 0000000..cdf1638 Binary files /dev/null and b/javaEE/day06/img/1550289380140.png differ diff --git a/javaEE/day06/img/1550289641391.png b/javaEE/day06/img/1550289641391.png new file mode 100644 index 0000000..c8bcb34 Binary files /dev/null and b/javaEE/day06/img/1550289641391.png differ diff --git a/javaEE/day06/img/1550408706301.png b/javaEE/day06/img/1550408706301.png new file mode 100644 index 0000000..b313097 Binary files /dev/null and b/javaEE/day06/img/1550408706301.png differ diff --git a/javaEE/day06/img/1550408729170.png b/javaEE/day06/img/1550408729170.png new file mode 100644 index 0000000..7819d75 Binary files /dev/null and b/javaEE/day06/img/1550408729170.png differ diff --git a/javaEE/day06/img/1550408779650.png b/javaEE/day06/img/1550408779650.png new file mode 100644 index 0000000..841e333 Binary files /dev/null and b/javaEE/day06/img/1550408779650.png differ diff --git a/javaEE/day06/img/1550408825267.png b/javaEE/day06/img/1550408825267.png new file mode 100644 index 0000000..885e496 Binary files /dev/null and b/javaEE/day06/img/1550408825267.png differ diff --git a/javaEE/day06/img/1550409365086.png b/javaEE/day06/img/1550409365086.png new file mode 100644 index 0000000..bdf6255 Binary files /dev/null and b/javaEE/day06/img/1550409365086.png differ diff --git a/javaEE/day06/img/1550410505421.png b/javaEE/day06/img/1550410505421.png new file mode 100644 index 0000000..92341ce Binary files /dev/null and b/javaEE/day06/img/1550410505421.png differ diff --git a/javaEE/day06/img/1551157215427.png b/javaEE/day06/img/1551157215427.png new file mode 100644 index 0000000..ec2a9ae Binary files /dev/null and b/javaEE/day06/img/1551157215427.png differ diff --git a/javaEE/day06/img/1551281803999.png b/javaEE/day06/img/1551281803999.png new file mode 100644 index 0000000..4fc65c2 Binary files /dev/null and b/javaEE/day06/img/1551281803999.png differ diff --git a/javaEE/day06/img/1551342236636.png b/javaEE/day06/img/1551342236636.png new file mode 100644 index 0000000..7958020 Binary files /dev/null and b/javaEE/day06/img/1551342236636.png differ diff --git a/javaEE/day06/img/1对1.png b/javaEE/day06/img/1对1.png new file mode 100644 index 0000000..9c18854 Binary files /dev/null and b/javaEE/day06/img/1对1.png differ diff --git a/javaEE/day06/img/1对12.png b/javaEE/day06/img/1对12.png new file mode 100644 index 0000000..63cb588 Binary files /dev/null and b/javaEE/day06/img/1对12.png differ diff --git a/javaEE/day06/img/1对多练习01.png b/javaEE/day06/img/1对多练习01.png new file mode 100644 index 0000000..97c5f93 Binary files /dev/null and b/javaEE/day06/img/1对多练习01.png differ diff --git a/javaEE/day06/img/1对多练习02.png b/javaEE/day06/img/1对多练习02.png new file mode 100644 index 0000000..c01701d Binary files /dev/null and b/javaEE/day06/img/1对多练习02.png differ diff --git a/javaEE/day06/img/1对多练习03.png b/javaEE/day06/img/1对多练习03.png new file mode 100644 index 0000000..4980761 Binary files /dev/null and b/javaEE/day06/img/1对多练习03.png differ diff --git a/javaEE/day06/img/DBMS.png b/javaEE/day06/img/DBMS.png new file mode 100644 index 0000000..d719b24 Binary files /dev/null and b/javaEE/day06/img/DBMS.png differ diff --git a/javaEE/day06/img/DCL01.png b/javaEE/day06/img/DCL01.png new file mode 100644 index 0000000..5163cce Binary files /dev/null and b/javaEE/day06/img/DCL01.png differ diff --git a/javaEE/day06/img/DCL02.png b/javaEE/day06/img/DCL02.png new file mode 100644 index 0000000..2ed78f8 Binary files /dev/null and b/javaEE/day06/img/DCL02.png differ diff --git a/javaEE/day06/img/DCL03.png b/javaEE/day06/img/DCL03.png new file mode 100644 index 0000000..2df945c Binary files /dev/null and b/javaEE/day06/img/DCL03.png differ diff --git a/javaEE/day06/img/DCL04.png b/javaEE/day06/img/DCL04.png new file mode 100644 index 0000000..165868c Binary files /dev/null and b/javaEE/day06/img/DCL04.png differ diff --git a/javaEE/day06/img/DCL05.png b/javaEE/day06/img/DCL05.png new file mode 100644 index 0000000..ca5fa66 Binary files /dev/null and b/javaEE/day06/img/DCL05.png differ diff --git a/javaEE/day06/img/DCL06.png b/javaEE/day06/img/DCL06.png new file mode 100644 index 0000000..07c7c6d Binary files /dev/null and b/javaEE/day06/img/DCL06.png differ diff --git a/javaEE/day06/img/DCL07.png b/javaEE/day06/img/DCL07.png new file mode 100644 index 0000000..556aa51 Binary files /dev/null and b/javaEE/day06/img/DCL07.png differ diff --git a/javaEE/day06/img/DCL08.png b/javaEE/day06/img/DCL08.png new file mode 100644 index 0000000..669af04 Binary files /dev/null and b/javaEE/day06/img/DCL08.png differ diff --git a/javaEE/day06/img/DCL09.png b/javaEE/day06/img/DCL09.png new file mode 100644 index 0000000..d370ba5 Binary files /dev/null and b/javaEE/day06/img/DCL09.png differ diff --git a/javaEE/day06/img/DOS中文乱码01.png b/javaEE/day06/img/DOS中文乱码01.png new file mode 100644 index 0000000..4888ba3 Binary files /dev/null and b/javaEE/day06/img/DOS中文乱码01.png differ diff --git a/javaEE/day06/img/DOS中文乱码02.png b/javaEE/day06/img/DOS中文乱码02.png new file mode 100644 index 0000000..0a79e24 Binary files /dev/null and b/javaEE/day06/img/DOS中文乱码02.png differ diff --git a/javaEE/day06/img/DOS中文乱码03.png b/javaEE/day06/img/DOS中文乱码03.png new file mode 100644 index 0000000..3ee8e8a Binary files /dev/null and b/javaEE/day06/img/DOS中文乱码03.png differ diff --git a/javaEE/day06/img/DOS中文乱码04.png b/javaEE/day06/img/DOS中文乱码04.png new file mode 100644 index 0000000..2a445b0 Binary files /dev/null and b/javaEE/day06/img/DOS中文乱码04.png differ diff --git a/javaEE/day06/img/MYSQL卸载01.png b/javaEE/day06/img/MYSQL卸载01.png new file mode 100644 index 0000000..eabe541 Binary files /dev/null and b/javaEE/day06/img/MYSQL卸载01.png differ diff --git a/javaEE/day06/img/MYSQL卸载02.png b/javaEE/day06/img/MYSQL卸载02.png new file mode 100644 index 0000000..95d0cba Binary files /dev/null and b/javaEE/day06/img/MYSQL卸载02.png differ diff --git a/javaEE/day06/img/MYSQL卸载03.png b/javaEE/day06/img/MYSQL卸载03.png new file mode 100644 index 0000000..0201a91 Binary files /dev/null and b/javaEE/day06/img/MYSQL卸载03.png differ diff --git a/javaEE/day06/img/MYSQL卸载04.png b/javaEE/day06/img/MYSQL卸载04.png new file mode 100644 index 0000000..651f52d Binary files /dev/null and b/javaEE/day06/img/MYSQL卸载04.png differ diff --git a/javaEE/day06/img/MYSQL安装01.png b/javaEE/day06/img/MYSQL安装01.png new file mode 100644 index 0000000..a12e05b Binary files /dev/null and b/javaEE/day06/img/MYSQL安装01.png differ diff --git a/javaEE/day06/img/MYSQL安装02.png b/javaEE/day06/img/MYSQL安装02.png new file mode 100644 index 0000000..bc0f29e Binary files /dev/null and b/javaEE/day06/img/MYSQL安装02.png differ diff --git a/javaEE/day06/img/MYSQL安装03.png b/javaEE/day06/img/MYSQL安装03.png new file mode 100644 index 0000000..a8ea346 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装03.png differ diff --git a/javaEE/day06/img/MYSQL安装04.png b/javaEE/day06/img/MYSQL安装04.png new file mode 100644 index 0000000..c4abe85 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装04.png differ diff --git a/javaEE/day06/img/MYSQL安装05.png b/javaEE/day06/img/MYSQL安装05.png new file mode 100644 index 0000000..e9a541a Binary files /dev/null and b/javaEE/day06/img/MYSQL安装05.png differ diff --git a/javaEE/day06/img/MYSQL安装06.png b/javaEE/day06/img/MYSQL安装06.png new file mode 100644 index 0000000..8b4881a Binary files /dev/null and b/javaEE/day06/img/MYSQL安装06.png differ diff --git a/javaEE/day06/img/MYSQL安装07.png b/javaEE/day06/img/MYSQL安装07.png new file mode 100644 index 0000000..b016ebb Binary files /dev/null and b/javaEE/day06/img/MYSQL安装07.png differ diff --git a/javaEE/day06/img/MYSQL安装08.png b/javaEE/day06/img/MYSQL安装08.png new file mode 100644 index 0000000..502bfb9 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装08.png differ diff --git a/javaEE/day06/img/MYSQL安装09.png b/javaEE/day06/img/MYSQL安装09.png new file mode 100644 index 0000000..ab3bfee Binary files /dev/null and b/javaEE/day06/img/MYSQL安装09.png differ diff --git a/javaEE/day06/img/MYSQL安装10.png b/javaEE/day06/img/MYSQL安装10.png new file mode 100644 index 0000000..c06865f Binary files /dev/null and b/javaEE/day06/img/MYSQL安装10.png differ diff --git a/javaEE/day06/img/MYSQL安装11.png b/javaEE/day06/img/MYSQL安装11.png new file mode 100644 index 0000000..c573638 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装11.png differ diff --git a/javaEE/day06/img/MYSQL安装12.png b/javaEE/day06/img/MYSQL安装12.png new file mode 100644 index 0000000..7bb21b9 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装12.png differ diff --git a/javaEE/day06/img/MYSQL安装13.png b/javaEE/day06/img/MYSQL安装13.png new file mode 100644 index 0000000..a539641 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装13.png differ diff --git a/javaEE/day06/img/MYSQL安装14.png b/javaEE/day06/img/MYSQL安装14.png new file mode 100644 index 0000000..a98a3c0 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装14.png differ diff --git a/javaEE/day06/img/MYSQL安装15.png b/javaEE/day06/img/MYSQL安装15.png new file mode 100644 index 0000000..95bcca2 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装15.png differ diff --git a/javaEE/day06/img/MYSQL安装16.png b/javaEE/day06/img/MYSQL安装16.png new file mode 100644 index 0000000..ab39bc3 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装16.png differ diff --git a/javaEE/day06/img/MYSQL安装17.png b/javaEE/day06/img/MYSQL安装17.png new file mode 100644 index 0000000..29cd912 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装17.png differ diff --git a/javaEE/day06/img/MYSQL安装18.png b/javaEE/day06/img/MYSQL安装18.png new file mode 100644 index 0000000..339c6ce Binary files /dev/null and b/javaEE/day06/img/MYSQL安装18.png differ diff --git a/javaEE/day06/img/MYSQL安装19.png b/javaEE/day06/img/MYSQL安装19.png new file mode 100644 index 0000000..f79f18b Binary files /dev/null and b/javaEE/day06/img/MYSQL安装19.png differ diff --git a/javaEE/day06/img/MYSQL安装20.png b/javaEE/day06/img/MYSQL安装20.png new file mode 100644 index 0000000..7985b8d Binary files /dev/null and b/javaEE/day06/img/MYSQL安装20.png differ diff --git a/javaEE/day06/img/MYSQL安装21.png b/javaEE/day06/img/MYSQL安装21.png new file mode 100644 index 0000000..349174e Binary files /dev/null and b/javaEE/day06/img/MYSQL安装21.png differ diff --git a/javaEE/day06/img/MYSQL安装22.png b/javaEE/day06/img/MYSQL安装22.png new file mode 100644 index 0000000..085d58f Binary files /dev/null and b/javaEE/day06/img/MYSQL安装22.png differ diff --git a/javaEE/day06/img/MYSQL安装23.png b/javaEE/day06/img/MYSQL安装23.png new file mode 100644 index 0000000..eeded9d Binary files /dev/null and b/javaEE/day06/img/MYSQL安装23.png differ diff --git a/javaEE/day06/img/MYSQL安装24.png b/javaEE/day06/img/MYSQL安装24.png new file mode 100644 index 0000000..e329140 Binary files /dev/null and b/javaEE/day06/img/MYSQL安装24.png differ diff --git a/javaEE/day06/img/MYSQL常用数据类型.png b/javaEE/day06/img/MYSQL常用数据类型.png new file mode 100644 index 0000000..81a88a7 Binary files /dev/null and b/javaEE/day06/img/MYSQL常用数据类型.png differ diff --git a/javaEE/day06/img/MYSQL登录01.png b/javaEE/day06/img/MYSQL登录01.png new file mode 100644 index 0000000..44d8df2 Binary files /dev/null and b/javaEE/day06/img/MYSQL登录01.png differ diff --git a/javaEE/day06/img/MYSQL登录02.png b/javaEE/day06/img/MYSQL登录02.png new file mode 100644 index 0000000..4bb6ac5 Binary files /dev/null and b/javaEE/day06/img/MYSQL登录02.png differ diff --git a/javaEE/day06/img/MYSQL登录03.png b/javaEE/day06/img/MYSQL登录03.png new file mode 100644 index 0000000..1ee0d6f Binary files /dev/null and b/javaEE/day06/img/MYSQL登录03.png differ diff --git a/javaEE/day06/img/MYSQL登录04.png b/javaEE/day06/img/MYSQL登录04.png new file mode 100644 index 0000000..af3e16c Binary files /dev/null and b/javaEE/day06/img/MYSQL登录04.png differ diff --git a/javaEE/day06/img/MYSQL退出01.png b/javaEE/day06/img/MYSQL退出01.png new file mode 100644 index 0000000..6c90a04 Binary files /dev/null and b/javaEE/day06/img/MYSQL退出01.png differ diff --git a/javaEE/day06/img/SQLYog介绍.png b/javaEE/day06/img/SQLYog介绍.png new file mode 100644 index 0000000..ba389dc Binary files /dev/null and b/javaEE/day06/img/SQLYog介绍.png differ diff --git a/javaEE/day06/img/SQLYog创建数据库.png b/javaEE/day06/img/SQLYog创建数据库.png new file mode 100644 index 0000000..eb29a47 Binary files /dev/null and b/javaEE/day06/img/SQLYog创建数据库.png differ diff --git a/javaEE/day06/img/SQLYog创建数据库02.png b/javaEE/day06/img/SQLYog创建数据库02.png new file mode 100644 index 0000000..5848810 Binary files /dev/null and b/javaEE/day06/img/SQLYog创建数据库02.png differ diff --git a/javaEE/day06/img/SQLYog创建表01.png b/javaEE/day06/img/SQLYog创建表01.png new file mode 100644 index 0000000..d030e8d Binary files /dev/null and b/javaEE/day06/img/SQLYog创建表01.png differ diff --git a/javaEE/day06/img/SQLYog创建表03.png b/javaEE/day06/img/SQLYog创建表03.png new file mode 100644 index 0000000..79d066e Binary files /dev/null and b/javaEE/day06/img/SQLYog创建表03.png differ diff --git a/javaEE/day06/img/SQLYog创建表效果.png b/javaEE/day06/img/SQLYog创建表效果.png new file mode 100644 index 0000000..2131be1 Binary files /dev/null and b/javaEE/day06/img/SQLYog创建表效果.png differ diff --git a/javaEE/day06/img/SQLYog注册.png b/javaEE/day06/img/SQLYog注册.png new file mode 100644 index 0000000..71987e6 Binary files /dev/null and b/javaEE/day06/img/SQLYog注册.png differ diff --git a/javaEE/day06/img/SQLYog破解.png b/javaEE/day06/img/SQLYog破解.png new file mode 100644 index 0000000..47c0c09 Binary files /dev/null and b/javaEE/day06/img/SQLYog破解.png differ diff --git a/javaEE/day06/img/SQLYog程序.png b/javaEE/day06/img/SQLYog程序.png new file mode 100644 index 0000000..c9a41b6 Binary files /dev/null and b/javaEE/day06/img/SQLYog程序.png differ diff --git a/javaEE/day06/img/SQLyog使用01.png b/javaEE/day06/img/SQLyog使用01.png new file mode 100644 index 0000000..e1b6c9c Binary files /dev/null and b/javaEE/day06/img/SQLyog使用01.png differ diff --git a/javaEE/day06/img/SQLyog使用02.png b/javaEE/day06/img/SQLyog使用02.png new file mode 100644 index 0000000..5e4eb3f Binary files /dev/null and b/javaEE/day06/img/SQLyog使用02.png differ diff --git a/javaEE/day06/img/SQL规范.png b/javaEE/day06/img/SQL规范.png new file mode 100644 index 0000000..c5641bc Binary files /dev/null and b/javaEE/day06/img/SQL规范.png differ diff --git a/javaEE/day06/img/ifnull01.png b/javaEE/day06/img/ifnull01.png new file mode 100644 index 0000000..9cfb64f Binary files /dev/null and b/javaEE/day06/img/ifnull01.png differ diff --git a/javaEE/day06/img/ifnull02.png b/javaEE/day06/img/ifnull02.png new file mode 100644 index 0000000..dccc0bf Binary files /dev/null and b/javaEE/day06/img/ifnull02.png differ diff --git a/javaEE/day06/img/limit01.png b/javaEE/day06/img/limit01.png new file mode 100644 index 0000000..310b84d Binary files /dev/null and b/javaEE/day06/img/limit01.png differ diff --git a/javaEE/day06/img/limit02.png b/javaEE/day06/img/limit02.png new file mode 100644 index 0000000..76339ac Binary files /dev/null and b/javaEE/day06/img/limit02.png differ diff --git a/javaEE/day06/img/limit03.png b/javaEE/day06/img/limit03.png new file mode 100644 index 0000000..716f6a1 Binary files /dev/null and b/javaEE/day06/img/limit03.png differ diff --git a/javaEE/day06/img/limit04.png b/javaEE/day06/img/limit04.png new file mode 100644 index 0000000..ec59960 Binary files /dev/null and b/javaEE/day06/img/limit04.png differ diff --git a/javaEE/day06/img/mysql启动01.png b/javaEE/day06/img/mysql启动01.png new file mode 100644 index 0000000..83e34c0 Binary files /dev/null and b/javaEE/day06/img/mysql启动01.png differ diff --git a/javaEE/day06/img/mysql启动02.png b/javaEE/day06/img/mysql启动02.png new file mode 100644 index 0000000..bb467e0 Binary files /dev/null and b/javaEE/day06/img/mysql启动02.png differ diff --git a/javaEE/day06/img/mysql启动03.png b/javaEE/day06/img/mysql启动03.png new file mode 100644 index 0000000..f368d93 Binary files /dev/null and b/javaEE/day06/img/mysql启动03.png differ diff --git a/javaEE/day06/img/mysql启动04.png b/javaEE/day06/img/mysql启动04.png new file mode 100644 index 0000000..106f2e7 Binary files /dev/null and b/javaEE/day06/img/mysql启动04.png differ diff --git a/javaEE/day06/img/orderby01.png b/javaEE/day06/img/orderby01.png new file mode 100644 index 0000000..4009521 Binary files /dev/null and b/javaEE/day06/img/orderby01.png differ diff --git a/javaEE/day06/img/orderby02.png b/javaEE/day06/img/orderby02.png new file mode 100644 index 0000000..7cb94c8 Binary files /dev/null and b/javaEE/day06/img/orderby02.png differ diff --git a/javaEE/day06/img/truncate.png b/javaEE/day06/img/truncate.png new file mode 100644 index 0000000..c9c05ce Binary files /dev/null and b/javaEE/day06/img/truncate.png differ diff --git a/javaEE/day06/img/where查询01.png b/javaEE/day06/img/where查询01.png new file mode 100644 index 0000000..0fd7703 Binary files /dev/null and b/javaEE/day06/img/where查询01.png differ diff --git a/javaEE/day06/img/where查询02.png b/javaEE/day06/img/where查询02.png new file mode 100644 index 0000000..a8cae11 Binary files /dev/null and b/javaEE/day06/img/where查询02.png differ diff --git a/javaEE/day06/img/where查询03.png b/javaEE/day06/img/where查询03.png new file mode 100644 index 0000000..30c6a91 Binary files /dev/null and b/javaEE/day06/img/where查询03.png differ diff --git a/javaEE/day06/img/where查询04.png b/javaEE/day06/img/where查询04.png new file mode 100644 index 0000000..f220601 Binary files /dev/null and b/javaEE/day06/img/where查询04.png differ diff --git a/javaEE/day06/img/where查询05.png b/javaEE/day06/img/where查询05.png new file mode 100644 index 0000000..b59154b Binary files /dev/null and b/javaEE/day06/img/where查询05.png differ diff --git a/javaEE/day06/img/where查询06.png b/javaEE/day06/img/where查询06.png new file mode 100644 index 0000000..f2cc38f Binary files /dev/null and b/javaEE/day06/img/where查询06.png differ diff --git a/javaEE/day06/img/where查询07.png b/javaEE/day06/img/where查询07.png new file mode 100644 index 0000000..913c584 Binary files /dev/null and b/javaEE/day06/img/where查询07.png differ diff --git a/javaEE/day06/img/where查询08.png b/javaEE/day06/img/where查询08.png new file mode 100644 index 0000000..2028ff6 Binary files /dev/null and b/javaEE/day06/img/where查询08.png differ diff --git a/javaEE/day06/img/where查询09.png b/javaEE/day06/img/where查询09.png new file mode 100644 index 0000000..bce9586 Binary files /dev/null and b/javaEE/day06/img/where查询09.png differ diff --git a/javaEE/day06/img/where查询10.png b/javaEE/day06/img/where查询10.png new file mode 100644 index 0000000..15fdd6e Binary files /dev/null and b/javaEE/day06/img/where查询10.png differ diff --git a/javaEE/day06/img/where查询11.png b/javaEE/day06/img/where查询11.png new file mode 100644 index 0000000..c02517f Binary files /dev/null and b/javaEE/day06/img/where查询11.png differ diff --git a/javaEE/day06/img/where查询12.png b/javaEE/day06/img/where查询12.png new file mode 100644 index 0000000..d7b1b60 Binary files /dev/null and b/javaEE/day06/img/where查询12.png differ diff --git a/javaEE/day06/img/一对多.png b/javaEE/day06/img/一对多.png new file mode 100644 index 0000000..0b6ee01 Binary files /dev/null and b/javaEE/day06/img/一对多.png differ diff --git a/javaEE/day06/img/一次性修改2个字段.png b/javaEE/day06/img/一次性修改2个字段.png new file mode 100644 index 0000000..4a82c44 Binary files /dev/null and b/javaEE/day06/img/一次性修改2个字段.png differ diff --git a/javaEE/day06/img/主键01.png b/javaEE/day06/img/主键01.png new file mode 100644 index 0000000..ccb613e Binary files /dev/null and b/javaEE/day06/img/主键01.png differ diff --git a/javaEE/day06/img/主键02.png b/javaEE/day06/img/主键02.png new file mode 100644 index 0000000..0aa553f Binary files /dev/null and b/javaEE/day06/img/主键02.png differ diff --git a/javaEE/day06/img/主键03.png b/javaEE/day06/img/主键03.png new file mode 100644 index 0000000..12c1ff1 Binary files /dev/null and b/javaEE/day06/img/主键03.png differ diff --git a/javaEE/day06/img/主键04.png b/javaEE/day06/img/主键04.png new file mode 100644 index 0000000..a5f1a5f Binary files /dev/null and b/javaEE/day06/img/主键04.png differ diff --git a/javaEE/day06/img/主键05.png b/javaEE/day06/img/主键05.png new file mode 100644 index 0000000..ff6ee94 Binary files /dev/null and b/javaEE/day06/img/主键05.png differ diff --git a/javaEE/day06/img/主键06.png b/javaEE/day06/img/主键06.png new file mode 100644 index 0000000..9597934 Binary files /dev/null and b/javaEE/day06/img/主键06.png differ diff --git a/javaEE/day06/img/主键07.png b/javaEE/day06/img/主键07.png new file mode 100644 index 0000000..215ef20 Binary files /dev/null and b/javaEE/day06/img/主键07.png differ diff --git a/javaEE/day06/img/事务01.png b/javaEE/day06/img/事务01.png new file mode 100644 index 0000000..b98bfab Binary files /dev/null and b/javaEE/day06/img/事务01.png differ diff --git a/javaEE/day06/img/事务02.png b/javaEE/day06/img/事务02.png new file mode 100644 index 0000000..7e8d6cb Binary files /dev/null and b/javaEE/day06/img/事务02.png differ diff --git a/javaEE/day06/img/事务03.png b/javaEE/day06/img/事务03.png new file mode 100644 index 0000000..396eb7e Binary files /dev/null and b/javaEE/day06/img/事务03.png differ diff --git a/javaEE/day06/img/事务04.png b/javaEE/day06/img/事务04.png new file mode 100644 index 0000000..1e5ff59 Binary files /dev/null and b/javaEE/day06/img/事务04.png differ diff --git a/javaEE/day06/img/事务05.png b/javaEE/day06/img/事务05.png new file mode 100644 index 0000000..5dd29d1 Binary files /dev/null and b/javaEE/day06/img/事务05.png differ diff --git a/javaEE/day06/img/事务06.png b/javaEE/day06/img/事务06.png new file mode 100644 index 0000000..1c6b1c0 Binary files /dev/null and b/javaEE/day06/img/事务06.png differ diff --git a/javaEE/day06/img/事务07.png b/javaEE/day06/img/事务07.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day06/img/事务07.png differ diff --git a/javaEE/day06/img/事务08.png b/javaEE/day06/img/事务08.png new file mode 100644 index 0000000..944a040 Binary files /dev/null and b/javaEE/day06/img/事务08.png differ diff --git a/javaEE/day06/img/事务09.png b/javaEE/day06/img/事务09.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day06/img/事务09.png differ diff --git a/javaEE/day06/img/事务10.png b/javaEE/day06/img/事务10.png new file mode 100644 index 0000000..8b14e4b Binary files /dev/null and b/javaEE/day06/img/事务10.png differ diff --git a/javaEE/day06/img/事务11.png b/javaEE/day06/img/事务11.png new file mode 100644 index 0000000..64e8919 Binary files /dev/null and b/javaEE/day06/img/事务11.png differ diff --git a/javaEE/day06/img/事务12.png b/javaEE/day06/img/事务12.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day06/img/事务12.png differ diff --git a/javaEE/day06/img/事务13.png b/javaEE/day06/img/事务13.png new file mode 100644 index 0000000..c8ca875 Binary files /dev/null and b/javaEE/day06/img/事务13.png differ diff --git a/javaEE/day06/img/事务14.png b/javaEE/day06/img/事务14.png new file mode 100644 index 0000000..0de1c72 Binary files /dev/null and b/javaEE/day06/img/事务14.png differ diff --git a/javaEE/day06/img/事务15.png b/javaEE/day06/img/事务15.png new file mode 100644 index 0000000..16c4683 Binary files /dev/null and b/javaEE/day06/img/事务15.png differ diff --git a/javaEE/day06/img/事务16.png b/javaEE/day06/img/事务16.png new file mode 100644 index 0000000..396eb7e Binary files /dev/null and b/javaEE/day06/img/事务16.png differ diff --git a/javaEE/day06/img/事务17.png b/javaEE/day06/img/事务17.png new file mode 100644 index 0000000..1e5ff59 Binary files /dev/null and b/javaEE/day06/img/事务17.png differ diff --git a/javaEE/day06/img/事务18.png b/javaEE/day06/img/事务18.png new file mode 100644 index 0000000..03c7d40 Binary files /dev/null and b/javaEE/day06/img/事务18.png differ diff --git a/javaEE/day06/img/事务19.png b/javaEE/day06/img/事务19.png new file mode 100644 index 0000000..f610922 Binary files /dev/null and b/javaEE/day06/img/事务19.png differ diff --git a/javaEE/day06/img/事务20.png b/javaEE/day06/img/事务20.png new file mode 100644 index 0000000..455b5e7 Binary files /dev/null and b/javaEE/day06/img/事务20.png differ diff --git a/javaEE/day06/img/事务21.png b/javaEE/day06/img/事务21.png new file mode 100644 index 0000000..76de958 Binary files /dev/null and b/javaEE/day06/img/事务21.png differ diff --git a/javaEE/day06/img/事务22.png b/javaEE/day06/img/事务22.png new file mode 100644 index 0000000..166a40b Binary files /dev/null and b/javaEE/day06/img/事务22.png differ diff --git a/javaEE/day06/img/事务23.png b/javaEE/day06/img/事务23.png new file mode 100644 index 0000000..e2065d5 Binary files /dev/null and b/javaEE/day06/img/事务23.png differ diff --git a/javaEE/day06/img/事务24.png b/javaEE/day06/img/事务24.png new file mode 100644 index 0000000..6a20f27 Binary files /dev/null and b/javaEE/day06/img/事务24.png differ diff --git a/javaEE/day06/img/事务25.png b/javaEE/day06/img/事务25.png new file mode 100644 index 0000000..296f285 Binary files /dev/null and b/javaEE/day06/img/事务25.png differ diff --git a/javaEE/day06/img/事务26.png b/javaEE/day06/img/事务26.png new file mode 100644 index 0000000..e847aec Binary files /dev/null and b/javaEE/day06/img/事务26.png differ diff --git a/javaEE/day06/img/事务27.png b/javaEE/day06/img/事务27.png new file mode 100644 index 0000000..f1204df Binary files /dev/null and b/javaEE/day06/img/事务27.png differ diff --git a/javaEE/day06/img/事务28.png b/javaEE/day06/img/事务28.png new file mode 100644 index 0000000..a08694c Binary files /dev/null and b/javaEE/day06/img/事务28.png differ diff --git a/javaEE/day06/img/事务29.png b/javaEE/day06/img/事务29.png new file mode 100644 index 0000000..0ed2184 Binary files /dev/null and b/javaEE/day06/img/事务29.png differ diff --git a/javaEE/day06/img/事务30.png b/javaEE/day06/img/事务30.png new file mode 100644 index 0000000..95b8d75 Binary files /dev/null and b/javaEE/day06/img/事务30.png differ diff --git a/javaEE/day06/img/事务31.png b/javaEE/day06/img/事务31.png new file mode 100644 index 0000000..4472d04 Binary files /dev/null and b/javaEE/day06/img/事务31.png differ diff --git a/javaEE/day06/img/事务32.png b/javaEE/day06/img/事务32.png new file mode 100644 index 0000000..b50bed8 Binary files /dev/null and b/javaEE/day06/img/事务32.png differ diff --git a/javaEE/day06/img/事务33.png b/javaEE/day06/img/事务33.png new file mode 100644 index 0000000..14b4f03 Binary files /dev/null and b/javaEE/day06/img/事务33.png differ diff --git a/javaEE/day06/img/事务34.png b/javaEE/day06/img/事务34.png new file mode 100644 index 0000000..95c0471 Binary files /dev/null and b/javaEE/day06/img/事务34.png differ diff --git a/javaEE/day06/img/事务35.png b/javaEE/day06/img/事务35.png new file mode 100644 index 0000000..622d16b Binary files /dev/null and b/javaEE/day06/img/事务35.png differ diff --git a/javaEE/day06/img/事务36.png b/javaEE/day06/img/事务36.png new file mode 100644 index 0000000..e227228 Binary files /dev/null and b/javaEE/day06/img/事务36.png differ diff --git a/javaEE/day06/img/事务37.png b/javaEE/day06/img/事务37.png new file mode 100644 index 0000000..14bba1d Binary files /dev/null and b/javaEE/day06/img/事务37.png differ diff --git a/javaEE/day06/img/事务38.png b/javaEE/day06/img/事务38.png new file mode 100644 index 0000000..012610a Binary files /dev/null and b/javaEE/day06/img/事务38.png differ diff --git a/javaEE/day06/img/事务39.png b/javaEE/day06/img/事务39.png new file mode 100644 index 0000000..35f2d7f Binary files /dev/null and b/javaEE/day06/img/事务39.png differ diff --git a/javaEE/day06/img/事务40.png b/javaEE/day06/img/事务40.png new file mode 100644 index 0000000..95a8934 Binary files /dev/null and b/javaEE/day06/img/事务40.png differ diff --git a/javaEE/day06/img/事务41.png b/javaEE/day06/img/事务41.png new file mode 100644 index 0000000..6fa0a67 Binary files /dev/null and b/javaEE/day06/img/事务41.png differ diff --git a/javaEE/day06/img/事务42.png b/javaEE/day06/img/事务42.png new file mode 100644 index 0000000..9c8ecbf Binary files /dev/null and b/javaEE/day06/img/事务42.png differ diff --git a/javaEE/day06/img/事务43.png b/javaEE/day06/img/事务43.png new file mode 100644 index 0000000..4893409 Binary files /dev/null and b/javaEE/day06/img/事务43.png differ diff --git a/javaEE/day06/img/事务44.png b/javaEE/day06/img/事务44.png new file mode 100644 index 0000000..f9e33f3 Binary files /dev/null and b/javaEE/day06/img/事务44.png differ diff --git a/javaEE/day06/img/事务45.png b/javaEE/day06/img/事务45.png new file mode 100644 index 0000000..1ddda85 Binary files /dev/null and b/javaEE/day06/img/事务45.png differ diff --git a/javaEE/day06/img/事务46.png b/javaEE/day06/img/事务46.png new file mode 100644 index 0000000..3cf7bd3 Binary files /dev/null and b/javaEE/day06/img/事务46.png differ diff --git a/javaEE/day06/img/事务47.png b/javaEE/day06/img/事务47.png new file mode 100644 index 0000000..dafa871 Binary files /dev/null and b/javaEE/day06/img/事务47.png differ diff --git a/javaEE/day06/img/事务48.png b/javaEE/day06/img/事务48.png new file mode 100644 index 0000000..d96862d Binary files /dev/null and b/javaEE/day06/img/事务48.png differ diff --git a/javaEE/day06/img/事务49.png b/javaEE/day06/img/事务49.png new file mode 100644 index 0000000..5fa3b98 Binary files /dev/null and b/javaEE/day06/img/事务49.png differ diff --git a/javaEE/day06/img/事务50.png b/javaEE/day06/img/事务50.png new file mode 100644 index 0000000..4e92355 Binary files /dev/null and b/javaEE/day06/img/事务50.png differ diff --git a/javaEE/day06/img/事务51.png b/javaEE/day06/img/事务51.png new file mode 100644 index 0000000..462407d Binary files /dev/null and b/javaEE/day06/img/事务51.png differ diff --git a/javaEE/day06/img/事务52.png b/javaEE/day06/img/事务52.png new file mode 100644 index 0000000..8e08da1 Binary files /dev/null and b/javaEE/day06/img/事务52.png differ diff --git a/javaEE/day06/img/事务53.png b/javaEE/day06/img/事务53.png new file mode 100644 index 0000000..0740b6f Binary files /dev/null and b/javaEE/day06/img/事务53.png differ diff --git a/javaEE/day06/img/事务54.png b/javaEE/day06/img/事务54.png new file mode 100644 index 0000000..f68a652 Binary files /dev/null and b/javaEE/day06/img/事务54.png differ diff --git a/javaEE/day06/img/事务55.png b/javaEE/day06/img/事务55.png new file mode 100644 index 0000000..5a12dc1 Binary files /dev/null and b/javaEE/day06/img/事务55.png differ diff --git a/javaEE/day06/img/事务56.png b/javaEE/day06/img/事务56.png new file mode 100644 index 0000000..b53b40c Binary files /dev/null and b/javaEE/day06/img/事务56.png differ diff --git a/javaEE/day06/img/事务57.png b/javaEE/day06/img/事务57.png new file mode 100644 index 0000000..a51708b Binary files /dev/null and b/javaEE/day06/img/事务57.png differ diff --git a/javaEE/day06/img/事务58.png b/javaEE/day06/img/事务58.png new file mode 100644 index 0000000..2fbf971 Binary files /dev/null and b/javaEE/day06/img/事务58.png differ diff --git a/javaEE/day06/img/事务59.png b/javaEE/day06/img/事务59.png new file mode 100644 index 0000000..407aef7 Binary files /dev/null and b/javaEE/day06/img/事务59.png differ diff --git a/javaEE/day06/img/事务60.png b/javaEE/day06/img/事务60.png new file mode 100644 index 0000000..63f468a Binary files /dev/null and b/javaEE/day06/img/事务60.png differ diff --git a/javaEE/day06/img/使用db1数据库.png b/javaEE/day06/img/使用db1数据库.png new file mode 100644 index 0000000..a4a21d0 Binary files /dev/null and b/javaEE/day06/img/使用db1数据库.png differ diff --git a/javaEE/day06/img/修改字段类型.png b/javaEE/day06/img/修改字段类型.png new file mode 100644 index 0000000..c00825d Binary files /dev/null and b/javaEE/day06/img/修改字段类型.png differ diff --git a/javaEE/day06/img/修改字符集.png b/javaEE/day06/img/修改字符集.png new file mode 100644 index 0000000..75a478a Binary files /dev/null and b/javaEE/day06/img/修改字符集.png differ diff --git a/javaEE/day06/img/修改所有数据.png b/javaEE/day06/img/修改所有数据.png new file mode 100644 index 0000000..4ff002e Binary files /dev/null and b/javaEE/day06/img/修改所有数据.png differ diff --git a/javaEE/day06/img/修改数据库字符集.png b/javaEE/day06/img/修改数据库字符集.png new file mode 100644 index 0000000..9fb5043 Binary files /dev/null and b/javaEE/day06/img/修改数据库字符集.png differ diff --git a/javaEE/day06/img/修改表名.png b/javaEE/day06/img/修改表名.png new file mode 100644 index 0000000..455c42a Binary files /dev/null and b/javaEE/day06/img/修改表名.png differ diff --git a/javaEE/day06/img/修改表字段名称.png b/javaEE/day06/img/修改表字段名称.png new file mode 100644 index 0000000..84a233a Binary files /dev/null and b/javaEE/day06/img/修改表字段名称.png differ diff --git a/javaEE/day06/img/分组01.png b/javaEE/day06/img/分组01.png new file mode 100644 index 0000000..fd55a36 Binary files /dev/null and b/javaEE/day06/img/分组01.png differ diff --git a/javaEE/day06/img/分组02.png b/javaEE/day06/img/分组02.png new file mode 100644 index 0000000..6a641f0 Binary files /dev/null and b/javaEE/day06/img/分组02.png differ diff --git a/javaEE/day06/img/分组03.png b/javaEE/day06/img/分组03.png new file mode 100644 index 0000000..97eeb4e Binary files /dev/null and b/javaEE/day06/img/分组03.png differ diff --git a/javaEE/day06/img/分组04.png b/javaEE/day06/img/分组04.png new file mode 100644 index 0000000..948542d Binary files /dev/null and b/javaEE/day06/img/分组04.png differ diff --git a/javaEE/day06/img/分组05.png b/javaEE/day06/img/分组05.png new file mode 100644 index 0000000..400d98d Binary files /dev/null and b/javaEE/day06/img/分组05.png differ diff --git a/javaEE/day06/img/分组06.png b/javaEE/day06/img/分组06.png new file mode 100644 index 0000000..978e04c Binary files /dev/null and b/javaEE/day06/img/分组06.png differ diff --git a/javaEE/day06/img/分组07.png b/javaEE/day06/img/分组07.png new file mode 100644 index 0000000..b11bba2 Binary files /dev/null and b/javaEE/day06/img/分组07.png differ diff --git a/javaEE/day06/img/分组08.png b/javaEE/day06/img/分组08.png new file mode 100644 index 0000000..fd3aaa7 Binary files /dev/null and b/javaEE/day06/img/分组08.png differ diff --git a/javaEE/day06/img/分组09.png b/javaEE/day06/img/分组09.png new file mode 100644 index 0000000..57c2b32 Binary files /dev/null and b/javaEE/day06/img/分组09.png differ diff --git a/javaEE/day06/img/分组10.png b/javaEE/day06/img/分组10.png new file mode 100644 index 0000000..ec915df Binary files /dev/null and b/javaEE/day06/img/分组10.png differ diff --git a/javaEE/day06/img/创建数据库并指定字符集.png b/javaEE/day06/img/创建数据库并指定字符集.png new file mode 100644 index 0000000..a3c011e Binary files /dev/null and b/javaEE/day06/img/创建数据库并指定字符集.png differ diff --git a/javaEE/day06/img/创建表结构相同的表.png b/javaEE/day06/img/创建表结构相同的表.png new file mode 100644 index 0000000..969944b Binary files /dev/null and b/javaEE/day06/img/创建表结构相同的表.png differ diff --git a/javaEE/day06/img/删除字段.png b/javaEE/day06/img/删除字段.png new file mode 100644 index 0000000..d022650 Binary files /dev/null and b/javaEE/day06/img/删除字段.png differ diff --git a/javaEE/day06/img/删除所有记录.png b/javaEE/day06/img/删除所有记录.png new file mode 100644 index 0000000..737f946 Binary files /dev/null and b/javaEE/day06/img/删除所有记录.png differ diff --git a/javaEE/day06/img/删除数据库.png b/javaEE/day06/img/删除数据库.png new file mode 100644 index 0000000..23b9f2e Binary files /dev/null and b/javaEE/day06/img/删除数据库.png differ diff --git a/javaEE/day06/img/删除满足条件的记录.png b/javaEE/day06/img/删除满足条件的记录.png new file mode 100644 index 0000000..086923f Binary files /dev/null and b/javaEE/day06/img/删除满足条件的记录.png differ diff --git a/javaEE/day06/img/判断是否存在并创建数据库.png b/javaEE/day06/img/判断是否存在并创建数据库.png new file mode 100644 index 0000000..729dfef Binary files /dev/null and b/javaEE/day06/img/判断是否存在并创建数据库.png differ diff --git a/javaEE/day06/img/判断表存在并删除.png b/javaEE/day06/img/判断表存在并删除.png new file mode 100644 index 0000000..a61c18d Binary files /dev/null and b/javaEE/day06/img/判断表存在并删除.png differ diff --git a/javaEE/day06/img/取出重复数据.png b/javaEE/day06/img/取出重复数据.png new file mode 100644 index 0000000..c28efda Binary files /dev/null and b/javaEE/day06/img/取出重复数据.png differ diff --git a/javaEE/day06/img/填写表中的字段信息.png b/javaEE/day06/img/填写表中的字段信息.png new file mode 100644 index 0000000..882b7a1 Binary files /dev/null and b/javaEE/day06/img/填写表中的字段信息.png differ diff --git a/javaEE/day06/img/外键01.png b/javaEE/day06/img/外键01.png new file mode 100644 index 0000000..fbf414a Binary files /dev/null and b/javaEE/day06/img/外键01.png differ diff --git a/javaEE/day06/img/外键02.png b/javaEE/day06/img/外键02.png new file mode 100644 index 0000000..9426f4b Binary files /dev/null and b/javaEE/day06/img/外键02.png differ diff --git a/javaEE/day06/img/外键03.png b/javaEE/day06/img/外键03.png new file mode 100644 index 0000000..767bba8 Binary files /dev/null and b/javaEE/day06/img/外键03.png differ diff --git a/javaEE/day06/img/外键04.png b/javaEE/day06/img/外键04.png new file mode 100644 index 0000000..17d26c3 Binary files /dev/null and b/javaEE/day06/img/外键04.png differ diff --git a/javaEE/day06/img/多对多.png b/javaEE/day06/img/多对多.png new file mode 100644 index 0000000..123f5a5 Binary files /dev/null and b/javaEE/day06/img/多对多.png differ diff --git a/javaEE/day06/img/多对多练习01.png b/javaEE/day06/img/多对多练习01.png new file mode 100644 index 0000000..a3c45ac Binary files /dev/null and b/javaEE/day06/img/多对多练习01.png differ diff --git a/javaEE/day06/img/多对多练习02.png b/javaEE/day06/img/多对多练习02.png new file mode 100644 index 0000000..fe60244 Binary files /dev/null and b/javaEE/day06/img/多对多练习02.png differ diff --git a/javaEE/day06/img/多对多练习03.png b/javaEE/day06/img/多对多练习03.png new file mode 100644 index 0000000..e499fab Binary files /dev/null and b/javaEE/day06/img/多对多练习03.png differ diff --git a/javaEE/day06/img/多表查询01.png b/javaEE/day06/img/多表查询01.png new file mode 100644 index 0000000..18276ba Binary files /dev/null and b/javaEE/day06/img/多表查询01.png differ diff --git a/javaEE/day06/img/多表查询02.png b/javaEE/day06/img/多表查询02.png new file mode 100644 index 0000000..88f6049 Binary files /dev/null and b/javaEE/day06/img/多表查询02.png differ diff --git a/javaEE/day06/img/多表查询03.png b/javaEE/day06/img/多表查询03.png new file mode 100644 index 0000000..3eb80f6 Binary files /dev/null and b/javaEE/day06/img/多表查询03.png differ diff --git a/javaEE/day06/img/多表查询04.png b/javaEE/day06/img/多表查询04.png new file mode 100644 index 0000000..b0e4295 Binary files /dev/null and b/javaEE/day06/img/多表查询04.png differ diff --git a/javaEE/day06/img/多表查询05.png b/javaEE/day06/img/多表查询05.png new file mode 100644 index 0000000..62642a1 Binary files /dev/null and b/javaEE/day06/img/多表查询05.png differ diff --git a/javaEE/day06/img/多表查询06.png b/javaEE/day06/img/多表查询06.png new file mode 100644 index 0000000..e1a12e5 Binary files /dev/null and b/javaEE/day06/img/多表查询06.png differ diff --git a/javaEE/day06/img/多表查询07.png b/javaEE/day06/img/多表查询07.png new file mode 100644 index 0000000..7b9a1a1 Binary files /dev/null and b/javaEE/day06/img/多表查询07.png differ diff --git a/javaEE/day06/img/多表查询08.png b/javaEE/day06/img/多表查询08.png new file mode 100644 index 0000000..b6e217e Binary files /dev/null and b/javaEE/day06/img/多表查询08.png differ diff --git a/javaEE/day06/img/多表查询09.png b/javaEE/day06/img/多表查询09.png new file mode 100644 index 0000000..1db828e Binary files /dev/null and b/javaEE/day06/img/多表查询09.png differ diff --git a/javaEE/day06/img/多表查询10.png b/javaEE/day06/img/多表查询10.png new file mode 100644 index 0000000..3b8b950 Binary files /dev/null and b/javaEE/day06/img/多表查询10.png differ diff --git a/javaEE/day06/img/多表查询11.png b/javaEE/day06/img/多表查询11.png new file mode 100644 index 0000000..192e4a1 Binary files /dev/null and b/javaEE/day06/img/多表查询11.png differ diff --git a/javaEE/day06/img/多表查询12.png b/javaEE/day06/img/多表查询12.png new file mode 100644 index 0000000..079d92a Binary files /dev/null and b/javaEE/day06/img/多表查询12.png differ diff --git a/javaEE/day06/img/多表查询13.png b/javaEE/day06/img/多表查询13.png new file mode 100644 index 0000000..cfc6de9 Binary files /dev/null and b/javaEE/day06/img/多表查询13.png differ diff --git a/javaEE/day06/img/多表查询14.png b/javaEE/day06/img/多表查询14.png new file mode 100644 index 0000000..46ac5b9 Binary files /dev/null and b/javaEE/day06/img/多表查询14.png differ diff --git a/javaEE/day06/img/多表查询15.png b/javaEE/day06/img/多表查询15.png new file mode 100644 index 0000000..2a4df7f Binary files /dev/null and b/javaEE/day06/img/多表查询15.png differ diff --git a/javaEE/day06/img/多表查询16.png b/javaEE/day06/img/多表查询16.png new file mode 100644 index 0000000..4f914ca Binary files /dev/null and b/javaEE/day06/img/多表查询16.png differ diff --git a/javaEE/day06/img/多表查询17.png b/javaEE/day06/img/多表查询17.png new file mode 100644 index 0000000..3bb4ec3 Binary files /dev/null and b/javaEE/day06/img/多表查询17.png differ diff --git a/javaEE/day06/img/多表查询18.png b/javaEE/day06/img/多表查询18.png new file mode 100644 index 0000000..48acb19 Binary files /dev/null and b/javaEE/day06/img/多表查询18.png differ diff --git a/javaEE/day06/img/多表查询19.png b/javaEE/day06/img/多表查询19.png new file mode 100644 index 0000000..f005b2a Binary files /dev/null and b/javaEE/day06/img/多表查询19.png differ diff --git a/javaEE/day06/img/多表查询20.png b/javaEE/day06/img/多表查询20.png new file mode 100644 index 0000000..28f163c Binary files /dev/null and b/javaEE/day06/img/多表查询20.png differ diff --git a/javaEE/day06/img/多表查询21.png b/javaEE/day06/img/多表查询21.png new file mode 100644 index 0000000..b118945 Binary files /dev/null and b/javaEE/day06/img/多表查询21.png differ diff --git a/javaEE/day06/img/多表查询22.png b/javaEE/day06/img/多表查询22.png new file mode 100644 index 0000000..d7859d8 Binary files /dev/null and b/javaEE/day06/img/多表查询22.png differ diff --git a/javaEE/day06/img/多表查询23.png b/javaEE/day06/img/多表查询23.png new file mode 100644 index 0000000..ee99716 Binary files /dev/null and b/javaEE/day06/img/多表查询23.png differ diff --git a/javaEE/day06/img/多表查询24.png b/javaEE/day06/img/多表查询24.png new file mode 100644 index 0000000..ffd1590 Binary files /dev/null and b/javaEE/day06/img/多表查询24.png differ diff --git a/javaEE/day06/img/多表查询25.png b/javaEE/day06/img/多表查询25.png new file mode 100644 index 0000000..7f7b75a Binary files /dev/null and b/javaEE/day06/img/多表查询25.png differ diff --git a/javaEE/day06/img/多表查询26.png b/javaEE/day06/img/多表查询26.png new file mode 100644 index 0000000..61aa9ea Binary files /dev/null and b/javaEE/day06/img/多表查询26.png differ diff --git a/javaEE/day06/img/多表查询27.png b/javaEE/day06/img/多表查询27.png new file mode 100644 index 0000000..bc1c8a2 Binary files /dev/null and b/javaEE/day06/img/多表查询27.png differ diff --git a/javaEE/day06/img/多表查询28.png b/javaEE/day06/img/多表查询28.png new file mode 100644 index 0000000..6bd8529 Binary files /dev/null and b/javaEE/day06/img/多表查询28.png differ diff --git a/javaEE/day06/img/多表查询29.png b/javaEE/day06/img/多表查询29.png new file mode 100644 index 0000000..5254d90 Binary files /dev/null and b/javaEE/day06/img/多表查询29.png differ diff --git a/javaEE/day06/img/多表查询30.png b/javaEE/day06/img/多表查询30.png new file mode 100644 index 0000000..60b37ea Binary files /dev/null and b/javaEE/day06/img/多表查询30.png differ diff --git a/javaEE/day06/img/多表查询31.png b/javaEE/day06/img/多表查询31.png new file mode 100644 index 0000000..065b940 Binary files /dev/null and b/javaEE/day06/img/多表查询31.png differ diff --git a/javaEE/day06/img/多表查询32.png b/javaEE/day06/img/多表查询32.png new file mode 100644 index 0000000..cced728 Binary files /dev/null and b/javaEE/day06/img/多表查询32.png differ diff --git a/javaEE/day06/img/多表查询33.png b/javaEE/day06/img/多表查询33.png new file mode 100644 index 0000000..241a129 Binary files /dev/null and b/javaEE/day06/img/多表查询33.png differ diff --git a/javaEE/day06/img/多表查询34.png b/javaEE/day06/img/多表查询34.png new file mode 100644 index 0000000..5e3e247 Binary files /dev/null and b/javaEE/day06/img/多表查询34.png differ diff --git a/javaEE/day06/img/多表查询35.png b/javaEE/day06/img/多表查询35.png new file mode 100644 index 0000000..9721497 Binary files /dev/null and b/javaEE/day06/img/多表查询35.png differ diff --git a/javaEE/day06/img/多表查询36.png b/javaEE/day06/img/多表查询36.png new file mode 100644 index 0000000..65f86ad Binary files /dev/null and b/javaEE/day06/img/多表查询36.png differ diff --git a/javaEE/day06/img/多表查询37.png b/javaEE/day06/img/多表查询37.png new file mode 100644 index 0000000..81b1795 Binary files /dev/null and b/javaEE/day06/img/多表查询37.png differ diff --git a/javaEE/day06/img/多表查询38.png b/javaEE/day06/img/多表查询38.png new file mode 100644 index 0000000..1ec4b93 Binary files /dev/null and b/javaEE/day06/img/多表查询38.png differ diff --git a/javaEE/day06/img/多表查询39.png b/javaEE/day06/img/多表查询39.png new file mode 100644 index 0000000..8e32559 Binary files /dev/null and b/javaEE/day06/img/多表查询39.png differ diff --git a/javaEE/day06/img/多表查询40.png b/javaEE/day06/img/多表查询40.png new file mode 100644 index 0000000..647d3ea Binary files /dev/null and b/javaEE/day06/img/多表查询40.png differ diff --git a/javaEE/day06/img/多表查询41.png b/javaEE/day06/img/多表查询41.png new file mode 100644 index 0000000..942641b Binary files /dev/null and b/javaEE/day06/img/多表查询41.png differ diff --git a/javaEE/day06/img/多表查询42.png b/javaEE/day06/img/多表查询42.png new file mode 100644 index 0000000..18795cc Binary files /dev/null and b/javaEE/day06/img/多表查询42.png differ diff --git a/javaEE/day06/img/多表查询43.png b/javaEE/day06/img/多表查询43.png new file mode 100644 index 0000000..a92204a Binary files /dev/null and b/javaEE/day06/img/多表查询43.png differ diff --git a/javaEE/day06/img/多表查询44.png b/javaEE/day06/img/多表查询44.png new file mode 100644 index 0000000..548738a Binary files /dev/null and b/javaEE/day06/img/多表查询44.png differ diff --git a/javaEE/day06/img/子查询01.png b/javaEE/day06/img/子查询01.png new file mode 100644 index 0000000..5a6be99 Binary files /dev/null and b/javaEE/day06/img/子查询01.png differ diff --git a/javaEE/day06/img/子查询02.png b/javaEE/day06/img/子查询02.png new file mode 100644 index 0000000..f67d12c Binary files /dev/null and b/javaEE/day06/img/子查询02.png differ diff --git a/javaEE/day06/img/子查询03.png b/javaEE/day06/img/子查询03.png new file mode 100644 index 0000000..34c91db Binary files /dev/null and b/javaEE/day06/img/子查询03.png differ diff --git a/javaEE/day06/img/子查询04.png b/javaEE/day06/img/子查询04.png new file mode 100644 index 0000000..e44766e Binary files /dev/null and b/javaEE/day06/img/子查询04.png differ diff --git a/javaEE/day06/img/子查询05.png b/javaEE/day06/img/子查询05.png new file mode 100644 index 0000000..3a72ad9 Binary files /dev/null and b/javaEE/day06/img/子查询05.png differ diff --git a/javaEE/day06/img/子查询06.png b/javaEE/day06/img/子查询06.png new file mode 100644 index 0000000..d9830d9 Binary files /dev/null and b/javaEE/day06/img/子查询06.png differ diff --git a/javaEE/day06/img/子查询07.png b/javaEE/day06/img/子查询07.png new file mode 100644 index 0000000..58df821 Binary files /dev/null and b/javaEE/day06/img/子查询07.png differ diff --git a/javaEE/day06/img/子查询08.png b/javaEE/day06/img/子查询08.png new file mode 100644 index 0000000..d27c9af Binary files /dev/null and b/javaEE/day06/img/子查询08.png differ diff --git a/javaEE/day06/img/子查询09.png b/javaEE/day06/img/子查询09.png new file mode 100644 index 0000000..e7887a6 Binary files /dev/null and b/javaEE/day06/img/子查询09.png differ diff --git a/javaEE/day06/img/子查询10.png b/javaEE/day06/img/子查询10.png new file mode 100644 index 0000000..2b10bda Binary files /dev/null and b/javaEE/day06/img/子查询10.png differ diff --git a/javaEE/day06/img/子查询11.png b/javaEE/day06/img/子查询11.png new file mode 100644 index 0000000..690a012 Binary files /dev/null and b/javaEE/day06/img/子查询11.png differ diff --git a/javaEE/day06/img/子查询12.png b/javaEE/day06/img/子查询12.png new file mode 100644 index 0000000..92d8a1c Binary files /dev/null and b/javaEE/day06/img/子查询12.png differ diff --git a/javaEE/day06/img/子查询13.png b/javaEE/day06/img/子查询13.png new file mode 100644 index 0000000..d570747 Binary files /dev/null and b/javaEE/day06/img/子查询13.png differ diff --git a/javaEE/day06/img/子查询14.png b/javaEE/day06/img/子查询14.png new file mode 100644 index 0000000..7fc8a14 Binary files /dev/null and b/javaEE/day06/img/子查询14.png differ diff --git a/javaEE/day06/img/实体类与表的对应关系.png b/javaEE/day06/img/实体类与表的对应关系.png new file mode 100644 index 0000000..26f969f Binary files /dev/null and b/javaEE/day06/img/实体类与表的对应关系.png differ diff --git a/javaEE/day06/img/带条件修改.png b/javaEE/day06/img/带条件修改.png new file mode 100644 index 0000000..0c614d3 Binary files /dev/null and b/javaEE/day06/img/带条件修改.png differ diff --git a/javaEE/day06/img/常见数据库.PNG b/javaEE/day06/img/常见数据库.PNG new file mode 100644 index 0000000..2f9e7d3 Binary files /dev/null and b/javaEE/day06/img/常见数据库.PNG differ diff --git a/javaEE/day06/img/所有字段都添加数据.png b/javaEE/day06/img/所有字段都添加数据.png new file mode 100644 index 0000000..f55df29 Binary files /dev/null and b/javaEE/day06/img/所有字段都添加数据.png differ diff --git a/javaEE/day06/img/数据库导出01.png b/javaEE/day06/img/数据库导出01.png new file mode 100644 index 0000000..934e98b Binary files /dev/null and b/javaEE/day06/img/数据库导出01.png differ diff --git a/javaEE/day06/img/数据库导出02.png b/javaEE/day06/img/数据库导出02.png new file mode 100644 index 0000000..3d8be5f Binary files /dev/null and b/javaEE/day06/img/数据库导出02.png differ diff --git a/javaEE/day06/img/数据库导出03.png b/javaEE/day06/img/数据库导出03.png new file mode 100644 index 0000000..3978e91 Binary files /dev/null and b/javaEE/day06/img/数据库导出03.png differ diff --git a/javaEE/day06/img/数据库导出04.png b/javaEE/day06/img/数据库导出04.png new file mode 100644 index 0000000..0b90bea Binary files /dev/null and b/javaEE/day06/img/数据库导出04.png differ diff --git a/javaEE/day06/img/数据库导出05.png b/javaEE/day06/img/数据库导出05.png new file mode 100644 index 0000000..3383adc Binary files /dev/null and b/javaEE/day06/img/数据库导出05.png differ diff --git a/javaEE/day06/img/数据库导出06.png b/javaEE/day06/img/数据库导出06.png new file mode 100644 index 0000000..e570201 Binary files /dev/null and b/javaEE/day06/img/数据库导出06.png differ diff --git a/javaEE/day06/img/数据库导出07.png b/javaEE/day06/img/数据库导出07.png new file mode 100644 index 0000000..13a5274 Binary files /dev/null and b/javaEE/day06/img/数据库导出07.png differ diff --git a/javaEE/day06/img/数据库导出08.png b/javaEE/day06/img/数据库导出08.png new file mode 100644 index 0000000..05c5197 Binary files /dev/null and b/javaEE/day06/img/数据库导出08.png differ diff --git a/javaEE/day06/img/数据库导出09.png b/javaEE/day06/img/数据库导出09.png new file mode 100644 index 0000000..869baa2 Binary files /dev/null and b/javaEE/day06/img/数据库导出09.png differ diff --git a/javaEE/day06/img/数据库导出10.png b/javaEE/day06/img/数据库导出10.png new file mode 100644 index 0000000..608a0ee Binary files /dev/null and b/javaEE/day06/img/数据库导出10.png differ diff --git a/javaEE/day06/img/查看student的创建表SQL语句.png b/javaEE/day06/img/查看student的创建表SQL语句.png new file mode 100644 index 0000000..2defe14 Binary files /dev/null and b/javaEE/day06/img/查看student的创建表SQL语句.png differ diff --git a/javaEE/day06/img/查看student表的结构.png b/javaEE/day06/img/查看student表的结构.png new file mode 100644 index 0000000..0438cae Binary files /dev/null and b/javaEE/day06/img/查看student表的结构.png differ diff --git a/javaEE/day06/img/查看所有数据库.png b/javaEE/day06/img/查看所有数据库.png new file mode 100644 index 0000000..c16e7e9 Binary files /dev/null and b/javaEE/day06/img/查看所有数据库.png differ diff --git a/javaEE/day06/img/查看某个数据库中的所有表.png b/javaEE/day06/img/查看某个数据库中的所有表.png new file mode 100644 index 0000000..247eb3a Binary files /dev/null and b/javaEE/day06/img/查看某个数据库中的所有表.png differ diff --git a/javaEE/day06/img/查看某个数据库的定义信息.png b/javaEE/day06/img/查看某个数据库的定义信息.png new file mode 100644 index 0000000..5725678 Binary files /dev/null and b/javaEE/day06/img/查看某个数据库的定义信息.png differ diff --git a/javaEE/day06/img/查看正在使用的数据库.png b/javaEE/day06/img/查看正在使用的数据库.png new file mode 100644 index 0000000..a4b111f Binary files /dev/null and b/javaEE/day06/img/查看正在使用的数据库.png differ diff --git a/javaEE/day06/img/查询math和english的和.png b/javaEE/day06/img/查询math和english的和.png new file mode 100644 index 0000000..2cfef4a Binary files /dev/null and b/javaEE/day06/img/查询math和english的和.png differ diff --git a/javaEE/day06/img/查询后年龄增加10岁.png b/javaEE/day06/img/查询后年龄增加10岁.png new file mode 100644 index 0000000..505dd0b Binary files /dev/null and b/javaEE/day06/img/查询后年龄增加10岁.png differ diff --git a/javaEE/day06/img/查询字段别名.png b/javaEE/day06/img/查询字段别名.png new file mode 100644 index 0000000..c63541d Binary files /dev/null and b/javaEE/day06/img/查询字段别名.png differ diff --git a/javaEE/day06/img/查询所有列.png b/javaEE/day06/img/查询所有列.png new file mode 100644 index 0000000..d643b97 Binary files /dev/null and b/javaEE/day06/img/查询所有列.png differ diff --git a/javaEE/day06/img/查询所有列数据和参与运算.png b/javaEE/day06/img/查询所有列数据和参与运算.png new file mode 100644 index 0000000..23e4c09 Binary files /dev/null and b/javaEE/day06/img/查询所有列数据和参与运算.png differ diff --git a/javaEE/day06/img/查询指定字段.png b/javaEE/day06/img/查询指定字段.png new file mode 100644 index 0000000..0ef1ac0 Binary files /dev/null and b/javaEE/day06/img/查询指定字段.png differ diff --git a/javaEE/day06/img/查询表别名.png b/javaEE/day06/img/查询表别名.png new file mode 100644 index 0000000..b986abb Binary files /dev/null and b/javaEE/day06/img/查询表别名.png differ diff --git a/javaEE/day06/img/添加字段.png b/javaEE/day06/img/添加字段.png new file mode 100644 index 0000000..2fcc173 Binary files /dev/null and b/javaEE/day06/img/添加字段.png differ diff --git a/javaEE/day06/img/添加所有字段数据.png b/javaEE/day06/img/添加所有字段数据.png new file mode 100644 index 0000000..3cfaada Binary files /dev/null and b/javaEE/day06/img/添加所有字段数据.png differ diff --git a/javaEE/day06/img/添加数学和英语成绩.png b/javaEE/day06/img/添加数学和英语成绩.png new file mode 100644 index 0000000..2ccc593 Binary files /dev/null and b/javaEE/day06/img/添加数学和英语成绩.png differ diff --git a/javaEE/day06/img/添加部分数据.png b/javaEE/day06/img/添加部分数据.png new file mode 100644 index 0000000..83edf77 Binary files /dev/null and b/javaEE/day06/img/添加部分数据.png differ diff --git a/javaEE/day06/img/直接创建数据库.png b/javaEE/day06/img/直接创建数据库.png new file mode 100644 index 0000000..c185407 Binary files /dev/null and b/javaEE/day06/img/直接创建数据库.png differ diff --git a/javaEE/day06/img/直接删除表.png b/javaEE/day06/img/直接删除表.png new file mode 100644 index 0000000..89508d0 Binary files /dev/null and b/javaEE/day06/img/直接删除表.png differ diff --git a/javaEE/day06/img/级联操作01.png b/javaEE/day06/img/级联操作01.png new file mode 100644 index 0000000..a8c7a80 Binary files /dev/null and b/javaEE/day06/img/级联操作01.png differ diff --git a/javaEE/day06/img/级联操作02.png b/javaEE/day06/img/级联操作02.png new file mode 100644 index 0000000..e106e0e Binary files /dev/null and b/javaEE/day06/img/级联操作02.png differ diff --git a/javaEE/day06/img/组合查询结果取别名.png b/javaEE/day06/img/组合查询结果取别名.png new file mode 100644 index 0000000..18ea48f Binary files /dev/null and b/javaEE/day06/img/组合查询结果取别名.png differ diff --git a/javaEE/day06/img/聚合函数01.png b/javaEE/day06/img/聚合函数01.png new file mode 100644 index 0000000..e354ec8 Binary files /dev/null and b/javaEE/day06/img/聚合函数01.png differ diff --git a/javaEE/day06/img/聚合函数02.png b/javaEE/day06/img/聚合函数02.png new file mode 100644 index 0000000..524f214 Binary files /dev/null and b/javaEE/day06/img/聚合函数02.png differ diff --git a/javaEE/day06/img/聚合函数03.png b/javaEE/day06/img/聚合函数03.png new file mode 100644 index 0000000..0b03cfa Binary files /dev/null and b/javaEE/day06/img/聚合函数03.png differ diff --git a/javaEE/day06/img/聚合函数04.png b/javaEE/day06/img/聚合函数04.png new file mode 100644 index 0000000..3ad4532 Binary files /dev/null and b/javaEE/day06/img/聚合函数04.png differ diff --git a/javaEE/day06/img/聚合函数05.png b/javaEE/day06/img/聚合函数05.png new file mode 100644 index 0000000..c2d7061 Binary files /dev/null and b/javaEE/day06/img/聚合函数05.png differ diff --git a/javaEE/day06/img/聚合函数06.png b/javaEE/day06/img/聚合函数06.png new file mode 100644 index 0000000..ecdc143 Binary files /dev/null and b/javaEE/day06/img/聚合函数06.png differ diff --git a/javaEE/day06/img/聚合函数07.png b/javaEE/day06/img/聚合函数07.png new file mode 100644 index 0000000..409933c Binary files /dev/null and b/javaEE/day06/img/聚合函数07.png differ diff --git a/javaEE/day06/img/范式01.png b/javaEE/day06/img/范式01.png new file mode 100644 index 0000000..9e34fc3 Binary files /dev/null and b/javaEE/day06/img/范式01.png differ diff --git a/javaEE/day06/img/范式02.png b/javaEE/day06/img/范式02.png new file mode 100644 index 0000000..5864068 Binary files /dev/null and b/javaEE/day06/img/范式02.png differ diff --git a/javaEE/day06/img/范式03.png b/javaEE/day06/img/范式03.png new file mode 100644 index 0000000..95458fb Binary files /dev/null and b/javaEE/day06/img/范式03.png differ diff --git a/javaEE/day06/img/范式04.png b/javaEE/day06/img/范式04.png new file mode 100644 index 0000000..8908453 Binary files /dev/null and b/javaEE/day06/img/范式04.png differ diff --git a/javaEE/day06/img/蠕虫复制.png b/javaEE/day06/img/蠕虫复制.png new file mode 100644 index 0000000..3643fef Binary files /dev/null and b/javaEE/day06/img/蠕虫复制.png differ diff --git a/javaEE/day06/img/表连接查询01.png b/javaEE/day06/img/表连接查询01.png new file mode 100644 index 0000000..a880147 Binary files /dev/null and b/javaEE/day06/img/表连接查询01.png differ diff --git a/javaEE/day06/img/表连接查询02.png b/javaEE/day06/img/表连接查询02.png new file mode 100644 index 0000000..9144b9f Binary files /dev/null and b/javaEE/day06/img/表连接查询02.png differ diff --git a/javaEE/day06/img/表连接查询03.png b/javaEE/day06/img/表连接查询03.png new file mode 100644 index 0000000..cef586d Binary files /dev/null and b/javaEE/day06/img/表连接查询03.png differ diff --git a/javaEE/day06/img/表连接查询04.png b/javaEE/day06/img/表连接查询04.png new file mode 100644 index 0000000..22b5d81 Binary files /dev/null and b/javaEE/day06/img/表连接查询04.png differ diff --git a/javaEE/day06/img/表连接查询05.png b/javaEE/day06/img/表连接查询05.png new file mode 100644 index 0000000..c792627 Binary files /dev/null and b/javaEE/day06/img/表连接查询05.png differ diff --git a/javaEE/day06/img/表连接查询06.png b/javaEE/day06/img/表连接查询06.png new file mode 100644 index 0000000..b9d774e Binary files /dev/null and b/javaEE/day06/img/表连接查询06.png differ diff --git a/javaEE/day06/img/表连接查询07.png b/javaEE/day06/img/表连接查询07.png new file mode 100644 index 0000000..4960a54 Binary files /dev/null and b/javaEE/day06/img/表连接查询07.png differ diff --git a/javaEE/day06/img/表连接查询08.png b/javaEE/day06/img/表连接查询08.png new file mode 100644 index 0000000..535932b Binary files /dev/null and b/javaEE/day06/img/表连接查询08.png differ diff --git a/javaEE/day06/img/表连接查询09.png b/javaEE/day06/img/表连接查询09.png new file mode 100644 index 0000000..dbbec6f Binary files /dev/null and b/javaEE/day06/img/表连接查询09.png differ diff --git a/javaEE/day06/img/表连接查询10.png b/javaEE/day06/img/表连接查询10.png new file mode 100644 index 0000000..65819fd Binary files /dev/null and b/javaEE/day06/img/表连接查询10.png differ diff --git a/javaEE/day06/img/表连接查询11.png b/javaEE/day06/img/表连接查询11.png new file mode 100644 index 0000000..b8636b2 Binary files /dev/null and b/javaEE/day06/img/表连接查询11.png differ diff --git a/javaEE/day06/img/表连接查询12.png b/javaEE/day06/img/表连接查询12.png new file mode 100644 index 0000000..34535a7 Binary files /dev/null and b/javaEE/day06/img/表连接查询12.png differ diff --git a/javaEE/day06/img/表连接查询13.png b/javaEE/day06/img/表连接查询13.png new file mode 100644 index 0000000..4096d5f Binary files /dev/null and b/javaEE/day06/img/表连接查询13.png differ diff --git a/javaEE/day06/img/表连接查询14.png b/javaEE/day06/img/表连接查询14.png new file mode 100644 index 0000000..d775d2d Binary files /dev/null and b/javaEE/day06/img/表连接查询14.png differ diff --git a/javaEE/day06/img/表连接查询15.png b/javaEE/day06/img/表连接查询15.png new file mode 100644 index 0000000..7d3704b Binary files /dev/null and b/javaEE/day06/img/表连接查询15.png differ diff --git a/javaEE/day06/img/表连接查询16.png b/javaEE/day06/img/表连接查询16.png new file mode 100644 index 0000000..ec23ac0 Binary files /dev/null and b/javaEE/day06/img/表连接查询16.png differ diff --git a/javaEE/day06/img/表连接查询17.png b/javaEE/day06/img/表连接查询17.png new file mode 100644 index 0000000..baf5e3d Binary files /dev/null and b/javaEE/day06/img/表连接查询17.png differ diff --git a/javaEE/day06/img/默认值.png b/javaEE/day06/img/默认值.png new file mode 100644 index 0000000..bd7791b Binary files /dev/null and b/javaEE/day06/img/默认值.png differ diff --git a/javaEE/day07/MySQL约束-笔记.md b/javaEE/day07/MySQL约束-笔记.md new file mode 100644 index 0000000..e081304 --- /dev/null +++ b/javaEE/day07/MySQL约束-笔记.md @@ -0,0 +1,1340 @@ +# MySQL-DQL&约束 + +## 学习目标 + +1. 能够使用SQL语句进行排序 +2. 能够使用聚合函数 +3. 能够使用SQL语句进行分组查询 +4. 能够完成数据的备份和恢复 +5. 能够使用SQL语句添加主键、外键、唯一、非空约束 +6. 能够说出多表之间的关系及其建表原则 + + +## 第一章 DQL语句 +### DQL查询语句-条件查询 + +#### 目标 + +能够掌握条件查询语法格式 + +#### 讲解 + +​ 前面我们的查询都是将所有数据都查询出来,但是有时候我们只想获取到`满足条件`的数据 +语法格式: + +```sql +SELECT 字段名... FROM 表名 WHERE 条件; +``` + +流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回 + +##### 准备数据 + +```sql +CREATE TABLE student3 ( + id int, + name varchar(20), + age int, + sex varchar(5), + address varchar(100), + math int, + english int +); + +INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (1,'马云',55,'男','杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港',99,99),(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65); +``` +##### 比较运算符 +`>`大于 +`<`小于 +`<=`小于等于 +`>=`大于等于 +`=`等于 +`<>`、`!=`不等于 + +具体操作: +* 查询math分数大于80分的学生 +```sql +SELECT * FROM student3 WHERE math>80; +``` +![](img/where查询01.png) + +* 查询english分数小于或等于80分的学生 +```sql +SELECT * FROM student3 WHERE english<=80; +``` +![](img/where查询02.png) + +* 查询age等于20岁的学生 +```sql +SELECT * FROM student3 WHERE age=20; +``` +![](img/where查询03.png) + +* 查询age不等于20岁的学生 +```sql +SELECT * FROM student3 WHERE age!=20; +SELECT * FROM student3 WHERE age<>20; +``` +![](img/where查询04.png) + +##### 逻辑运算符 +`and(&&)` 多个条件同时满足 +`or(||)` 多个条件其中一个满足 +`not(!)` 不满足 + +具体操作: +* 查询age大于35且性别为男的学生(两个条件同时满足) +```sql +SELECT * FROM student3 WHERE age>35 AND sex='男'; +``` +![](img/where查询05.png) + +* 查询age大于35或性别为男的学生(两个条件其中一个满足) +```sql +SELECT * FROM student333 WHERE age>35 OR sex='男'; +``` +![](img/where查询06.png) + +* 查询id是1或3或5的学生 +```sql +SELECT * FROM student3 WHERE id=1 OR id=3 OR id=5; +``` +![](img/where查询08.png) + +**in关键字** +语法格式: + +```sql +SELECT * FROM 表名 WHERE 字段 in (值1, 值2, 值3); +``` + +`in`里面的每个数据都会作为一次条件,只要满足条件的就会显示 + +具体操作: +* 查询id是1或3或5的学生 +```sql +SELECT * FROM student3 WHERE id IN (1,3,5); +``` +![](img/where查询08.png) + + +* 查询id不是1或3或5的学生 +```sql +SELECT * FROM student3 WHERE id NOT IN (1,3,5); +``` +![](img/where查询07.png) + +##### 范围 +```sql +BETWEEN 值1 AND 值2 -- 表示从值1到值2范围,包头又包尾 +``` + +比如:`age BETWEEN 80 AND 100` +相当于: `age>=80 && age<=100` + +具体操作: +* 查询english成绩大于等于75,且小于等于90的学生 +```sql +SELECT * FROM student3 WHERE english>=75 AND english<=90; +SELECT * FROM student3 WHERE english BETWEEN 75 AND 90; +``` +![](img/where查询09.png) + +### 模糊查询like + +#### 目标 + +能够掌握模糊查询语法格式 + +![](img/where查询11.png) + +#### 讲解 + +`LIKE`表示模糊查询 + +```sql +SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串'; +``` + +满足`通配符字符串`规则的数据就会显示出来 +所谓的`通配符字符串`就是`含有通配符的字符串` +MySQL通配符有两个: +`%`: 表示零个一个多个字符(任意多个字符) +`_`: 表示一个字符 + +具体操作: +* 查询姓马的学生 +```sql +SELECT * FROM student3 WHERE NAME LIKE '马%'; +``` +![](img/where查询10.png) + +* 查询姓名中包含'德'字的学生 +```sql +SELECT * FROM student3 WHERE NAME LIKE '%德%'; +``` +![](img/where查询11.png) + +* 查询姓马,且姓名有三个字的学生 +```sql +SELECT * FROM student3 WHERE NAME LIKE '马__'; +``` +![](img/where查询12.png) +#### 小结 + +模糊查询格式: SELECT 字段 FROM 表名 WHERE 字段 LIKE '通配符字符串'; + +`%`:表示零个一个多个字符(任意多个字符) +`_`:表示一个字符 + +### DQL查询语句-排序 + +#### 目标 + +1. 能够掌握对查询的数据进行排序 + +![](img/orderby01.png) + +#### 讲解 + +通过`ORDER BY`子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序) + +```sql +SELECT 字段 FROM 表名 ORDER BY 排序的字段 [ASC|DESC]; +``` + +**ASC**: 升序排序(默认) +**DESC**: 降序排序 + +1.2.1 单列排序 + +单列排序就是使用一个字段排序 + +具体操作: +* 查询所有数据,使用年龄降序排序 +```sql +SELECT * FROM student3 ORDER BY age DESC; +``` +![](img/orderby01.png) + +1.2.2 组合排序 + +组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。 +上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序 + +```sql +SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC]; +``` + +具体操作: +* 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序 +```sql +SELECT * FROM student3 ORDER BY age DESC, math DESC; +``` +![](img/orderby02.png) + +#### 小结 + +1. 排序的关键字:ORDER BY 字段名 +2. 升序:ASC +3. 降序:DESC + +### DQL查询语句-聚合函数 + +#### 目标 + +能够掌握五个聚合函数的使用 + +#### 讲解 + +之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值。 + +五个聚合函数: +`count`: 统计指定列记录数,记录为NULL的不统计 +`sum`: 计算指定列的数值和,如果不是数值类型,那么计算结果为0 +`max`: 计算指定列的最大值 +`min`: 计算指定列的最小值 +`avg`: 计算指定列的平均值 + +聚合函数的使用:写在 SQL语句`SELECT`后 `字段名`的地方 + +```sql +SELECT 字段名... FROM 表名; +SELECT 聚合函数(字段) FROM 表名; +``` + +具体操作: +* 查询学生总数 +```sql +SELECT COUNT(english) FROM student3; +``` +![](img/聚合函数01.png) +我们发现对于NULL的记录不会统计 +IFNULL(expr1, expr2)的用法:假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为expr2 + +统计数量常用: + +```sql +SELECT COUNT(*) FROM student3; +``` +![](img/聚合函数02.png) + +* 查询年龄大于40的总数 +```sql +SELECT COUNT(*) FROM student3 WHERE age>40; +``` +![](img/聚合函数03.png) + +* 查询数学成绩总分 +```sql +SELECT SUM(math) FROM student3; +``` +![](img/聚合函数04.png) + +* 查询数学成绩最高分 +```sql +SELECT MAX(math) FROM student3; +``` +![](img/聚合函数06.png) + +* 查询数学成绩最低分 +```sql +SELECT MIN(math) FROM student3; +``` +![](img/聚合函数07.png) + +* 查询数学成绩平均分 +```sql +SELECT AVG(math) FROM student3; +``` +![](img/聚合函数05.png) + +#### 小结 +| **sum(列名)** | 求和 | +| --------------- | ---- | +| **count(列名)** | 统计数量 | +| **max(列名)** | 最大值 | +| **min(列名)** | 最小值 | +| **avg(列名)** | 平均值 | + +### DQL查询语句-分组 + +#### 目标 + +能够对查询后的结果进行分组 + +![](img/分组10.png) + +#### 讲解 + +分组查询是指使用 `GROUP BY`语句对查询信息进行分组,`相同数据作为一组` + +```sql +SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段名; +``` + +GROUP BY怎么分组的? +**将分组字段结果中相同内容作为一组** + +```sql +SELECT * FROM student3 GROUP BY sex; +``` + +这句话会将sex相同的数据作为一组 +![](img/分组01.png) + +`GROUP BY`将分组字段的相同值作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。 + +分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。 + +``` +SELECT SUM(math), sex FROM student3 GROUP BY sex; +``` + +效果如下: +![](img/分组02.png) + +实际上是将每组的math进行求和,返回每组统计的结果 +![](img/分组03.png) + +>注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的 +>* 查询的时候没有查询出分组字段 +> ![](img/分组04.png) +>* 查询的时候查询出分组字段 +> ![](img/分组05.png) + +具体步骤: +* 按性别分组 +```sql +SELECT sex FROM student3 GROUP BY sex; +``` +![](img/分组06.png) + +* 查询男女各多少人 +```sql +1.查询所有数据,按性别分组。 +2.统计每组人数 +SELECT sex, COUNT(*) FROM student3 GROUP BY sex; +``` +![](img/分组06.png) + +* 查询年龄大于25岁的人,按性别分组,统计每组的人数 +```sql +1.先过滤掉年龄小于25岁的人。 +2.再分组。 +3.最后统计每组的人数 +SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex; +``` +![](img/分组08.png) + +* 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据 + 有很多同学可能会将SQL语句写出这样: + + ```sql + SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2; + ``` +>注意: 并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用`having`子句 +```sql +SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2; +只有分组后人数大于2的`男`这组数据显示出来 +``` +![](img/分组09.png) + +>having与where的区别 +>* having是在分组后对数据进行过滤. +>* where是在分组前对数据进行过滤 +>* having后面可以使用聚合函数 +>* where后面不可以使用聚合函数 + + + +#### 小结 + +1. 分组的语法格式?SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段 HAVING 条件; +2. 分组的原理?先将相同数据作为一组,返回每组的第一条数据,单独分组没有意义,分组后跟聚合函数操作 +3. where和having的区别? + having是在分组后对数据进行过滤. + where是在分组前对数据进行过滤 + having后面可以使用聚合函数 + where后面不可以使用聚合函数 + + + +### DQL查询语句-limit语句 + +#### 目标 + +能够掌握limit语句的使用 + +![](img/limit02.png) + +#### 讲解 + +准备数据: + +```sql +INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES +(9,'唐僧',25,'男','长安',87,78), +(10,'孙悟空',18,'男','花果山',100,66), +(11,'猪八戒',22,'男','高老庄',58,78), +(12,'沙僧',50,'男','流沙河',77,88), +(13,'白骨精',22,'女','白虎岭',66,66), +(14,'蜘蛛精',23,'女','盘丝洞',88,88); +``` +`LIMIT`是`限制`的意思,所以`LIMIT`的作用就是限制查询记录的条数。 + +**LIMIT语句格式**: + +```sql +SELECT 字段 FROM 表名 WHERE 条件 LIMIT offset, length; +``` + +`offset`是指偏移量,可以认为是跳过的记录数量,不写则默认为0。 +`length`是指需要显示的总记录数 + +具体步骤: +* 查询学生表中数据,跳过前面2条,显示6条 +```sql +我们可以认为跳过前面2条,取6条数据 +SELECT * FROM student3 LIMIT 2,6; +``` +![](img/limit02.png) + +**LIMIT的使用场景**:分页 + +比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。假设我们一每页显示5条记录的方式来分页。 + +![](img/limit04.png) + +假设我们一每页显示5条记录的方式来分页,SQL语句如下: + +```sql +-- 每页显示5条 +-- 第一页: LIMIT 0,5; 跳过0条,显示5条 +-- 第二页: LIMIT 5,5; 跳过5条,显示5条 +-- 第三页: LIMIT 10,5; 跳过10条,显示5条 +SELECT * FROM student3 LIMIT 0,5; +SELECT * FROM student3 LIMIT 5,5; +SELECT * FROM student3 LIMIT 10,5; +``` +![](img/limit03.png) +>**注意**: +> +>* 如果第一个参数是0可以简写: +> `SELECT * FROM student3 LIMIT 0,5;` +> `SELECT * FROM student3 LIMIT 5;` +>* LIMIT 10,5; -- 不够5条,有多少显示多少 + +#### 小结 + +1. LIMIT语句的使用格式? + + ```sql + SELECT 字段 FROM 表名 LIMIT 跳过的条数, 显示条数; + ``` + +2. ```sql + SELECT 字段名 FROM 表名 WHERE 条件 GROUP BY 分组列名 HAVING 条件 ORDER BY 排序列名 LIMIT 跳过行数, 返回行数; + ``` + +### 数据库备份 + +#### 目标 + +1. 能够使用命令行的方式备份和还原表中的数据 +2. 能够使用图形客户端来备份和还原数据 + +#### 讲解 + +备份的应用场景 + +​ 在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。 + +![1551281803999](img/1551281803999.png) + +##### 命令行方式备份与还原 + +**备份格式**: + +> 注意:这个操作不用登录 + +```sql +mysqldump -u用户名 -p密码 数据库 > 文件的路径 +``` + +**还原格式**: + +>注意:还原的时候需要先登录MySQL,并选中对应的数据库 + +```sql +SOURCE 导入文件的路径 +``` + +**具体操作**: + +* 备份day22数据库中的数据 +```sql +mysqldump -uroot -proot day22 > C:\work\code\bak.sql +``` +![](img/数据库导出01.png) + +**数据库中的所有表和数据都会导出成SQL语句** +![](img/数据库导出02.png) + +* 还原day22数据库中的数据 + * 删除day22数据库中的所有表 + ![](img/数据库导出08.png) + * 登录MySQL + ```sql + mysql -uroot -proot + ``` + * 选中数据库 + ```sql + use day22; + select database(); + ``` + ![](img/数据库导出03.png) + + * 使用SOURCE命令还原数据 + ```sql + source C:\work\课改\MYSQL课改资料\Day02-MYSQL多表查询\code\bak.sql + ``` + ![](img/数据库导出04.png) + + +##### 图形化界面备份与还原 +* 备份day22数据库中的数据 + ​ 选中数据库,右键 ”备份/导出”,指定导出路径,保存成.sql文件即可。 + ​ ![](img/数据库导出05.png) + ​ ![](img/数据库导出06.png) + ​ +* **包含创建数据库的语句** + ​ ![](img/数据库导出07.png) +* 还原day22数据库中的数据 + * 删除day22数据库 + * 数据库列表区域右键“执行SQL脚本”, 指定要执行的SQL文件,执行即可 + ![](img/数据库导出09.png) + ![](img/数据库导出10.png) + +#### 小结 + +1. 使用命令行的方式备份和还原表中的数据 + + ![1551342236636](img/1551342236636.png) + +2. 使用图形客户端来备份和还原数据 + +## 第二章 MySQL约束 + +### 数据库约束的概述 + +#### 目标 + +能够说出数据库约束的作用 + +#### 讲解 + +##### 数据库约束的作用 + +​ 对表中的数据进行进一步的限制,保证数据的**正确性**、**有效性**和**完整性**。 + +##### 约束种类 + +* `PRIMARY KEY`: 主键约束 +* `UNIQUE`: 唯一约束 +* `NOT NULL`: 非空约束 +* `DEFAULT`: 默认值 +* `FOREIGN KEY`: 外键约束 + +#### 小结 + +1. 数据库约束的作用? + 对表中的数据进行进一步的限制,保证数据的**正确性**、**有效性**和**完整性**。 + +### 主键约束 + +#### 目标 + +1. 能够说出主键约束的作用 +2. 能够添加和删除主键 + +#### 讲解 + +##### 主键的作用 +**用来唯一标识一条记录**。 + +##### 为什么需要主键约束 + +有些记录的 name,age,score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据。 +![](img/主键01.png) +![](img/主键02.png) + +每张表都应该有一个主键,并且每张表只能有一个主键。 + +##### 哪个字段作为表的主键 + +​ 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。 + +##### 创建主键 +主键:`PRIMARY KEY` +**主键的特点**: + +* 主键必须包含唯一的值 +* 主键列不能包含NULL值 + +**创建主键方式**: + +1. **在创建表的时候给字段添加主键** + + ``` + 字段名 字段类型 PRIMARY KEY + ``` + +2. **在已有表中添加主键** + + ```sql + ALTER TABLE 表名 ADD PRIMARY KEY(字段名); + ``` + +具体操作: +* 创建表学生表st5, 包含字段(id, name, age)将id做为主键 +```sql +CREATE TABLE st5 ( + id INT PRIMARY KEY, -- id是主键 + NAME VARCHAR(20), + age INT +); +``` +![](img/主键03.png) + +* 添加数据 +```sql +INSERT INTO st5 (id, NAME) VALUES (1, '唐伯虎'); +INSERT INTO st5 (id, NAME) VALUES (2, '周文宾'); +INSERT INTO st5 (id, NAME) VALUES (3, '祝枝山'); +INSERT INTO st5 (id, NAME) VALUES (4, '文征明'); +``` + +* 插入重复的主键值 +```sql +-- 主键是唯一的不能重复:Duplicate entry '1' for key 'PRIMARY' +INSERT INTO st5 (id, NAME) VALUES (1, '文征明2'); +``` + +* 插入NULL的主键值 +```sql +-- 主键是不能为空的:Column 'id' cannot be null +INSERT INTO st5 (id, NAME) VALUES (NULL, '文征明3'); +``` + +##### 删除主键 +```sql +ALTER TABLE 表名 DROP PRIMARY KEY; +``` + +具体操作: +* 删除st5表的主键 +```sql +ALTER TABLE st5 DROP PRIMARY KEY; +``` +![](img/主键04.png) + +#### 小结 + +1. 说出主键约束的作用?唯一区分一条记录 + +2. 主键的特点?唯一,不能为NULL + +3. 添加和删除主键? + 字段名 字段类型 PRIMARY KEY + + ALTER TABLE 表名 ADD PRIMARY KEY(字段名); + + + 删除主键 + + ALTER TABLE 表名 DROP PRIMARY KEY; + +### 主键自增 + +#### 目标 + +能够设置主键为自动增长 + +#### 讲解 + +​ 主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值 + +```sql +字段名 字段类型 PRIMARY KEY AUTO_INCREMENT +``` + +`AUTO_INCREMENT` 表示自动增长(**字段类型必须是整数类型**) + +具体操作: +* 创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长 +```sql +CREATE TABLE st6 ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(20), + age INT +); +``` + +* 插入数据 +```sql +-- 主键默认从1开始自动增长 +INSERT INTO st6 (NAME, age) VALUES ('唐僧', 22); +INSERT INTO st6 (NAME, age) VALUES ('孙悟空', 26); +INSERT INTO st6 (NAME, age) VALUES ('猪八戒', 25); +INSERT INTO st6 (NAME, age) VALUES ('沙僧', 20); +``` +![](img/主键05.png) + +扩展 +默认地AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法 + +```sql +ALTER TABLE 表名 AUTO_INCREMENT=起始值; +``` + +DELETE和TRUNCATE的区别 +* DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值。 + ![](img/主键06.png) + +* TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1 + ![](img/主键07.png) + +#### 小结 + +1. 设置主键为自动增长格式? + 字段名 数据类型 PRIMARY KEY AUTO_INCREMENT + +### 唯一约束 + +#### 目标 + +1. 能够说出唯一约束的作用 +2. 能够添加唯一约束 + +#### 讲解 + +##### 唯一约束的作用 + +在这张表中这个字段的值不能重复 + +##### 唯一约束的基本格式 +```sql +字段名 字段类型 UNIQUE +``` + +具体步骤: +* 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生 +```sql +CREATE TABLE st7 ( + id INT, + NAME VARCHAR(20) UNIQUE +); +``` + +* 添加一些学生 +```sql +INSERT INTO st7 VALUES (1, '貂蝉'); +INSERT INTO st7 VALUES (2, '西施'); +INSERT INTO st7 VALUES (3, '王昭君'); +INSERT INTO st7 VALUES (4, '杨玉环'); + +-- 插入相同的名字出现name重复: Duplicate entry '貂蝉' for key 'name' +INSERT INTO st7 VALUES (5, '貂蝉'); + +-- 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题 +INSERT INTO st3 VALUES (5, NULL); +INSERT INTO st3 VALUES (6, NULL); +``` + +#### 小结 + +1. 说出唯一约束的作用?让这个字段的值不能重复 +2. 添加唯一约束格式?字段名 字段类型 UNIQUE + +### 非空约束 + +#### 目标 + +1. 能够说出非空约束的作用 +2. 能够添加非空约束 + +#### 讲解 + +##### 非空约束的作用 + +这个字段必须设置值,不能是NULL + +##### 非空约束的基本语法格式 +```sql +字段名 字段类型 NOT NULL +``` + +具体操作: +* 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL +```sql +CREATE TABLE st8 ( + id INT, + NAME VARCHAR(20) NOT NULL, + gender CHAR(2) +); +``` + +* 添加一些完整的记录 +```sql +INSERT INTO st8 VALUES (1, '郭富城', '男'); +INSERT INTO st8 VALUES (2, '黎明', '男'); +INSERT INTO st8 VALUES (3, '张学友', '男'); +INSERT INTO st8 VALUES (4, '刘德华', '男'); + +-- 姓名不赋值出现姓名不能为null: Column 'name' cannot be null +INSERT INTO st8 VALUES (5, NULL, '男'); +``` + +#### 小结 + +非空约束的格式: + +字段名 数据类型 NOT NULL + +### 默认值 + +#### 目标 + +1. 能够说出默认值的作用 +2. 能够给字段添加默认值 + +#### 讲解 + +##### 默认值的作用 + +往表中添加数据时,如果不指定这个字段的数据,就使用默认值 + +##### 默认值格式 + +```sql +字段名 字段类型 DEFAULT 默认值 +``` + +具体步骤: +* 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州 +```sql +CREATE TABLE st9 ( + id INT, + NAME VARCHAR(20), + address VARCHAR(50) DEFAULT '广州' +); +``` + +* 添加一条记录,使用默认地址 +```sql +INSERT INTO st9 (id, NAME) VALUES (1, '刘德华'); +``` +![](img/默认值.png) + +* 添加一条记录,不使用默认地址 +```sql +INSERT INTO st9 VALUES (2, '张学友', '香港'); +``` + +**面试题:** + +如果一个字段设置了非空与唯一约束,该字段与主键的区别? + +1.一张表只有一个主键 + +2.一张表可以多个字段添加非空与唯一约束 + +3.主键可以自动增长,自己添加的非空与唯一约束字段无法自动增长 + +#### 小结 + +1. 说出默认值的作用?不添加这个字段,就会使用默认值 +2. 给字段添加默认值格式? 字段名 字段类型 DEFAULT 默认值 + +### 外键约束 + +#### 目标 + +1. 能够说出外键约束的作用 +2. 能够创建外键约束 + +#### 讲解 + +##### 单表的缺点 +创建一个员工表包含如下列(id, name, age, dep_name, dep_location),id主键并自动增长,添加5条数据 +```sql +CREATE TABLE emp ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(30), + age INT, + dep_name VARCHAR(30), + dep_location VARCHAR(30) +); + +-- 添加数据 +INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州'); +INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州'); +INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州'); + +INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳'); +INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳'); +INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳'); +``` +缺点:表中出现了很多重复的数据(数据冗余),如果要修改研发部的地址需要修改3个地方。 +![](img/外键01.png) + +解决方案:将一张表分成2张表(员工表和部门表) +![](img/外键02.png) + +```sql +-- 创建部门表 +CREATE TABLE department ( + id INT PRIMARY KEY AUTO_INCREMENT, + dep_name VARCHAR(20), + dep_location VARCHAR(20) +); + +-- 创建员工表 +CREATE TABLE employee ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(20), + age INT, + dep_id INT +); + +-- 添加2个部门 +INSERT INTO department (dep_name, dep_location) VALUES ('研发部', '广州'), ('销售部', '深圳'); + +-- 添加员工,dep_id表示员工所在的部门 +INSERT INTO employee (NAME, age, dep_id) VALUES +('张三', 20, 1), +('李四', 21, 1), +('王五', 20, 1), +('老王', 20, 2), +('大王', 22, 2), +('小王', 18, 2); +``` + +**问题**: +当我们在employee的dep_id里面输入不存在的部门,数据依然可以添加.但是并没有对应的部门,不能出现这种情况。employee的dep_id中的内容只能是department表中存在的id +![](img/外键03.png) + +**需要达到目的**:需要约束dep_id只能是department表中已经存在id +**解决方式**:使用外键约束 + +##### 什么是外键约束 +一张中的某个字段引用另一张表的主键 +主表: 约束别人的表,把数据给别人使用功能 +副表/从表: 被别人约束的表,使用别人的数据 +![](img/外键04.png) + +##### 创建外键 +1. **新建表时增加外键**: + + ```sql + CONSTRAINT [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) + ``` + + **关键字解释**: + CONSTRAINT: 添加约束 + FOREIGN KEY(外键字段名): 将某个字段作为外键 + REFERENCES 主表名(主键字段名) : 外键引用主表的主键 + +2. **已有表增加外键**: + + ```sql + ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名); + ``` + +具体操作: +* 副表/从表: 被别人约束,表结构添加外键约束 +* 删除副表/从表 employee +* 创建从表 employee 并添加外键约束 +```sql +CREATE TABLE employee ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(20), + age INT, + dep_id INT, + -- 添加一个外键 + -- 外键取名公司要求,一般fk结尾 + CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id) +); +``` + +* 正常添加数据 +```sql +INSERT INTO employee (NAME, age, dep_id) VALUES +('张三', 20, 1), +('李四', 21, 1), +('王五', 20, 1), +('老王', 20, 2), +('大王', 22, 2), +('小王', 18, 2); +``` + +* 部门错误的数据添加失败 +```sql +INSERT INTO employee (NAME, age, dep_id) VALUES ('二王', 20, 5); +``` + +##### 删除外键 +```sql +ALTER TABLE 表名 DROP FROEIGN KEY 外键名称; +``` + +具体操作: +* 删除employee表的emp_depid_ref_dep_id_fk外键 +```sql +ALTER TABLE employee DROP FOREIGN KEY emp_depid_ref_dep_id_fk; +``` + +* 在employee表情存在况下添加外键 +```sql +ALTER TABLE employee ADD CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id); +``` + +#### 小结 + +1. 创建外键约束格式? CONSTRAINT [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) +2. 删除外键格式?ALTER TABLE 表名 DROP FROEIGN KEY 外键名称; + +### 外键的级联 + +#### 目标 + +了解外键的级联操作 + +#### 讲解 + +要把部门表中的id值2,改成5,能不能直接修改呢? +```sql +UPDATE department SET id=5 WHERE id=2; +``` +不能直接修改:Cannot delete or update a parent row: a foreign key constraint fails 如果副表(员工表)中有引用的数据,不能直接修改主表(部门表)主键 + +要删除部门id等于1的部门, 能不能直接删除呢? +```sql +DELETE FROM department WHERE id = 1; +``` +不能直接删除:Cannot delete or update a parent row: a foreign key constraint fails 如果副表(员工表)中有引用的数据,不能直接删除主表(部门表)数据 + +##### 什么是级联操作 + +在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作 +`ON UPDATE CASCADE` -- 级联更新,主键发生更新时,外键也会更新 +`ON DELETE CASCADE` -- 级联删除,主键发生删除时,外键也会删除 + +具体操作: +* 删除employee表 +* 重新创建employee表,添加级联更新和级联删除 +```sql +CREATE TABLE employee ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(30), + age INT, + dep_id INT, + -- 添加外键约束,并且添加级联更新和级联删除 + CONSTRAINT employee_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE +); +``` + +* 再次添加数据到员工表和部门表 +```sql +INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1); +INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); +INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); +INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); +INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); +INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2); +``` +* 把部门表中id等于1的部门改成id等于10 +```sql +UPDATE department SET id=10 WHERE id=1; +``` +![](img/级联操作01.png) + +* 删除部门号是2的部门 +```sql +DELETE FROM department WHERE id=2; +``` +![](img/级联操作02.png) + +#### 小结 + +级联更新:ON UPDATE CASCADE 主键修改后,外键也会跟着修改 + +级联删除:ON DELETE CASCADE 主键删除后,外键对应的数据也会删除 + +## 第三章 表关系的概念 + +#### 目标 + +能够理解表之间的3种关系 + +#### 讲解 + +​ 现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系!分成三种: +1. 一对一 +2. 一对多 +3. 多对多 + +##### 一对多 +例如:班级和学生,部门和员工,客户和订单,分类和商品 +一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键 +![](img/一对多.png) + +##### 多对多 +例如:老师和学生,学生和课程,用户和角色 +多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。 +![](img/多对多.png) + +##### 一对一 +在实际的开发中应用不多.因为一对一可以创建成一张表。 +两种建表原则: + +* 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一`UNIQUE` +* 外键是主键:主表的主键和从表的主键,形成主外键关系 + ![](img/1对1.png) + ![](img/1对12.png) + +### 一对多关系练习 + +#### 目标 + +以下案例是我们JavaWeb课程最后的小项目.我们拿出其中一部分需求,根据需求来设计数据库表之间的关系 + +一个旅游线路分类中有多个旅游线路 +![](img/1对多练习01.png) + +![](img/1对多练习02.png) + +#### 讲解 + +具体操作: + +* 创建旅游线路分类表 +```sql +-- 创建旅游线路分类表:tab_category +-- cid旅游线路分类主键,自动增长 +-- cname旅游线路分类名称非空,唯一,字符串100 +CREATE TABLE tab_category ( + cid INT PRIMARY KEY AUTO_INCREMENT, + cname VARCHAR(100) NOT NULL UNIQUE +); +``` + +* 添加旅游线路分类数据 +```sql +INSERT INTO tab_category (cname) VALUES ('周边游'), ('出境游'), ('国内游'), ('港澳游'); +``` + +* 创建旅游线路表 +```sql +-- 创建旅游线路表:tab_route +-- rid旅游线路主键,自动增长 +-- rname旅游线路名称非空,唯一,字符串100 +-- price价格 +-- rdate 上架时间,日期类型 +-- cid 外键,所属分类 +create table tab_route( + rid int primary key auto_increment, + rname varchar(100) not null unique, + price double, + rdate date, + cid int, -- 外键 + foreign key (cid) references tab_category(cid) +); +``` + +* 添加旅游线路数据 +```sql +INSERT INTO tab_route VALUES +(NULL, '【厦门+鼓浪屿+南普陀寺+曾厝垵 高铁3天 惠贵团】尝味友鸭面线 住1晚鼓浪屿', 1499, '2018-01-27', 3), +(NULL, '【浪漫桂林 阳朔西街高铁3天纯玩 高级团】城徽象鼻山 兴坪漓江 西山公园', 699, '2018-01-27', 3), +(NULL, '【爆款¥1699秒杀】泰国 曼谷 芭堤雅 金沙岛 杜拉拉水上市场 双飞六天【含送签费 泰风情 广州往返 特价团】', 1699, '2018-01-27', 2), +(NULL, '【经典·狮航 ¥2399秒杀】巴厘岛双飞五天 抵玩【广州往返 特价团】', 2399, '2018-01-27', 2), +(NULL, '香港迪士尼乐园自由行2天【永东跨境巴士广东至迪士尼去程交通+迪士尼一日门票+香港如心海景酒店暨会议中心标准房1晚住宿】', 799, '2018-01-27', 4); +``` + +#### 小结 +一对多的关系,创建表的顺序:先建主表,再建从表。 + +### 多对多关系练习 + +#### 目标 + +一个用户收藏多个线路,一个线路被多个用户收藏 +![](img/多对多练习01.png) + +![](img/多对多练习02.png) + +#### 讲解 + +对于多对多的关系我们需要增加一张中间表来维护他们之间的关系 +![](img/多对多练习03.png) + +具体操作: +* 创建用户表 +```sql +-- 创建用户表tab_user +-- 用户id主键,int类型,自动增长 +-- 用户名username,字符串,长度30 +-- 密码PASSWORD,字符串,长度30 +-- 用户姓名NAME,字符串,长度100 +-- 性别sex,字符串,长度1 +CREATE TABLE tab_user ( + uid INT PRIMARY KEY AUTO_INCREMENT, -- 用户id + username VARCHAR(100) NOT NULL UNIQUE, -- 用户名 + PASSWORD VARCHAR(30) NOT NULL, -- 密码 + NAME VARCHAR(100), -- 真实姓名 + sex CHAR(1) -- 性别 +); +``` + +* 添加用户数据 +```sql +INSERT INTO tab_user VALUES +(NULL, 'cz110', 123456, '老王', '男'), +(NULL, 'cz119', 654321, '小王', '男'); +``` + +* 创建收藏表 +```sql +-- 创建收藏表:tab_favorite +-- 收藏主键fid,int类型,主键,自动增长 +-- 用户id int,不为null +-- 收藏时间date,不为null +-- 旅游线路id,int类型,不为null +CREATE TABLE tab_favorite ( + fid INT PRIMARY KEY AUTO_INCREMENT, -- 收藏主键 + uid INT NOT NULL, -- 用户id + DATE DATE NOT NULL, -- 收藏时间 + rid INT NOT NULL -- 旅游线路id +); +``` + +* 增加收藏表数据 +```sql +INSERT INTO tab_favorite VALUES +(NULL, 1, '2018-01-01', 1), -- 老王选择厦门 +(NULL, 1, '2018-01-01', 2), -- 老王选择桂林 +(NULL, 1, '2018-01-01', 3), -- 老王选择泰国 +(NULL, 2, '2018-01-01', 2), -- 小王选择桂林 +(NULL, 2, '2018-01-01', 3), -- 小王选择泰国 +(NULL, 2, '2018-01-01', 5); -- 小王选择迪士尼 +``` + +#### 小结 +多对多:创建一张中间表,中间表与其它两张表是多对一的关系 + + + +### 总结 + +1. 能够使用SQL语句进行排序 + SELECT 字段 FROM 表名 WHERE 条件 ORDER BY 字段 [ASC|DESC]; + ASC:升序 + DESC:降序 + +2. 能够使用聚合函数 + count: 统计数量 + sum:求和 + max:获取最大值 + min:获取最小值 + avg:获取平均值 + +3. 能够使用SQL语句进行分组查询 + SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段; + 分组是将相同数据作为一组,返回每组第一条数据(没有意义), 通常分组后使用聚合函数 + +4. 能够完成数据的备份和恢复 + 命令行的方式 + 备份:不要登录:mysqldump -uroot -proot 数据库 > 文件名 + 还原:要登录,选中数据库:source 文件名 + + + 图形界面的方式 + +5. 能够使用SQL语句添加主键、外键、唯一、非空约束 + 主键: 字段名 字段类型 PRIMARY KEY + 外键: CONSTRAINT 外键名 FOREIGN KEY(字段) REFERENCES 主表(主键) + 唯一: 字段名 字段类型 UNIQUE + 非空约束: 字段名 字段类型 NOT NULL + 默认约束: 字段名 字段类型 DEFAULT 默认值 + +6. 能够说出多表之间的关系及其建表原则 + 1对1(1:1) + 1对多(1:n) + 多对多(m:n) + + 1对多:多方这张表建立外键引用一方的主键(先建立一方主表,后建立多方从表) + + 多对多:建立中间表,中间表的字段引用某张表的主键(外键) + diff --git a/javaEE/day07/img/1551281803999.png b/javaEE/day07/img/1551281803999.png new file mode 100644 index 0000000..4fc65c2 Binary files /dev/null and b/javaEE/day07/img/1551281803999.png differ diff --git a/javaEE/day07/img/1551342236636.png b/javaEE/day07/img/1551342236636.png new file mode 100644 index 0000000..7958020 Binary files /dev/null and b/javaEE/day07/img/1551342236636.png differ diff --git a/javaEE/day07/img/1对1.png b/javaEE/day07/img/1对1.png new file mode 100644 index 0000000..9c18854 Binary files /dev/null and b/javaEE/day07/img/1对1.png differ diff --git a/javaEE/day07/img/1对12.png b/javaEE/day07/img/1对12.png new file mode 100644 index 0000000..63cb588 Binary files /dev/null and b/javaEE/day07/img/1对12.png differ diff --git a/javaEE/day07/img/1对多练习01.png b/javaEE/day07/img/1对多练习01.png new file mode 100644 index 0000000..97c5f93 Binary files /dev/null and b/javaEE/day07/img/1对多练习01.png differ diff --git a/javaEE/day07/img/1对多练习02.png b/javaEE/day07/img/1对多练习02.png new file mode 100644 index 0000000..c01701d Binary files /dev/null and b/javaEE/day07/img/1对多练习02.png differ diff --git a/javaEE/day07/img/1对多练习03.png b/javaEE/day07/img/1对多练习03.png new file mode 100644 index 0000000..4980761 Binary files /dev/null and b/javaEE/day07/img/1对多练习03.png differ diff --git a/javaEE/day07/img/DCL01.png b/javaEE/day07/img/DCL01.png new file mode 100644 index 0000000..5163cce Binary files /dev/null and b/javaEE/day07/img/DCL01.png differ diff --git a/javaEE/day07/img/DCL02.png b/javaEE/day07/img/DCL02.png new file mode 100644 index 0000000..2ed78f8 Binary files /dev/null and b/javaEE/day07/img/DCL02.png differ diff --git a/javaEE/day07/img/DCL03.png b/javaEE/day07/img/DCL03.png new file mode 100644 index 0000000..2df945c Binary files /dev/null and b/javaEE/day07/img/DCL03.png differ diff --git a/javaEE/day07/img/DCL04.png b/javaEE/day07/img/DCL04.png new file mode 100644 index 0000000..165868c Binary files /dev/null and b/javaEE/day07/img/DCL04.png differ diff --git a/javaEE/day07/img/DCL05.png b/javaEE/day07/img/DCL05.png new file mode 100644 index 0000000..ca5fa66 Binary files /dev/null and b/javaEE/day07/img/DCL05.png differ diff --git a/javaEE/day07/img/DCL06.png b/javaEE/day07/img/DCL06.png new file mode 100644 index 0000000..07c7c6d Binary files /dev/null and b/javaEE/day07/img/DCL06.png differ diff --git a/javaEE/day07/img/DCL07.png b/javaEE/day07/img/DCL07.png new file mode 100644 index 0000000..556aa51 Binary files /dev/null and b/javaEE/day07/img/DCL07.png differ diff --git a/javaEE/day07/img/DCL08.png b/javaEE/day07/img/DCL08.png new file mode 100644 index 0000000..669af04 Binary files /dev/null and b/javaEE/day07/img/DCL08.png differ diff --git a/javaEE/day07/img/DCL09.png b/javaEE/day07/img/DCL09.png new file mode 100644 index 0000000..d370ba5 Binary files /dev/null and b/javaEE/day07/img/DCL09.png differ diff --git a/javaEE/day07/img/ifnull01.png b/javaEE/day07/img/ifnull01.png new file mode 100644 index 0000000..9cfb64f Binary files /dev/null and b/javaEE/day07/img/ifnull01.png differ diff --git a/javaEE/day07/img/ifnull02.png b/javaEE/day07/img/ifnull02.png new file mode 100644 index 0000000..dccc0bf Binary files /dev/null and b/javaEE/day07/img/ifnull02.png differ diff --git a/javaEE/day07/img/limit01.png b/javaEE/day07/img/limit01.png new file mode 100644 index 0000000..310b84d Binary files /dev/null and b/javaEE/day07/img/limit01.png differ diff --git a/javaEE/day07/img/limit02.png b/javaEE/day07/img/limit02.png new file mode 100644 index 0000000..76339ac Binary files /dev/null and b/javaEE/day07/img/limit02.png differ diff --git a/javaEE/day07/img/limit03.png b/javaEE/day07/img/limit03.png new file mode 100644 index 0000000..716f6a1 Binary files /dev/null and b/javaEE/day07/img/limit03.png differ diff --git a/javaEE/day07/img/limit04.png b/javaEE/day07/img/limit04.png new file mode 100644 index 0000000..ec59960 Binary files /dev/null and b/javaEE/day07/img/limit04.png differ diff --git a/javaEE/day07/img/orderby01.png b/javaEE/day07/img/orderby01.png new file mode 100644 index 0000000..4009521 Binary files /dev/null and b/javaEE/day07/img/orderby01.png differ diff --git a/javaEE/day07/img/orderby02.png b/javaEE/day07/img/orderby02.png new file mode 100644 index 0000000..7cb94c8 Binary files /dev/null and b/javaEE/day07/img/orderby02.png differ diff --git a/javaEE/day07/img/where查询01.png b/javaEE/day07/img/where查询01.png new file mode 100644 index 0000000..0fd7703 Binary files /dev/null and b/javaEE/day07/img/where查询01.png differ diff --git a/javaEE/day07/img/where查询02.png b/javaEE/day07/img/where查询02.png new file mode 100644 index 0000000..a8cae11 Binary files /dev/null and b/javaEE/day07/img/where查询02.png differ diff --git a/javaEE/day07/img/where查询03.png b/javaEE/day07/img/where查询03.png new file mode 100644 index 0000000..30c6a91 Binary files /dev/null and b/javaEE/day07/img/where查询03.png differ diff --git a/javaEE/day07/img/where查询04.png b/javaEE/day07/img/where查询04.png new file mode 100644 index 0000000..f220601 Binary files /dev/null and b/javaEE/day07/img/where查询04.png differ diff --git a/javaEE/day07/img/where查询05.png b/javaEE/day07/img/where查询05.png new file mode 100644 index 0000000..b59154b Binary files /dev/null and b/javaEE/day07/img/where查询05.png differ diff --git a/javaEE/day07/img/where查询06.png b/javaEE/day07/img/where查询06.png new file mode 100644 index 0000000..f2cc38f Binary files /dev/null and b/javaEE/day07/img/where查询06.png differ diff --git a/javaEE/day07/img/where查询07.png b/javaEE/day07/img/where查询07.png new file mode 100644 index 0000000..913c584 Binary files /dev/null and b/javaEE/day07/img/where查询07.png differ diff --git a/javaEE/day07/img/where查询08.png b/javaEE/day07/img/where查询08.png new file mode 100644 index 0000000..2028ff6 Binary files /dev/null and b/javaEE/day07/img/where查询08.png differ diff --git a/javaEE/day07/img/where查询09.png b/javaEE/day07/img/where查询09.png new file mode 100644 index 0000000..bce9586 Binary files /dev/null and b/javaEE/day07/img/where查询09.png differ diff --git a/javaEE/day07/img/where查询10.png b/javaEE/day07/img/where查询10.png new file mode 100644 index 0000000..15fdd6e Binary files /dev/null and b/javaEE/day07/img/where查询10.png differ diff --git a/javaEE/day07/img/where查询11.png b/javaEE/day07/img/where查询11.png new file mode 100644 index 0000000..c02517f Binary files /dev/null and b/javaEE/day07/img/where查询11.png differ diff --git a/javaEE/day07/img/where查询12.png b/javaEE/day07/img/where查询12.png new file mode 100644 index 0000000..d7b1b60 Binary files /dev/null and b/javaEE/day07/img/where查询12.png differ diff --git a/javaEE/day07/img/一对多.png b/javaEE/day07/img/一对多.png new file mode 100644 index 0000000..0b6ee01 Binary files /dev/null and b/javaEE/day07/img/一对多.png differ diff --git a/javaEE/day07/img/主键01.png b/javaEE/day07/img/主键01.png new file mode 100644 index 0000000..ccb613e Binary files /dev/null and b/javaEE/day07/img/主键01.png differ diff --git a/javaEE/day07/img/主键02.png b/javaEE/day07/img/主键02.png new file mode 100644 index 0000000..0aa553f Binary files /dev/null and b/javaEE/day07/img/主键02.png differ diff --git a/javaEE/day07/img/主键03.png b/javaEE/day07/img/主键03.png new file mode 100644 index 0000000..12c1ff1 Binary files /dev/null and b/javaEE/day07/img/主键03.png differ diff --git a/javaEE/day07/img/主键04.png b/javaEE/day07/img/主键04.png new file mode 100644 index 0000000..a5f1a5f Binary files /dev/null and b/javaEE/day07/img/主键04.png differ diff --git a/javaEE/day07/img/主键05.png b/javaEE/day07/img/主键05.png new file mode 100644 index 0000000..ff6ee94 Binary files /dev/null and b/javaEE/day07/img/主键05.png differ diff --git a/javaEE/day07/img/主键06.png b/javaEE/day07/img/主键06.png new file mode 100644 index 0000000..9597934 Binary files /dev/null and b/javaEE/day07/img/主键06.png differ diff --git a/javaEE/day07/img/主键07.png b/javaEE/day07/img/主键07.png new file mode 100644 index 0000000..215ef20 Binary files /dev/null and b/javaEE/day07/img/主键07.png differ diff --git a/javaEE/day07/img/事务01.png b/javaEE/day07/img/事务01.png new file mode 100644 index 0000000..b98bfab Binary files /dev/null and b/javaEE/day07/img/事务01.png differ diff --git a/javaEE/day07/img/事务02.png b/javaEE/day07/img/事务02.png new file mode 100644 index 0000000..7e8d6cb Binary files /dev/null and b/javaEE/day07/img/事务02.png differ diff --git a/javaEE/day07/img/事务03.png b/javaEE/day07/img/事务03.png new file mode 100644 index 0000000..396eb7e Binary files /dev/null and b/javaEE/day07/img/事务03.png differ diff --git a/javaEE/day07/img/事务04.png b/javaEE/day07/img/事务04.png new file mode 100644 index 0000000..1e5ff59 Binary files /dev/null and b/javaEE/day07/img/事务04.png differ diff --git a/javaEE/day07/img/事务05.png b/javaEE/day07/img/事务05.png new file mode 100644 index 0000000..5dd29d1 Binary files /dev/null and b/javaEE/day07/img/事务05.png differ diff --git a/javaEE/day07/img/事务06.png b/javaEE/day07/img/事务06.png new file mode 100644 index 0000000..1c6b1c0 Binary files /dev/null and b/javaEE/day07/img/事务06.png differ diff --git a/javaEE/day07/img/事务07.png b/javaEE/day07/img/事务07.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day07/img/事务07.png differ diff --git a/javaEE/day07/img/事务08.png b/javaEE/day07/img/事务08.png new file mode 100644 index 0000000..944a040 Binary files /dev/null and b/javaEE/day07/img/事务08.png differ diff --git a/javaEE/day07/img/事务09.png b/javaEE/day07/img/事务09.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day07/img/事务09.png differ diff --git a/javaEE/day07/img/事务10.png b/javaEE/day07/img/事务10.png new file mode 100644 index 0000000..8b14e4b Binary files /dev/null and b/javaEE/day07/img/事务10.png differ diff --git a/javaEE/day07/img/事务11.png b/javaEE/day07/img/事务11.png new file mode 100644 index 0000000..64e8919 Binary files /dev/null and b/javaEE/day07/img/事务11.png differ diff --git a/javaEE/day07/img/事务12.png b/javaEE/day07/img/事务12.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day07/img/事务12.png differ diff --git a/javaEE/day07/img/事务13.png b/javaEE/day07/img/事务13.png new file mode 100644 index 0000000..c8ca875 Binary files /dev/null and b/javaEE/day07/img/事务13.png differ diff --git a/javaEE/day07/img/事务14.png b/javaEE/day07/img/事务14.png new file mode 100644 index 0000000..0de1c72 Binary files /dev/null and b/javaEE/day07/img/事务14.png differ diff --git a/javaEE/day07/img/事务15.png b/javaEE/day07/img/事务15.png new file mode 100644 index 0000000..16c4683 Binary files /dev/null and b/javaEE/day07/img/事务15.png differ diff --git a/javaEE/day07/img/事务16.png b/javaEE/day07/img/事务16.png new file mode 100644 index 0000000..396eb7e Binary files /dev/null and b/javaEE/day07/img/事务16.png differ diff --git a/javaEE/day07/img/事务17.png b/javaEE/day07/img/事务17.png new file mode 100644 index 0000000..1e5ff59 Binary files /dev/null and b/javaEE/day07/img/事务17.png differ diff --git a/javaEE/day07/img/事务18.png b/javaEE/day07/img/事务18.png new file mode 100644 index 0000000..03c7d40 Binary files /dev/null and b/javaEE/day07/img/事务18.png differ diff --git a/javaEE/day07/img/事务19.png b/javaEE/day07/img/事务19.png new file mode 100644 index 0000000..f610922 Binary files /dev/null and b/javaEE/day07/img/事务19.png differ diff --git a/javaEE/day07/img/事务20.png b/javaEE/day07/img/事务20.png new file mode 100644 index 0000000..455b5e7 Binary files /dev/null and b/javaEE/day07/img/事务20.png differ diff --git a/javaEE/day07/img/事务21.png b/javaEE/day07/img/事务21.png new file mode 100644 index 0000000..76de958 Binary files /dev/null and b/javaEE/day07/img/事务21.png differ diff --git a/javaEE/day07/img/事务22.png b/javaEE/day07/img/事务22.png new file mode 100644 index 0000000..166a40b Binary files /dev/null and b/javaEE/day07/img/事务22.png differ diff --git a/javaEE/day07/img/事务23.png b/javaEE/day07/img/事务23.png new file mode 100644 index 0000000..e2065d5 Binary files /dev/null and b/javaEE/day07/img/事务23.png differ diff --git a/javaEE/day07/img/事务24.png b/javaEE/day07/img/事务24.png new file mode 100644 index 0000000..6a20f27 Binary files /dev/null and b/javaEE/day07/img/事务24.png differ diff --git a/javaEE/day07/img/事务25.png b/javaEE/day07/img/事务25.png new file mode 100644 index 0000000..296f285 Binary files /dev/null and b/javaEE/day07/img/事务25.png differ diff --git a/javaEE/day07/img/事务26.png b/javaEE/day07/img/事务26.png new file mode 100644 index 0000000..e847aec Binary files /dev/null and b/javaEE/day07/img/事务26.png differ diff --git a/javaEE/day07/img/事务27.png b/javaEE/day07/img/事务27.png new file mode 100644 index 0000000..f1204df Binary files /dev/null and b/javaEE/day07/img/事务27.png differ diff --git a/javaEE/day07/img/事务28.png b/javaEE/day07/img/事务28.png new file mode 100644 index 0000000..a08694c Binary files /dev/null and b/javaEE/day07/img/事务28.png differ diff --git a/javaEE/day07/img/事务29.png b/javaEE/day07/img/事务29.png new file mode 100644 index 0000000..0ed2184 Binary files /dev/null and b/javaEE/day07/img/事务29.png differ diff --git a/javaEE/day07/img/事务30.png b/javaEE/day07/img/事务30.png new file mode 100644 index 0000000..95b8d75 Binary files /dev/null and b/javaEE/day07/img/事务30.png differ diff --git a/javaEE/day07/img/事务31.png b/javaEE/day07/img/事务31.png new file mode 100644 index 0000000..4472d04 Binary files /dev/null and b/javaEE/day07/img/事务31.png differ diff --git a/javaEE/day07/img/事务32.png b/javaEE/day07/img/事务32.png new file mode 100644 index 0000000..b50bed8 Binary files /dev/null and b/javaEE/day07/img/事务32.png differ diff --git a/javaEE/day07/img/事务33.png b/javaEE/day07/img/事务33.png new file mode 100644 index 0000000..14b4f03 Binary files /dev/null and b/javaEE/day07/img/事务33.png differ diff --git a/javaEE/day07/img/事务34.png b/javaEE/day07/img/事务34.png new file mode 100644 index 0000000..95c0471 Binary files /dev/null and b/javaEE/day07/img/事务34.png differ diff --git a/javaEE/day07/img/事务35.png b/javaEE/day07/img/事务35.png new file mode 100644 index 0000000..622d16b Binary files /dev/null and b/javaEE/day07/img/事务35.png differ diff --git a/javaEE/day07/img/事务36.png b/javaEE/day07/img/事务36.png new file mode 100644 index 0000000..e227228 Binary files /dev/null and b/javaEE/day07/img/事务36.png differ diff --git a/javaEE/day07/img/事务37.png b/javaEE/day07/img/事务37.png new file mode 100644 index 0000000..14bba1d Binary files /dev/null and b/javaEE/day07/img/事务37.png differ diff --git a/javaEE/day07/img/事务38.png b/javaEE/day07/img/事务38.png new file mode 100644 index 0000000..012610a Binary files /dev/null and b/javaEE/day07/img/事务38.png differ diff --git a/javaEE/day07/img/事务39.png b/javaEE/day07/img/事务39.png new file mode 100644 index 0000000..35f2d7f Binary files /dev/null and b/javaEE/day07/img/事务39.png differ diff --git a/javaEE/day07/img/事务40.png b/javaEE/day07/img/事务40.png new file mode 100644 index 0000000..95a8934 Binary files /dev/null and b/javaEE/day07/img/事务40.png differ diff --git a/javaEE/day07/img/事务41.png b/javaEE/day07/img/事务41.png new file mode 100644 index 0000000..6fa0a67 Binary files /dev/null and b/javaEE/day07/img/事务41.png differ diff --git a/javaEE/day07/img/事务42.png b/javaEE/day07/img/事务42.png new file mode 100644 index 0000000..9c8ecbf Binary files /dev/null and b/javaEE/day07/img/事务42.png differ diff --git a/javaEE/day07/img/事务43.png b/javaEE/day07/img/事务43.png new file mode 100644 index 0000000..4893409 Binary files /dev/null and b/javaEE/day07/img/事务43.png differ diff --git a/javaEE/day07/img/事务44.png b/javaEE/day07/img/事务44.png new file mode 100644 index 0000000..f9e33f3 Binary files /dev/null and b/javaEE/day07/img/事务44.png differ diff --git a/javaEE/day07/img/事务45.png b/javaEE/day07/img/事务45.png new file mode 100644 index 0000000..1ddda85 Binary files /dev/null and b/javaEE/day07/img/事务45.png differ diff --git a/javaEE/day07/img/事务46.png b/javaEE/day07/img/事务46.png new file mode 100644 index 0000000..3cf7bd3 Binary files /dev/null and b/javaEE/day07/img/事务46.png differ diff --git a/javaEE/day07/img/事务47.png b/javaEE/day07/img/事务47.png new file mode 100644 index 0000000..dafa871 Binary files /dev/null and b/javaEE/day07/img/事务47.png differ diff --git a/javaEE/day07/img/事务48.png b/javaEE/day07/img/事务48.png new file mode 100644 index 0000000..d96862d Binary files /dev/null and b/javaEE/day07/img/事务48.png differ diff --git a/javaEE/day07/img/事务49.png b/javaEE/day07/img/事务49.png new file mode 100644 index 0000000..5fa3b98 Binary files /dev/null and b/javaEE/day07/img/事务49.png differ diff --git a/javaEE/day07/img/事务50.png b/javaEE/day07/img/事务50.png new file mode 100644 index 0000000..4e92355 Binary files /dev/null and b/javaEE/day07/img/事务50.png differ diff --git a/javaEE/day07/img/事务51.png b/javaEE/day07/img/事务51.png new file mode 100644 index 0000000..462407d Binary files /dev/null and b/javaEE/day07/img/事务51.png differ diff --git a/javaEE/day07/img/事务52.png b/javaEE/day07/img/事务52.png new file mode 100644 index 0000000..8e08da1 Binary files /dev/null and b/javaEE/day07/img/事务52.png differ diff --git a/javaEE/day07/img/事务53.png b/javaEE/day07/img/事务53.png new file mode 100644 index 0000000..0740b6f Binary files /dev/null and b/javaEE/day07/img/事务53.png differ diff --git a/javaEE/day07/img/事务54.png b/javaEE/day07/img/事务54.png new file mode 100644 index 0000000..f68a652 Binary files /dev/null and b/javaEE/day07/img/事务54.png differ diff --git a/javaEE/day07/img/事务55.png b/javaEE/day07/img/事务55.png new file mode 100644 index 0000000..5a12dc1 Binary files /dev/null and b/javaEE/day07/img/事务55.png differ diff --git a/javaEE/day07/img/事务56.png b/javaEE/day07/img/事务56.png new file mode 100644 index 0000000..b53b40c Binary files /dev/null and b/javaEE/day07/img/事务56.png differ diff --git a/javaEE/day07/img/事务57.png b/javaEE/day07/img/事务57.png new file mode 100644 index 0000000..a51708b Binary files /dev/null and b/javaEE/day07/img/事务57.png differ diff --git a/javaEE/day07/img/事务58.png b/javaEE/day07/img/事务58.png new file mode 100644 index 0000000..2fbf971 Binary files /dev/null and b/javaEE/day07/img/事务58.png differ diff --git a/javaEE/day07/img/事务59.png b/javaEE/day07/img/事务59.png new file mode 100644 index 0000000..407aef7 Binary files /dev/null and b/javaEE/day07/img/事务59.png differ diff --git a/javaEE/day07/img/事务60.png b/javaEE/day07/img/事务60.png new file mode 100644 index 0000000..63f468a Binary files /dev/null and b/javaEE/day07/img/事务60.png differ diff --git a/javaEE/day07/img/分组01.png b/javaEE/day07/img/分组01.png new file mode 100644 index 0000000..fd55a36 Binary files /dev/null and b/javaEE/day07/img/分组01.png differ diff --git a/javaEE/day07/img/分组02.png b/javaEE/day07/img/分组02.png new file mode 100644 index 0000000..6a641f0 Binary files /dev/null and b/javaEE/day07/img/分组02.png differ diff --git a/javaEE/day07/img/分组03.png b/javaEE/day07/img/分组03.png new file mode 100644 index 0000000..97eeb4e Binary files /dev/null and b/javaEE/day07/img/分组03.png differ diff --git a/javaEE/day07/img/分组04.png b/javaEE/day07/img/分组04.png new file mode 100644 index 0000000..948542d Binary files /dev/null and b/javaEE/day07/img/分组04.png differ diff --git a/javaEE/day07/img/分组05.png b/javaEE/day07/img/分组05.png new file mode 100644 index 0000000..400d98d Binary files /dev/null and b/javaEE/day07/img/分组05.png differ diff --git a/javaEE/day07/img/分组06.png b/javaEE/day07/img/分组06.png new file mode 100644 index 0000000..978e04c Binary files /dev/null and b/javaEE/day07/img/分组06.png differ diff --git a/javaEE/day07/img/分组07.png b/javaEE/day07/img/分组07.png new file mode 100644 index 0000000..b11bba2 Binary files /dev/null and b/javaEE/day07/img/分组07.png differ diff --git a/javaEE/day07/img/分组08.png b/javaEE/day07/img/分组08.png new file mode 100644 index 0000000..fd3aaa7 Binary files /dev/null and b/javaEE/day07/img/分组08.png differ diff --git a/javaEE/day07/img/分组09.png b/javaEE/day07/img/分组09.png new file mode 100644 index 0000000..57c2b32 Binary files /dev/null and b/javaEE/day07/img/分组09.png differ diff --git a/javaEE/day07/img/分组10.png b/javaEE/day07/img/分组10.png new file mode 100644 index 0000000..ec915df Binary files /dev/null and b/javaEE/day07/img/分组10.png differ diff --git a/javaEE/day07/img/外键01.png b/javaEE/day07/img/外键01.png new file mode 100644 index 0000000..fbf414a Binary files /dev/null and b/javaEE/day07/img/外键01.png differ diff --git a/javaEE/day07/img/外键02.png b/javaEE/day07/img/外键02.png new file mode 100644 index 0000000..9426f4b Binary files /dev/null and b/javaEE/day07/img/外键02.png differ diff --git a/javaEE/day07/img/外键03.png b/javaEE/day07/img/外键03.png new file mode 100644 index 0000000..767bba8 Binary files /dev/null and b/javaEE/day07/img/外键03.png differ diff --git a/javaEE/day07/img/外键04.png b/javaEE/day07/img/外键04.png new file mode 100644 index 0000000..17d26c3 Binary files /dev/null and b/javaEE/day07/img/外键04.png differ diff --git a/javaEE/day07/img/多对多.png b/javaEE/day07/img/多对多.png new file mode 100644 index 0000000..123f5a5 Binary files /dev/null and b/javaEE/day07/img/多对多.png differ diff --git a/javaEE/day07/img/多对多练习01.png b/javaEE/day07/img/多对多练习01.png new file mode 100644 index 0000000..a3c45ac Binary files /dev/null and b/javaEE/day07/img/多对多练习01.png differ diff --git a/javaEE/day07/img/多对多练习02.png b/javaEE/day07/img/多对多练习02.png new file mode 100644 index 0000000..fe60244 Binary files /dev/null and b/javaEE/day07/img/多对多练习02.png differ diff --git a/javaEE/day07/img/多对多练习03.png b/javaEE/day07/img/多对多练习03.png new file mode 100644 index 0000000..e499fab Binary files /dev/null and b/javaEE/day07/img/多对多练习03.png differ diff --git a/javaEE/day07/img/多表查询01.png b/javaEE/day07/img/多表查询01.png new file mode 100644 index 0000000..18276ba Binary files /dev/null and b/javaEE/day07/img/多表查询01.png differ diff --git a/javaEE/day07/img/多表查询02.png b/javaEE/day07/img/多表查询02.png new file mode 100644 index 0000000..88f6049 Binary files /dev/null and b/javaEE/day07/img/多表查询02.png differ diff --git a/javaEE/day07/img/多表查询03.png b/javaEE/day07/img/多表查询03.png new file mode 100644 index 0000000..3eb80f6 Binary files /dev/null and b/javaEE/day07/img/多表查询03.png differ diff --git a/javaEE/day07/img/多表查询04.png b/javaEE/day07/img/多表查询04.png new file mode 100644 index 0000000..b0e4295 Binary files /dev/null and b/javaEE/day07/img/多表查询04.png differ diff --git a/javaEE/day07/img/多表查询05.png b/javaEE/day07/img/多表查询05.png new file mode 100644 index 0000000..62642a1 Binary files /dev/null and b/javaEE/day07/img/多表查询05.png differ diff --git a/javaEE/day07/img/多表查询06.png b/javaEE/day07/img/多表查询06.png new file mode 100644 index 0000000..e1a12e5 Binary files /dev/null and b/javaEE/day07/img/多表查询06.png differ diff --git a/javaEE/day07/img/多表查询07.png b/javaEE/day07/img/多表查询07.png new file mode 100644 index 0000000..7b9a1a1 Binary files /dev/null and b/javaEE/day07/img/多表查询07.png differ diff --git a/javaEE/day07/img/多表查询08.png b/javaEE/day07/img/多表查询08.png new file mode 100644 index 0000000..b6e217e Binary files /dev/null and b/javaEE/day07/img/多表查询08.png differ diff --git a/javaEE/day07/img/多表查询09.png b/javaEE/day07/img/多表查询09.png new file mode 100644 index 0000000..1db828e Binary files /dev/null and b/javaEE/day07/img/多表查询09.png differ diff --git a/javaEE/day07/img/多表查询10.png b/javaEE/day07/img/多表查询10.png new file mode 100644 index 0000000..3b8b950 Binary files /dev/null and b/javaEE/day07/img/多表查询10.png differ diff --git a/javaEE/day07/img/多表查询11.png b/javaEE/day07/img/多表查询11.png new file mode 100644 index 0000000..192e4a1 Binary files /dev/null and b/javaEE/day07/img/多表查询11.png differ diff --git a/javaEE/day07/img/多表查询12.png b/javaEE/day07/img/多表查询12.png new file mode 100644 index 0000000..079d92a Binary files /dev/null and b/javaEE/day07/img/多表查询12.png differ diff --git a/javaEE/day07/img/多表查询13.png b/javaEE/day07/img/多表查询13.png new file mode 100644 index 0000000..cfc6de9 Binary files /dev/null and b/javaEE/day07/img/多表查询13.png differ diff --git a/javaEE/day07/img/多表查询14.png b/javaEE/day07/img/多表查询14.png new file mode 100644 index 0000000..46ac5b9 Binary files /dev/null and b/javaEE/day07/img/多表查询14.png differ diff --git a/javaEE/day07/img/多表查询15.png b/javaEE/day07/img/多表查询15.png new file mode 100644 index 0000000..2a4df7f Binary files /dev/null and b/javaEE/day07/img/多表查询15.png differ diff --git a/javaEE/day07/img/多表查询16.png b/javaEE/day07/img/多表查询16.png new file mode 100644 index 0000000..4f914ca Binary files /dev/null and b/javaEE/day07/img/多表查询16.png differ diff --git a/javaEE/day07/img/多表查询17.png b/javaEE/day07/img/多表查询17.png new file mode 100644 index 0000000..3bb4ec3 Binary files /dev/null and b/javaEE/day07/img/多表查询17.png differ diff --git a/javaEE/day07/img/多表查询18.png b/javaEE/day07/img/多表查询18.png new file mode 100644 index 0000000..48acb19 Binary files /dev/null and b/javaEE/day07/img/多表查询18.png differ diff --git a/javaEE/day07/img/多表查询19.png b/javaEE/day07/img/多表查询19.png new file mode 100644 index 0000000..f005b2a Binary files /dev/null and b/javaEE/day07/img/多表查询19.png differ diff --git a/javaEE/day07/img/多表查询20.png b/javaEE/day07/img/多表查询20.png new file mode 100644 index 0000000..28f163c Binary files /dev/null and b/javaEE/day07/img/多表查询20.png differ diff --git a/javaEE/day07/img/多表查询21.png b/javaEE/day07/img/多表查询21.png new file mode 100644 index 0000000..b118945 Binary files /dev/null and b/javaEE/day07/img/多表查询21.png differ diff --git a/javaEE/day07/img/多表查询22.png b/javaEE/day07/img/多表查询22.png new file mode 100644 index 0000000..d7859d8 Binary files /dev/null and b/javaEE/day07/img/多表查询22.png differ diff --git a/javaEE/day07/img/多表查询23.png b/javaEE/day07/img/多表查询23.png new file mode 100644 index 0000000..ee99716 Binary files /dev/null and b/javaEE/day07/img/多表查询23.png differ diff --git a/javaEE/day07/img/多表查询24.png b/javaEE/day07/img/多表查询24.png new file mode 100644 index 0000000..ffd1590 Binary files /dev/null and b/javaEE/day07/img/多表查询24.png differ diff --git a/javaEE/day07/img/多表查询25.png b/javaEE/day07/img/多表查询25.png new file mode 100644 index 0000000..7f7b75a Binary files /dev/null and b/javaEE/day07/img/多表查询25.png differ diff --git a/javaEE/day07/img/多表查询26.png b/javaEE/day07/img/多表查询26.png new file mode 100644 index 0000000..61aa9ea Binary files /dev/null and b/javaEE/day07/img/多表查询26.png differ diff --git a/javaEE/day07/img/多表查询27.png b/javaEE/day07/img/多表查询27.png new file mode 100644 index 0000000..bc1c8a2 Binary files /dev/null and b/javaEE/day07/img/多表查询27.png differ diff --git a/javaEE/day07/img/多表查询28.png b/javaEE/day07/img/多表查询28.png new file mode 100644 index 0000000..6bd8529 Binary files /dev/null and b/javaEE/day07/img/多表查询28.png differ diff --git a/javaEE/day07/img/多表查询29.png b/javaEE/day07/img/多表查询29.png new file mode 100644 index 0000000..5254d90 Binary files /dev/null and b/javaEE/day07/img/多表查询29.png differ diff --git a/javaEE/day07/img/多表查询30.png b/javaEE/day07/img/多表查询30.png new file mode 100644 index 0000000..60b37ea Binary files /dev/null and b/javaEE/day07/img/多表查询30.png differ diff --git a/javaEE/day07/img/多表查询31.png b/javaEE/day07/img/多表查询31.png new file mode 100644 index 0000000..065b940 Binary files /dev/null and b/javaEE/day07/img/多表查询31.png differ diff --git a/javaEE/day07/img/多表查询32.png b/javaEE/day07/img/多表查询32.png new file mode 100644 index 0000000..cced728 Binary files /dev/null and b/javaEE/day07/img/多表查询32.png differ diff --git a/javaEE/day07/img/多表查询33.png b/javaEE/day07/img/多表查询33.png new file mode 100644 index 0000000..241a129 Binary files /dev/null and b/javaEE/day07/img/多表查询33.png differ diff --git a/javaEE/day07/img/多表查询34.png b/javaEE/day07/img/多表查询34.png new file mode 100644 index 0000000..5e3e247 Binary files /dev/null and b/javaEE/day07/img/多表查询34.png differ diff --git a/javaEE/day07/img/多表查询35.png b/javaEE/day07/img/多表查询35.png new file mode 100644 index 0000000..9721497 Binary files /dev/null and b/javaEE/day07/img/多表查询35.png differ diff --git a/javaEE/day07/img/多表查询36.png b/javaEE/day07/img/多表查询36.png new file mode 100644 index 0000000..65f86ad Binary files /dev/null and b/javaEE/day07/img/多表查询36.png differ diff --git a/javaEE/day07/img/多表查询37.png b/javaEE/day07/img/多表查询37.png new file mode 100644 index 0000000..81b1795 Binary files /dev/null and b/javaEE/day07/img/多表查询37.png differ diff --git a/javaEE/day07/img/多表查询38.png b/javaEE/day07/img/多表查询38.png new file mode 100644 index 0000000..1ec4b93 Binary files /dev/null and b/javaEE/day07/img/多表查询38.png differ diff --git a/javaEE/day07/img/多表查询39.png b/javaEE/day07/img/多表查询39.png new file mode 100644 index 0000000..8e32559 Binary files /dev/null and b/javaEE/day07/img/多表查询39.png differ diff --git a/javaEE/day07/img/多表查询40.png b/javaEE/day07/img/多表查询40.png new file mode 100644 index 0000000..647d3ea Binary files /dev/null and b/javaEE/day07/img/多表查询40.png differ diff --git a/javaEE/day07/img/多表查询41.png b/javaEE/day07/img/多表查询41.png new file mode 100644 index 0000000..942641b Binary files /dev/null and b/javaEE/day07/img/多表查询41.png differ diff --git a/javaEE/day07/img/多表查询42.png b/javaEE/day07/img/多表查询42.png new file mode 100644 index 0000000..18795cc Binary files /dev/null and b/javaEE/day07/img/多表查询42.png differ diff --git a/javaEE/day07/img/多表查询43.png b/javaEE/day07/img/多表查询43.png new file mode 100644 index 0000000..a92204a Binary files /dev/null and b/javaEE/day07/img/多表查询43.png differ diff --git a/javaEE/day07/img/多表查询44.png b/javaEE/day07/img/多表查询44.png new file mode 100644 index 0000000..548738a Binary files /dev/null and b/javaEE/day07/img/多表查询44.png differ diff --git a/javaEE/day07/img/子查询01.png b/javaEE/day07/img/子查询01.png new file mode 100644 index 0000000..5a6be99 Binary files /dev/null and b/javaEE/day07/img/子查询01.png differ diff --git a/javaEE/day07/img/子查询02.png b/javaEE/day07/img/子查询02.png new file mode 100644 index 0000000..f67d12c Binary files /dev/null and b/javaEE/day07/img/子查询02.png differ diff --git a/javaEE/day07/img/子查询03.png b/javaEE/day07/img/子查询03.png new file mode 100644 index 0000000..34c91db Binary files /dev/null and b/javaEE/day07/img/子查询03.png differ diff --git a/javaEE/day07/img/子查询04.png b/javaEE/day07/img/子查询04.png new file mode 100644 index 0000000..e44766e Binary files /dev/null and b/javaEE/day07/img/子查询04.png differ diff --git a/javaEE/day07/img/子查询05.png b/javaEE/day07/img/子查询05.png new file mode 100644 index 0000000..3a72ad9 Binary files /dev/null and b/javaEE/day07/img/子查询05.png differ diff --git a/javaEE/day07/img/子查询06.png b/javaEE/day07/img/子查询06.png new file mode 100644 index 0000000..d9830d9 Binary files /dev/null and b/javaEE/day07/img/子查询06.png differ diff --git a/javaEE/day07/img/子查询07.png b/javaEE/day07/img/子查询07.png new file mode 100644 index 0000000..58df821 Binary files /dev/null and b/javaEE/day07/img/子查询07.png differ diff --git a/javaEE/day07/img/子查询08.png b/javaEE/day07/img/子查询08.png new file mode 100644 index 0000000..d27c9af Binary files /dev/null and b/javaEE/day07/img/子查询08.png differ diff --git a/javaEE/day07/img/子查询09.png b/javaEE/day07/img/子查询09.png new file mode 100644 index 0000000..e7887a6 Binary files /dev/null and b/javaEE/day07/img/子查询09.png differ diff --git a/javaEE/day07/img/子查询10.png b/javaEE/day07/img/子查询10.png new file mode 100644 index 0000000..2b10bda Binary files /dev/null and b/javaEE/day07/img/子查询10.png differ diff --git a/javaEE/day07/img/子查询11.png b/javaEE/day07/img/子查询11.png new file mode 100644 index 0000000..690a012 Binary files /dev/null and b/javaEE/day07/img/子查询11.png differ diff --git a/javaEE/day07/img/子查询12.png b/javaEE/day07/img/子查询12.png new file mode 100644 index 0000000..92d8a1c Binary files /dev/null and b/javaEE/day07/img/子查询12.png differ diff --git a/javaEE/day07/img/子查询13.png b/javaEE/day07/img/子查询13.png new file mode 100644 index 0000000..d570747 Binary files /dev/null and b/javaEE/day07/img/子查询13.png differ diff --git a/javaEE/day07/img/子查询14.png b/javaEE/day07/img/子查询14.png new file mode 100644 index 0000000..7fc8a14 Binary files /dev/null and b/javaEE/day07/img/子查询14.png differ diff --git a/javaEE/day07/img/数据库导出01.png b/javaEE/day07/img/数据库导出01.png new file mode 100644 index 0000000..934e98b Binary files /dev/null and b/javaEE/day07/img/数据库导出01.png differ diff --git a/javaEE/day07/img/数据库导出02.png b/javaEE/day07/img/数据库导出02.png new file mode 100644 index 0000000..3d8be5f Binary files /dev/null and b/javaEE/day07/img/数据库导出02.png differ diff --git a/javaEE/day07/img/数据库导出03.png b/javaEE/day07/img/数据库导出03.png new file mode 100644 index 0000000..3978e91 Binary files /dev/null and b/javaEE/day07/img/数据库导出03.png differ diff --git a/javaEE/day07/img/数据库导出04.png b/javaEE/day07/img/数据库导出04.png new file mode 100644 index 0000000..0b90bea Binary files /dev/null and b/javaEE/day07/img/数据库导出04.png differ diff --git a/javaEE/day07/img/数据库导出05.png b/javaEE/day07/img/数据库导出05.png new file mode 100644 index 0000000..3383adc Binary files /dev/null and b/javaEE/day07/img/数据库导出05.png differ diff --git a/javaEE/day07/img/数据库导出06.png b/javaEE/day07/img/数据库导出06.png new file mode 100644 index 0000000..e570201 Binary files /dev/null and b/javaEE/day07/img/数据库导出06.png differ diff --git a/javaEE/day07/img/数据库导出07.png b/javaEE/day07/img/数据库导出07.png new file mode 100644 index 0000000..13a5274 Binary files /dev/null and b/javaEE/day07/img/数据库导出07.png differ diff --git a/javaEE/day07/img/数据库导出08.png b/javaEE/day07/img/数据库导出08.png new file mode 100644 index 0000000..05c5197 Binary files /dev/null and b/javaEE/day07/img/数据库导出08.png differ diff --git a/javaEE/day07/img/数据库导出09.png b/javaEE/day07/img/数据库导出09.png new file mode 100644 index 0000000..869baa2 Binary files /dev/null and b/javaEE/day07/img/数据库导出09.png differ diff --git a/javaEE/day07/img/数据库导出10.png b/javaEE/day07/img/数据库导出10.png new file mode 100644 index 0000000..608a0ee Binary files /dev/null and b/javaEE/day07/img/数据库导出10.png differ diff --git a/javaEE/day07/img/级联操作01.png b/javaEE/day07/img/级联操作01.png new file mode 100644 index 0000000..a8c7a80 Binary files /dev/null and b/javaEE/day07/img/级联操作01.png differ diff --git a/javaEE/day07/img/级联操作02.png b/javaEE/day07/img/级联操作02.png new file mode 100644 index 0000000..e106e0e Binary files /dev/null and b/javaEE/day07/img/级联操作02.png differ diff --git a/javaEE/day07/img/聚合函数01.png b/javaEE/day07/img/聚合函数01.png new file mode 100644 index 0000000..e354ec8 Binary files /dev/null and b/javaEE/day07/img/聚合函数01.png differ diff --git a/javaEE/day07/img/聚合函数02.png b/javaEE/day07/img/聚合函数02.png new file mode 100644 index 0000000..524f214 Binary files /dev/null and b/javaEE/day07/img/聚合函数02.png differ diff --git a/javaEE/day07/img/聚合函数03.png b/javaEE/day07/img/聚合函数03.png new file mode 100644 index 0000000..0b03cfa Binary files /dev/null and b/javaEE/day07/img/聚合函数03.png differ diff --git a/javaEE/day07/img/聚合函数04.png b/javaEE/day07/img/聚合函数04.png new file mode 100644 index 0000000..3ad4532 Binary files /dev/null and b/javaEE/day07/img/聚合函数04.png differ diff --git a/javaEE/day07/img/聚合函数05.png b/javaEE/day07/img/聚合函数05.png new file mode 100644 index 0000000..c2d7061 Binary files /dev/null and b/javaEE/day07/img/聚合函数05.png differ diff --git a/javaEE/day07/img/聚合函数06.png b/javaEE/day07/img/聚合函数06.png new file mode 100644 index 0000000..ecdc143 Binary files /dev/null and b/javaEE/day07/img/聚合函数06.png differ diff --git a/javaEE/day07/img/聚合函数07.png b/javaEE/day07/img/聚合函数07.png new file mode 100644 index 0000000..409933c Binary files /dev/null and b/javaEE/day07/img/聚合函数07.png differ diff --git a/javaEE/day07/img/范式01.png b/javaEE/day07/img/范式01.png new file mode 100644 index 0000000..9e34fc3 Binary files /dev/null and b/javaEE/day07/img/范式01.png differ diff --git a/javaEE/day07/img/范式02.png b/javaEE/day07/img/范式02.png new file mode 100644 index 0000000..5864068 Binary files /dev/null and b/javaEE/day07/img/范式02.png differ diff --git a/javaEE/day07/img/范式03.png b/javaEE/day07/img/范式03.png new file mode 100644 index 0000000..95458fb Binary files /dev/null and b/javaEE/day07/img/范式03.png differ diff --git a/javaEE/day07/img/范式04.png b/javaEE/day07/img/范式04.png new file mode 100644 index 0000000..8908453 Binary files /dev/null and b/javaEE/day07/img/范式04.png differ diff --git a/javaEE/day07/img/表连接查询01.png b/javaEE/day07/img/表连接查询01.png new file mode 100644 index 0000000..a880147 Binary files /dev/null and b/javaEE/day07/img/表连接查询01.png differ diff --git a/javaEE/day07/img/表连接查询02.png b/javaEE/day07/img/表连接查询02.png new file mode 100644 index 0000000..9144b9f Binary files /dev/null and b/javaEE/day07/img/表连接查询02.png differ diff --git a/javaEE/day07/img/表连接查询03.png b/javaEE/day07/img/表连接查询03.png new file mode 100644 index 0000000..cef586d Binary files /dev/null and b/javaEE/day07/img/表连接查询03.png differ diff --git a/javaEE/day07/img/表连接查询04.png b/javaEE/day07/img/表连接查询04.png new file mode 100644 index 0000000..22b5d81 Binary files /dev/null and b/javaEE/day07/img/表连接查询04.png differ diff --git a/javaEE/day07/img/表连接查询05.png b/javaEE/day07/img/表连接查询05.png new file mode 100644 index 0000000..c792627 Binary files /dev/null and b/javaEE/day07/img/表连接查询05.png differ diff --git a/javaEE/day07/img/表连接查询06.png b/javaEE/day07/img/表连接查询06.png new file mode 100644 index 0000000..b9d774e Binary files /dev/null and b/javaEE/day07/img/表连接查询06.png differ diff --git a/javaEE/day07/img/表连接查询07.png b/javaEE/day07/img/表连接查询07.png new file mode 100644 index 0000000..4960a54 Binary files /dev/null and b/javaEE/day07/img/表连接查询07.png differ diff --git a/javaEE/day07/img/表连接查询08.png b/javaEE/day07/img/表连接查询08.png new file mode 100644 index 0000000..535932b Binary files /dev/null and b/javaEE/day07/img/表连接查询08.png differ diff --git a/javaEE/day07/img/表连接查询09.png b/javaEE/day07/img/表连接查询09.png new file mode 100644 index 0000000..dbbec6f Binary files /dev/null and b/javaEE/day07/img/表连接查询09.png differ diff --git a/javaEE/day07/img/表连接查询10.png b/javaEE/day07/img/表连接查询10.png new file mode 100644 index 0000000..65819fd Binary files /dev/null and b/javaEE/day07/img/表连接查询10.png differ diff --git a/javaEE/day07/img/表连接查询11.png b/javaEE/day07/img/表连接查询11.png new file mode 100644 index 0000000..b8636b2 Binary files /dev/null and b/javaEE/day07/img/表连接查询11.png differ diff --git a/javaEE/day07/img/表连接查询12.png b/javaEE/day07/img/表连接查询12.png new file mode 100644 index 0000000..34535a7 Binary files /dev/null and b/javaEE/day07/img/表连接查询12.png differ diff --git a/javaEE/day07/img/表连接查询13.png b/javaEE/day07/img/表连接查询13.png new file mode 100644 index 0000000..4096d5f Binary files /dev/null and b/javaEE/day07/img/表连接查询13.png differ diff --git a/javaEE/day07/img/表连接查询14.png b/javaEE/day07/img/表连接查询14.png new file mode 100644 index 0000000..d775d2d Binary files /dev/null and b/javaEE/day07/img/表连接查询14.png differ diff --git a/javaEE/day07/img/表连接查询15.png b/javaEE/day07/img/表连接查询15.png new file mode 100644 index 0000000..7d3704b Binary files /dev/null and b/javaEE/day07/img/表连接查询15.png differ diff --git a/javaEE/day07/img/表连接查询16.png b/javaEE/day07/img/表连接查询16.png new file mode 100644 index 0000000..ec23ac0 Binary files /dev/null and b/javaEE/day07/img/表连接查询16.png differ diff --git a/javaEE/day07/img/表连接查询17.png b/javaEE/day07/img/表连接查询17.png new file mode 100644 index 0000000..baf5e3d Binary files /dev/null and b/javaEE/day07/img/表连接查询17.png differ diff --git a/javaEE/day07/img/默认值.png b/javaEE/day07/img/默认值.png new file mode 100644 index 0000000..bd7791b Binary files /dev/null and b/javaEE/day07/img/默认值.png differ diff --git a/javaEE/day08/MySQL多表查询与事务的操作-笔记.md b/javaEE/day08/MySQL多表查询与事务的操作-笔记.md new file mode 100644 index 0000000..379781d --- /dev/null +++ b/javaEE/day08/MySQL多表查询与事务的操作-笔记.md @@ -0,0 +1,770 @@ +# MySQL多表查询与事务 + +### 学习目标 +1. 能够理解三大范式 +2. 能够使用内连接进行多表查询 +3. 能够使用左外连接和右外连接进行多表查询 +4. 能够使用子查询进行多表查询 +5. 能够理解多表查询的规律 +6. 能够理解事务的概念 +7. 能够说出事务的原理 +8. 能够在MySQL中使用事务 +9. 能够理解脏读,不可重复读,幻读的概念及解决办法 + +## 第一章 数据库的三大范式 + +#### 目标 + +能够说数据库中有哪三大范式?每个范式的含义是什么? + +#### 讲解 + +##### 什么是范式 +**范式是指**:设计数据库表的规则(Normal Form) +​ 好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储 + +##### 范式的基本分类 +​ 目前关系数据库有五种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。**一般说来,数据库只需满足第三范式(3NF)就行了。** + +##### 第一范式 +​ 即数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中每个列的值只能是表的一个属性或一个属性的一部分。简而言之,第一范式每一列不可再拆分,称为原子性。 +**第一范式**:表中每一列不能再拆分 +![](img/范式01.png) + +>总结:如果不遵守第一范式,查询出数据还需要进一步处理(查询不方便)。遵守第一范式,需要什么字段的数据就查询什么数据(方便查询)。 + +##### 第二范式 +​ 第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。例如在员工表中的身份证号码即可实现每个员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分。 +​ 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。 + +**第二范式**: + +1. 一张表只描述一件事情 +2. 表中的每一个字段都依赖于主键 + ![](img/范式03.png) +>总结:如果不准守第二范式,数据冗余,相同数据无法区分。遵守第二范式减少数据冗余,通过主键区分相同数据。 + +##### 第三范式 + +​ 在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖) +第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。 + +**第三范式**:从表的外键必须使用主表的主键 +![](img/范式04.png) + +>总结:如果不准守第三范式,可能会有相同数据无法区分,修改数据的时候多张表都需要修改(不方便修改)。遵守第三范式通过id可以区分相同数据,修改数据的时候只需要修改一张表(方便修改)。 + +#### 小结 + +第一范式要求? +​ 表中的字段不能再拆分(字段原子性) + +第二范式要求? +​ 1.一张表描述一件事情 +​ 2.每个表都提供主键 + +第三范式要求? +​ 从表的外键必须使用主表的主键 + +## 第二章 多表查询介绍 + +#### 目标 + +了解什么是多表查询,及多表查询的两种方式 + +#### 讲解 + +##### 什么是多表查询 + +**同时查询多张表获取到需要的数据** +比如:我们想查询到开发部有多少人,需要将部门表和员工表同时进行查询 +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A201.png) + +##### 多表查询的分类 + +![1550291804592](img/1550291804592.png) + +#### 小结 + +什么是多表查询?通过查询多张表获取我们想要的数据 + +### 笛卡尔积现象 + +#### 目标 + +能够说出什么是笛卡尔积,以及如何消除笛卡尔积 + +#### 讲解 +##### 准备数据 + +```sql +CREATE DATABASE day15; +USE day15; + +-- 创建部门表 +CREATE TABLE dept ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(20) +); + +INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部'); + +-- 创建员工表 +CREATE TABLE emp ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(10), + gender CHAR(1), -- 性别 + salary DOUBLE, -- 工资 + join_date DATE, -- 入职日期 + dept_id INT +); + +INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1); +INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2); +INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2); +INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3); +INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1); +``` + +##### 什么是笛卡尔积现象 + +需求:查询每个部门有哪些人 + +具体操作: + +```sql +SELECT * FROM dept, emp; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A203.png) + +以上数据其实是左表的每条数据和右表的每条数据组合。左表有3条,右表有5条,最终组合后3*5=15条数据。 + +**左表的每条数据和右表的每条数据组合,这种效果称为笛卡尔乘积** +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A204.png) + +##### 如何清除笛卡尔积现象的影响 + +我们发现不是所有的数据组合都是有用的,只有员工表.dept_id = 部门表.id 的数据才是有用的。所以需要通过条件过滤掉没用的数据。 +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A205.png) + +```sql +SELECT * FROM dept, emp WHERE emp.`dept_id`=dept.`id`; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A206.png) + +#### 小结 + +1. 能够说出什么是笛卡尔积? + 左表的每条记录和右表的每条记录会组合起来 +2. 如何消除笛卡尔积 + 只查询满足要求的数据,通常都是外键等于主键 + +### 内连接 + +#### 目标 + +能够掌握内连接的使用 + +#### 讲解 + +##### 什么是内连接 + +用左边表的记录去匹配右边表的记录,如果符合条件的则显示 + +##### 隐式内连接 + +隐式内连接:看不到`JOIN`关键字,条件使用`WHERE`指定 + +```sql +SELECT 字段 FROM 左表, 右表 WHERE 条件; +``` + +##### 显示内连接 + +显示内连接:使用`INNER JOIN ... ON`语句, 可以省略`INNER` + +```sql +SELECT 字段 FROM 左表 INNER JOIN 右表 ON 条件; +SELECT 字段 FROM 左表 JOIN 右表 ON 条件; +``` + +具体操作: + +- 查询唐僧的信息,显示员工id,姓名,性别,工资和所在的部门名称,我们发现需要联合2张表同时才能查询出需要的数据,我们使用内连接 + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A215.png) + +1. 确定查询哪些表 + +```sql +SELECT * FROM dept INNER JOIN emp; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A207.png) + +2. 确定表连接条件,员工表.dept_id = 部门表.id 的数据才是有效的 + +```sql +SELECT * FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id`; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A208.png) + +3. 确定查询条件,我们查询的是唐僧的信息,部门表.name='唐僧' + +```sql +SELECT * FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id` AND emp.`NAME`='唐僧'; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A209.png) + +4. 确定查询字段,查询唐僧的信息,显示员工id,姓名,性别,工资和所在的部门名称 + +```sql +SELECT emp.`id`, emp.`NAME`, emp.`gender`, emp.`salary`, dept.`NAME` FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id` AND emp.`NAME`='唐僧'; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A210.png) + +5. 我们发现写表名有点长,可以给表取别名,显示的字段名也使用别名 + +```sql +SELECT e.`id` 员工编号, e.`NAME` 员工姓名, e.`gender` 性别, e.`salary` 工资, d.`NAME` 部门名称 FROM dept d INNER JOIN emp e ON e.`dept_id`=d.`id` AND e.`NAME`='唐僧'; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A211.png) + +#### 小结 + +1. 什么是隐式内连接和显示内连接? + 隐式内连接:看不到JOIN:SELECT 字段 FROM 左表, 右表 WHERE 条件; + 显示内连接:看得到JOIN:SELECT 字段 FROM 左表 INNER JOIN 右表 ON 条件; +2. 内连接查询步骤? + 1.确定查询几张表 + 2.确定表连接条件 + 3.根据需要在操作 + +### 左外连接 + +#### 目标 + +能够掌握左外连接查询 + +#### 讲解 + +左外连接:使用`LEFT OUTER JOIN ... ON`,`OUTER`可以省略 + +```sql +SELECT 字段名 FROM 左表 LEFT OUTTER JOIN 右表 ON 条件; +``` + +**左外连接**可以理解为:在内连接的基础上保证左表的数据全部显示,右表中没有对应的记录,使用NULL填充。 + +具体操作: + +- 在部门表中增加一个销售部 + +```sql +INSERT INTO dept (NAME) VALUES ('销售部'); +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A212.png) + +- 使用内连接查询 + +```sql +SELECT * FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id`; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A213.png) + +- 使用左外连接查询 + +```sql +SELECT * FROM dept LEFT OUTER JOIN emp ON emp.`dept_id`=dept.`id`; +``` + +![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A214.png) + +#### 小结 + +1. 掌握左外连接查询格式? + + ``` + SELECT 字段 FROM 左表 LEFT OUTER JOIN 右表 ON 条件 + ``` + +2. 左外连接查询特点? + 在满足要求的基础上保证左表的数据全部显示 + 在内连接的基础上保证左表的数据全部显示 + +### 右外连接 + +#### 目标 + +能够掌握右外连接查询 + +#### 讲解 + +右外连接:使用`RIGHT OUTER JOIN ... ON`,`OUTER`可以省略 + +```sql + +``` + +**右外连接**可以理解为:在内连接的基础上保证右表的数据全部显示,左表中没有对应的记录,使用NULL填充。 + +具体操作: + +- 在员工表中增加一个员工 +```sql +INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('沙僧','男',6666,'2013-02-24',NULL); +``` + ![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A217.png) +- 使用内连接查询 +```sql +SELECT * FROM dept INNER JOIN emp ON emp.`dept_id`=dept.`id`; +``` + ![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A213.png) +- 使用右外连接查询 +```sql +SELECT * FROM dept RIGHT OUTER JOIN emp ON emp.`dept_id`=dept.`id`; +``` + ![](img/%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A216.png) + +#### 小结 + +1. 掌握右外连接查询格式? + + ``` + SELECT 字段 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件; + ``` + +2. 右外连接查询特点? + 在满足要求的基础上,保证右表的数据全部显示. + +### 子查询 + +#### 目标 + +能够掌握子查询的概念 + +能够理解子查询的三种情况 + +#### 讲解 + +##### 什么是子查询 + +**一条查询语句结果作为另一条查询语法一部分。** + +```sql +SELECT 查询字段 FROM 表 WHERE 条件; +``` + +```sql +SELECT * FROM employee WHERE salary=(SELECT MAX(salary) FROM employee); +``` + +![](img/%E5%AD%90%E6%9F%A5%E8%AF%A201.png) +子查询需要放在()中 + +##### 子查询结果的三种情况 + +1. 子查询的结果是单行单列的时候 + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A202.png) +2. 子查询的结果是多行单列的时候 + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A203.png) +3. 子查询的结果是多行多列 + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A204.png) + +#### 小结 + +1. 什么是子查询? + 一个查询的结果作为另一个查询语句的一部分 +2. 子查询结果的三种情况? + 单行单列 + 多行单列 + 多行多列 + +### 子查询的结果是单行单列的时候 + +#### 目标 + +能够掌握子查询的结果是单行单列的查询 + +#### 讲解 + +子查询结果是`单列`,在`WHERE`后面作为`条件` +`SELECT 查询字段 FROM 表 WHERE 字段=(子查询);` + +1. **查询工资最高的员工是谁?** + + 1. 查询最高工资是多少 + + ```sql + SELECT MAX(salary) FROM emp; + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A205.png) + + 1. 根据最高工资到员工表查询到对应的员工信息 + + ```sql + SELECT * FROM emp WHERE salary=(SELECT MAX(salary) FROM emp); + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A206.png) + +2. **查询工资小于平均工资的员工有哪些?** + + 1. 查询平均工资是多少 + + ```sql + SELECT AVG(salary) FROM emp; + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A207.png) + + 1. 到员工表查询小于平均的员工信息 + + ```sql + SELECT * FROM emp WHERE salary < (SELECT AVG(salary) FROM emp); + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A208.png) + +#### 小结 + +子查询的结果是单行单列时父查询如何处理? +SELECT 查询字段 FROM 表 WHERE 字段=(子查询); + +通常作为父查询的条件 + +### 子查询结果是多行单列的时候 + +#### 目标 + +能够掌握子查询的结果是多行单列的查询 + +#### 讲解 + +子查询结果是单列多行,结果集类似于一个数组,在`WHERE`后面作为`条件`,父查询使用`IN`运算符 + +```sql +SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询); +``` + +1. **查询工资大于5000的员工,来自于哪些部门的名字** + + 1. 先查询大于5000的员工所在的部门id + + ```sql + SELECT dept_id FROM emp WHERE salary > 5000; + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A209.png) + + 1. 再查询在这些部门id中部门的名字 + + ```sql + SELECT dept.name FROM dept WHERE dept.id IN (SELECT dept_id FROM emp WHERE salary > 5000); + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A210.png) + +2. **查询开发部与财务部所有的员工信息** + + 1. 先查询开发部与财务部的id + + ```sql + SELECT id FROM dept WHERE NAME IN('开发部','财务部'); + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A211.png) + + 1. 再查询在这些部门id中有哪些员工 + + ```sql + SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME IN('开发部','财务部')); + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A212.png) + +#### 小结 + +子查询的结果是多行单列时父查询如何处理? +放在父查询的条件位置,使用in + +### 子查询的结果是多行多列 + +#### 目标 + +能够掌握子查询的结果是多行多列的查询 + +#### 讲解 + +子查询结果是`多列`,在`FROM`后面作为`表` + +```sql +SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件; +``` + +子查询作为表需要取别名,否则这张表没用名称无法访问表中的字段 + +- **查询出2011年以后入职的员工信息,包括部门名称** + + 1. 在员工表中查询2011-1-1以后入职的员工 + + ```sql + SELECT * FROM emp WHERE join_date > '2011-1-1'; + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A214.png) + + 1. 查询所有的部门信息,与上面的虚拟表中的信息组合,找出所有部门id等于dept_id + + ```sql + SELECT * FROM dept d, (SELECT * FROM emp WHERE join_date > '2011-1-1') e WHERE e.dept_id = d.id; + ``` + + ![](img/%E5%AD%90%E6%9F%A5%E8%AF%A213.png) + +使用表连接: + +```sql +SELECT d.*, e.* FROM dept d INNER JOIN emp e ON d.id = e.dept_id WHERE e.join_date > '2011-1-1'; +``` + +#### 小结 +三种子查询情况:单行单列,多行单列,多行多列 +单行单列:作为父查询的条件 +多行单列:作为父查询的条件,通常使用 IN +多行多列:作为父查询的一张表(虚拟表) + +## 第三章 事务的概念 + +#### 目标 + +1. 能够理解事务的概念 +2. 了解事务的四大特性 + +#### 讲解 + +##### 什么是事务 + +​ 在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行,要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。 + +##### 事务的应用场景说明 + + +例如: 张三给李四转账,张三账号减钱,李四账号加钱 + +```sql +-- 创建数据表 +CREATE TABLE account ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(10), + balance DOUBLE +); + +-- 添加数据 +INSERT INTO account (NAME, balance) VALUES ('张三', 1000), ('李四', 1000); +``` + +模拟张三给李四转500元钱,一个转账的业务操作最少要执行下面的2条语句: +1. 张三账号-500 +2. 李四账号+500 +```sql +-- 1. 张三账号-500 +UPDATE account SET balance = balance - 500 WHERE id=1; +-- 2. 李四账号+500 +UPDATE account SET balance = balance + 500 WHERE id=2; +``` +​ 假设当张三账号上-500元,服务器崩溃了。李四的账号并没有+500元,数据就出现问题了。我们需要保证其中一条SQL语句出现问题,整个转账就算失败。只有两条SQL都成功了转账才算成功。这个时候就需要用到事务。 + + +##### 事务的四大特性(ACID) +| 事务特性 | 含义 | +| --------------------- | ------------------------------------------------------------ | +| 原子性(Atomicity) | 事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 | +| 一致性(Consistency) | 事务前后数据的完整性必须保持一致 | +| 隔离性(Isolation) | 是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离,不能相互影响。 | +| 持久性(Durability) | 指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 | +#### 小结 +什么是事务?多条SQL组合再一起完成某个功能. + +事务四个特性? +原子性 +一致性 +隔离性 +持久性 + +### 手动提交事务 + +#### 目标 + +能够使用手动的方式提交事务 + +#### 讲解 + +MYSQL中可以有两种方式进行事务的操作: + +1. 手动提交事务 +2. 自动提交事务(默认的) + + 事务有关的SQL语句: +| SQL语句 | 描述 | +| ------------------ | -------- | +| start transaction; | 开启事务 | +| commit; | 提交事务 | +| rollback; | 回滚事务 | + +##### 手动提交事务使用步骤 + +​ 第1种情况:开启事务 -> 执行SQL语句 -> 成功 -> 提交事务 +​ 第2种情况:开启事务 -> 执行SQL语句 -> 失败 -> 回滚事务 + ![](img/事务01.png) + +**案例演示1**:模拟张三给李四转500元钱(成功) +目前数据库数据如下: +![](img/事务03.png) + +1. 使用DOS控制台进入MySQL +2. 执行以下SQL语句: `1.开启事务`, `2.张三账号-500`, `3.李四账号+500` + ```sql + START TRANSACTION; + UPDATE account SET balance = balance - 500 WHERE id=1; + UPDATE account SET balance = balance + 500 WHERE id=2; + ``` + ![](img/事务02.png) +3. 使用SQLYog查看数据库:发现数据并没有改变 + ![](img/事务03.png) +4. 在控制台执行`commit`提交任务: + ![](img/事务04.png) +5. 使用SQLYog查看数据库:发现数据改变 + ![](img/事务05.png) + +--- +**案例演示2**:模拟张三给李四转500元钱(失败) +目前数据库数据如下: +![](img/事务05.png) + +1. 在控制台执行以下SQL语句:`1.开启事务`, `2.张三账号-500` + ```sql + START TRANSACTION; + UPDATE account SET balance = balance - 500 WHERE id=1; + ``` + ![](img/事务06.png) +2. 使用SQLYog查看数据库:发现数据并没有改变 + ![](img/事务07.png) +3. 在控制台执行`rollback`回滚事务: + ![](img/事务08.png) +4. 使用SQLYog查看数据库:发现数据没有改变 + ![](img/事务09.png) + +#### 小结 + +1. 如何开启事务: start transaction; +2. 如何提交事务: commit; +3. 如何回滚事务: rollback; + +### 自动提交事务 + +#### 目标 + +了解自动提交事务 + +能够关闭自动提交事务 + +#### 讲解 + +​ MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务,MySQL默认开始自动提交事务。 +![](img/事务10.png) + +1. 将金额重置为1000 + ![](img/事务11.png) + +2. 执行以下SQL语句 + ```sql + UPDATE account SET balance = balance - 500 WHERE id=1; + ``` + +3. 使用SQLYog查看数据库:发现数据已经改变 + ![](img/事务12.png) + + + 使用SQL语句查看MySQL是否开启自动提交事务 + + ```sql +show variables like '%commit%'; +-- 或 +SELECT @@autocommit; + ``` + 通过修改MySQL全局变量"autocommit",取消自动提交事务 + ![](img/事务13.png) + 0:OFF(关闭自动提交) + 1:ON(开启自动提交) + +4. 取消自动提交事务,设置自动提交的参数为OFF,执行SQL语句:`set autocommit = 0;` + ![](img/事务14.png) + +5. 在控制台执行以下SQL语句:张三-500 + ```sql + UPDATE account SET balance = balance - 500 WHERE id=1; + ``` + ![](img/事务15.png) + +6. 使用SQLYog查看数据库,发现数据并没有改变 + ![](img/事务16.png) + +7. 在控制台执行`commit`提交任务 + ![](img/事务17.png) + +8. 使用SQLYog查看数据库,发现数据改变 + ![](img/事务18.png) + +#### 小结 + +1. 查询事务提交状态: + show variables like '%commit%'; + select @@autocommit; +2. 关闭事务自动提交: + set autocommit = 0; + + + +## 总结 + +1. 能够理解三大范式 + 1NF: 表中的字段不能再拆分 + 2NF:一个表做一件事情,表中添加主键,所有字段依赖主键 + 3NF:多张表之间使用其他表的主键 + +2. 能够使用内连接进行多表查询 + 隐式: SELECT 字段 FROM 左表, 右表 WHERE 条件; + + 显示: SELECT 字段 FROM 左表 INNER JOIN 右表 ON 条件; + +3. 能够使用左外连接和右外连接进行多表查询 + 左外连接: SELECT 字段 FROM 左表 LEFT OUTER JOIN 右表 ON 条件; + 右外连接: SELECT 字段 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件; + +4. 能够使用子查询进行多表查询 + SELECT 字段 FROM 表名 WHERE 字段=(SELECT MAX(age) FROM 表名); + +5. 能够理解多表查询的规律 + 1.明确查询哪些表 + 2.明确表之间的连接条件,外键=主键 + 3.根据需求 + +6. 能够理解事务的概念 + 多条SQL语句组成一个功能,要么一起成功,要么一起失败. + +8. 能够在MySQL中使用事务 + 开启事务: start transaction; + 提交事务: commit; + 回滚事务: rollback; + 查看是否自动提交事务: show variables like '%commit%'; + 关闭事务自动提交: set autocommit = 0; diff --git a/javaEE/day08/Mybatis入门.md b/javaEE/day08/Mybatis入门.md new file mode 100644 index 0000000..6c989a5 --- /dev/null +++ b/javaEE/day08/Mybatis入门.md @@ -0,0 +1,704 @@ +# Mybatis入门 + + + + + + + +## 前言 + +在前面我们学习MySQL数据库时,都是利用图形化客户端工具(如:idea、datagrip),来操作数据库的。 + +> 在客户端工具中,编写增删改查的SQL语句,发给MySQL数据库管理系统,由数据库管理系统执行SQL语句并返回执行结果。 +> +> 增删改操作:返回受影响行数 +> +> 查询操作:返回结果集(查询的结果) + +我们做为后端程序开发人员,通常会使用Java程序来完成对数据库的操作。Java程序操作数据库,现在主流的方式是:Mybatis。 + +什么是MyBatis? + +- MyBatis是一款优秀的 **持久层** **框架**,用于简化JDBC的开发。 + +- MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 + +- 官网:https://mybatis.org/mybatis-3/zh/index.html + +在上面我们提到了两个词:一个是持久层,另一个是框架。 + +- 持久层:指的是就是数据访问层(dao),是用来操作数据库的。 + +![image-20220901114951631](assets/image-20220901114951631.png) + +- 框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软件开发更加高效、规范、通用、可拓展。 + + + +Mybatis课程安排: + +- Mybatis入门 + +- Mybatis基础增删改查 + +- Mybatis动态SQL + +接下来,我们就通过一个入门程序,让大家快速感受一下通过Mybatis如何来操作数据库。 + + + + + + + +## 1. 快速入门 + +需求:使用Mybatis查询所有用户数据。 + + + +### 1.1 入门程序分析 + +以前我们是在图形化客户端工具中编写SQL查询代码,发送给数据库执行,数据库执行后返回操作结果。 + +![image-20221209155704203](assets/image-20221209155704203.png) + + + +图形化工具会把数据库执行的查询结果,使用表格的形式展现出来 + +![image-20220901121116813](assets/image-20220901121116813.png) + + + +现在使用Mybatis操作数据库,就是在Mybatis中编写SQL查询代码,发送给数据库执行,数据库执行后返回结果。 + +![image-20221209155904370](assets/image-20221209155904370.png) + + + + Mybatis会把数据库执行的查询结果,使用实体类封装起来(一行记录对应一个实体类对象) + +![image-20221209161623051](assets/image-20221209161623051.png) + + + +Mybatis操作数据库的步骤: + +1. 准备工作(创建springboot工程、数据库表user、实体类User) + +2. 引入Mybatis的相关依赖,配置Mybatis(数据库连接信息) + +3. 编写SQL语句(注解/XML) + + + + + +### 1.2 入门程序实现 + +#### 1.2.1 准备工作 + +##### 1.2.1.1 创建springboot工程 + +创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包。 + +![image-20221209162827242](assets/image-20221209162827242.png) + +![image-20221209163123443](assets/image-20221209163123443.png) + +> 项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖 + +~~~xml + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.3.0 + + + + + com.mysql + mysql-connector-j + runtime + + + + + org.springframework.boot + spring-boot-starter-test + test + + +~~~ + + + + + + + +##### 1.2.1.2 数据准备 + +创建用户表user,并创建对应的实体类User。 + +- 用户表: + +```sql +-- 用户表 +create table user( + id int unsigned primary key auto_increment comment 'ID', + name varchar(100) comment '姓名', + age tinyint unsigned comment '年龄', + gender tinyint unsigned comment '性别, 1:男, 2:女', + phone varchar(11) comment '手机号' +) comment '用户表'; + +-- 测试数据 +insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000'); +insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001'); +insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002'); +insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003'); +insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004'); +insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005'); +``` + +![image-20220901121116813](assets/image-20220901121116813.png) + +- 实体类 + + - 实体类的属性名与表中的字段名一一对应。 + +```java +public class User { + private Integer id; //id(主键) + private String name; //姓名 + private Short age; //年龄 + private Short gender; //性别 + private String phone; //手机号 + + //省略GET, SET方法 +} +``` + +![image-20221209170354143](assets/image-20221209170354143.png) + + + + + +#### 1.2.2 配置Mybatis + +> 在之前使用图形化客户端工具,连接MySQL数据库时,需要配置: +> +> ![image-20221209172527630](assets/image-20221209172527630.png) +> +> 连接数据库的四大参数: +> +> - MySQL驱动类 +> - 登录名 +> - 密码 +> - 数据库连接字符串 + +基于上述分析,在Mybatis中要连接数据库,同样也需要以上4个参数配置。 + +在springboot项目中,可以编写application.properties文件,配置数据库连接信息。我们要连接数据库,就需要配置数据库连接的基本信息,包括:driver-class-name、url 、username,password。 + +> 在入门程序中,大家可以直接这么配置,后面会介绍什么是驱动。 + + + +application.properties: + +```properties +#驱动类名称 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +#数据库连接的url +spring.datasource.url=jdbc:mysql://localhost:3306/mybatis +#连接数据库的用户名 +spring.datasource.username=root +#连接数据库的密码 +spring.datasource.password=1234 +``` + +> 上述的配置,可以直接复制过去,不要敲错了。 全部都是 spring.datasource.xxxx 开头。 + + + + + +#### 1.2.3 编写SQL语句 + +在创建出来的springboot工程中,在引导类所在包下,在创建一个包 mapper。在mapper包下创建一个接口 UserMapper ,这是一个持久层接口(Mybatis的持久层接口规范一般都叫 XxxMapper)。 + +![image-20221209175843651](assets/image-20221209175843651.png) + +UserMapper: + +~~~java +import com.inmind.pojo.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import java.util.List; + +@Mapper +public interface UserMapper { + + //查询所有用户数据 + @Select("select id, name, age, gender, phone from user") + public List list(); + +} +~~~ + +> @Mapper注解:表示是mybatis中的Mapper接口 +> +> - 程序运行时:框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理 +> +> @Select注解:代表的就是select查询,用于书写select查询语句 + + + +#### 1.2.4 单元测试 + +在创建出来的SpringBoot工程中,在src下的test目录下,已经自动帮我们创建好了测试类 ,并且在测试类上已经添加了注解 @SpringBootTest,代表该测试类已经与SpringBoot整合。 + +该测试类在运行时,会自动通过引导类加载Spring的环境(IOC容器)。我们要测试那个bean对象,就可以直接通过@Autowired注解直接将其注入进行,然后就可以测试了。 + +测试类代码如下: + +```java +@SpringBootTest +public class MybatisQuickstartApplicationTests { + + @Autowired + private UserMapper userMapper; + + @Test + public void testList(){ + List userList = userMapper.list(); + for (User user : userList) { + System.out.println(user); + } + } + +} +``` + +> 运行结果: +> +> ~~~ +> User{id=1, name='白眉鹰王', age=55, gender=1, phone='18800000000'} +> User{id=2, name='金毛狮王', age=45, gender=1, phone='18800000001'} +> User{id=3, name='青翼蝠王', age=38, gender=1, phone='18800000002'} +> User{id=4, name='紫衫龙王', age=42, gender=2, phone='18800000003'} +> User{id=5, name='光明左使', age=37, gender=1, phone='18800000004'} +> User{id=6, name='光明右使', age=48, gender=1, phone='18800000005'} +> ~~~ + + + +### 1.3 解决SQL警告与提示 + +默认我们在UserMapper接口上加的@Select注解中编写SQL语句是没有提示的。 如果想让idea给我们提示对应的SQL语句,我们需要在IDEA中配置与MySQL数据库的链接。 + +默认我们在UserMapper接口上的@Select注解中编写SQL语句是没有提示的。如果想让idea给出提示,可以做如下配置: + +![image-20221210143348119](assets/image-20221210143348119.png) + +配置完成之后,发现SQL语句中的关键字有提示了,但还存在不识别表名(列名)的情况: + +![image-20221210143934318](assets/image-20221210143934318.png) + +> 产生原因:Idea和数据库没有建立连接,不识别表信息 +> +> 解决方案:在Idea中配置MySQL数据库连接 + +![image-20221210144139792](assets/image-20221210144139792.png) + +> 在配置的时候指定连接那个数据库,如上图所示连接的就是mybatis数据库。 + + + + + + + + + +## 2. JDBC介绍(了解) + +### 2.1 介绍 + +通过Mybatis的快速入门,我们明白了,通过Mybatis可以很方便的进行数据库的访问操作。但是大家要明白,其实java语言操作数据库呢,只能通过一种方式:使用sun公司提供的 JDBC 规范。 + +> Mybatis框架,就是对原始的JDBC程序的封装。 + +那到底什么是JDBC呢,接下来,我们就来介绍一下。 + +JDBC: ( Java DataBase Connectivity ),就是使用Java语言操作关系型数据库的一套API。 + +![image-20221210144811961](assets/image-20221210144811961.png) + + + +> 本质: +> +> - sun公司官方定义的一套操作所有关系型数据库的规范,即接口。 +> +> - 各个数据库厂商去实现这套接口,提供数据库驱动jar包。 +> +> - 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。 + + + +### 2.2 代码 + +下面我们看看原始的JDBC程序是如何操作数据库的。操作步骤如下: + +1. 注册驱动 +2. 获取连接对象 +3. 执行SQL语句,返回执行结果 +4. 处理执行结果 +5. 释放资源 + +> 在pom.xml文件中已引入MySQL驱动依赖,我们直接编写JDBC代码即可 + +JDBC具体代码实现: + +```java +import com.inmind.pojo.User; +import org.junit.jupiter.api.Test; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +public class JdbcTest { + @Test + public void testJdbc() throws Exception { + //1. 注册驱动 + Class.forName("com.mysql.cj.jdbc.Driver"); + + //2. 获取数据库连接 + String url="jdbc:mysql://127.0.0.1:3306/mybatis"; + String username = "root"; + String password = "1234"; + Connection connection = DriverManager.getConnection(url, username, password); + + //3. 执行SQL + Statement statement = connection.createStatement(); //操作SQL的对象 + String sql="select id,name,age,gender,phone from user"; + ResultSet rs = statement.executeQuery(sql);//SQL查询结果会封装在ResultSet对象中 + + List userList = new ArrayList<>();//集合对象(用于存储User对象) + //4. 处理SQL执行结果 + while (rs.next()){ + //取出一行记录中id、name、age、gender、phone下的数据 + int id = rs.getInt("id"); + String name = rs.getString("name"); + short age = rs.getShort("age"); + short gender = rs.getShort("gender"); + String phone = rs.getString("phone"); + //把一行记录中的数据,封装到User对象中 + User user = new User(id,name,age,gender,phone); + userList.add(user);//User对象添加到集合 + } + //5. 释放资源 + statement.close(); + connection.close(); + rs.close(); + + //遍历集合 + for (User user : userList) { + System.out.println(user); + } + } +} +``` + +> DriverManager(类):数据库驱动管理类。 +> +> - 作用: +> +> 1. 注册驱动 +> +> 2. 创建java代码和数据库之间的连接,即获取Connection对象 +> +> Connection(接口):建立数据库连接的对象 +> +> - 作用:用于建立java程序和数据库之间的连接 +> +> Statement(接口): 数据库操作对象(执行SQL语句的对象)。 +> +> - 作用:用于向数据库发送sql语句 +> +> ResultSet(接口):结果集对象(一张虚拟表) +> +> - 作用:sql查询语句的执行结果会封装在ResultSet中 + +通过上述代码,我们看到直接基于JDBC程序来操作数据库,代码实现非常繁琐,所以在项目开发中,我们很少使用。 在项目开发中,通常会使用Mybatis这类的高级技术来操作数据库,从而简化数据库操作、提高开发效率。 + + + +### 2.3 问题分析 + +原始的JDBC程序,存在以下几点问题: + +1. 数据库链接的四要素(驱动、链接、用户名、密码)全部硬编码在java代码中 +2. 查询结果的解析及封装非常繁琐 +3. 每一次查询数据库都需要获取连接,操作完毕后释放连接, 资源浪费, 性能降低 + +![image-20221210153407998](assets/image-20221210153407998.png) + + + +### 2.4 技术对比 + +分析了JDBC的缺点之后,我们再来看一下在mybatis中,是如何解决这些问题的: + +1. 数据库连接四要素(驱动、链接、用户名、密码),都配置在springboot默认的配置文件 application.properties中 + +2. 查询结果的解析及封装,由mybatis自动完成映射封装,我们无需关注 + +3. 在mybatis中使用了数据库连接池技术,从而避免了频繁的创建连接、销毁连接而带来的资源浪费。 + +![image-20221210154324151](assets/image-20221210154324151.png) + +> 使用SpringBoot+Mybatis的方式操作数据库,能够提升开发效率、降低资源浪费 + +而对于Mybatis来说,我们在开发持久层程序操作数据库时,需要重点关注以下两个方面: + +1. application.properties + + ~~~properties + #驱动类名称 + spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + #数据库连接的url + spring.datasource.url=jdbc:mysql://localhost:3306/mybatis + #连接数据库的用户名 + spring.datasource.username=root + #连接数据库的密码 + spring.datasource.password=1234 + ~~~ + +2. Mapper接口(编写SQL语句) + + ~~~java + @Mapper + public interface UserMapper { + @Select("select id, name, age, gender, phone from user") + public List list(); + } + ~~~ + + + + + + + +## 3. 数据库连接池 + +在前面我们所讲解的mybatis中,使用了数据库连接池技术,避免频繁的创建连接、销毁连接而带来的资源浪费。 + +下面我们就具体的了解下数据库连接池。 + +### 3.1 介绍 + +![image-20221210160341852](assets/image-20221210160341852.png) + +> 没有使用数据库连接池: +> +> - 客户端执行SQL语句:要先创建一个新的连接对象,然后执行SQL语句,SQL语句执行后又需要关闭连接对象从而释放资源,每次执行SQL时都需要创建连接、销毁链接,这种频繁的重复创建销毁的过程是比较耗费计算机的性能。 + +![image-20221210161016314](assets/image-20221210161016314.png) + +数据库连接池是个容器,负责分配、管理数据库连接(Connection) + +- 程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象 + +允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个 + +- 客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以复用) + +释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏 + +- 客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据库连接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池就会自动释放掉这个连接对象 + +数据库连接池的好处: + +1. 资源重用 +2. 提升系统响应速度 +3. 避免数据库连接遗漏 + + + + + +### 3.2 产品 + +要怎么样实现数据库连接池呢? + +- 官方(sun)提供了数据库连接池标准(javax.sql.DataSource接口) + + - 功能:获取连接 + + ~~~java + public Connection getConnection() throws SQLException; + ~~~ + + - 第三方组织必须按照DataSource接口实现 + +常见的数据库连接池: + +* C3P0 +* DBCP +* Druid +* Hikari (springboot默认) + +现在使用更多的是:Hikari、Druid (性能更优越) + +- Hikari(追光者) [默认的连接池] + +![image-20220901144923251](assets/image-20220901144923251.png) + +* Druid(德鲁伊) + + * Druid连接池是阿里巴巴开源的数据库连接池项目 + + * 功能强大,性能优秀,是Java语言最好的数据库连接池之一 + +​ + +如果我们想把默认的数据库连接池切换为Druid数据库连接池,只需要完成以下两步操作即可: + +> 参考官方地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter + +1. 在pom.xml文件中引入依赖 + +```xml + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + +``` + +2. 在application.properties中引入数据库连接配置 + +方式1: + +~~~properties +spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.druid.url=jdbc:mysql://localhost:3306/mybatis +spring.datasource.druid.username=root +spring.datasource.druid.password=1234 +~~~ + +方式2: + +~~~properties +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/mybatis +spring.datasource.username=root +spring.datasource.password=1234 +~~~ + + + + + + + + + +## 4. lombok + +### 4.1 介绍 + +Lombok是一个实用的Java类库,可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。 + +![image-20221210164641266](assets/image-20221210164641266.png) + +> 通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。 + +| **注解** | **作用** | +| ------------------- | ------------------------------------------------------------ | +| @Getter/@Setter | 为所有的属性提供get/set方法 | +| @ToString | 会给类自动生成易阅读的 toString 方法 | +| @EqualsAndHashCode | 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法 | +| @Data | 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode) | +| @NoArgsConstructor | 为实体类生成无参的构造器方法 | +| @AllArgsConstructor | 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。 | + + + +### 4.2 使用 + +第1步:在pom.xml文件中引入依赖 + +```xml + + + org.projectlombok + lombok + +``` + +第2步:在实体类上添加注解 + +```java +import lombok.Data; + +@Data +public class User { + private Integer id; + private String name; + private Short age; + private Short gender; + private String phone; +} +``` + +> 在实体类上添加了@Data注解,那么这个类在编译时期,就会生成getter/setter、equals、hashcode、toString等方法。 +> +> ![image-20221210170733921](assets/image-20221210170733921.png) + +说明:@Data注解中不包含全参构造方法,通常在实体类上,还会添加上:全参构造、无参构造 + +~~~java +import lombok.Data; + +@Data //getter方法、setter方法、toString方法、hashCode方法、equals方法 +@NoArgsConstructor //无参构造 +@AllArgsConstructor//全参构造 +public class User { + private Integer id; + private String name; + private Short age; + private Short gender; + private String phone; +} +~~~ + + + +Lombok的注意事项: + +- Lombok会在编译时,会自动生成对应的java代码 +- 在使用lombok时,还需要安装一个lombok的插件(新版本的IDEA中自带) + +![image-20221210165506359](assets/image-20221210165506359.png) + + + + + diff --git a/javaEE/day08/assets/image-20220901114951631.png b/javaEE/day08/assets/image-20220901114951631.png new file mode 100644 index 0000000..51e86dd Binary files /dev/null and b/javaEE/day08/assets/image-20220901114951631.png differ diff --git a/javaEE/day08/assets/image-20220901121116813.png b/javaEE/day08/assets/image-20220901121116813.png new file mode 100644 index 0000000..7b63790 Binary files /dev/null and b/javaEE/day08/assets/image-20220901121116813.png differ diff --git a/javaEE/day08/assets/image-20220901144923251.png b/javaEE/day08/assets/image-20220901144923251.png new file mode 100644 index 0000000..81d9f3d Binary files /dev/null and b/javaEE/day08/assets/image-20220901144923251.png differ diff --git a/javaEE/day08/assets/image-20221209155704203.png b/javaEE/day08/assets/image-20221209155704203.png new file mode 100644 index 0000000..1bd2d33 Binary files /dev/null and b/javaEE/day08/assets/image-20221209155704203.png differ diff --git a/javaEE/day08/assets/image-20221209155904370.png b/javaEE/day08/assets/image-20221209155904370.png new file mode 100644 index 0000000..705b52f Binary files /dev/null and b/javaEE/day08/assets/image-20221209155904370.png differ diff --git a/javaEE/day08/assets/image-20221209161623051.png b/javaEE/day08/assets/image-20221209161623051.png new file mode 100644 index 0000000..056f1dd Binary files /dev/null and b/javaEE/day08/assets/image-20221209161623051.png differ diff --git a/javaEE/day08/assets/image-20221209162827242.png b/javaEE/day08/assets/image-20221209162827242.png new file mode 100644 index 0000000..a081eb8 Binary files /dev/null and b/javaEE/day08/assets/image-20221209162827242.png differ diff --git a/javaEE/day08/assets/image-20221209163123443.png b/javaEE/day08/assets/image-20221209163123443.png new file mode 100644 index 0000000..c9fde7b Binary files /dev/null and b/javaEE/day08/assets/image-20221209163123443.png differ diff --git a/javaEE/day08/assets/image-20221209170354143.png b/javaEE/day08/assets/image-20221209170354143.png new file mode 100644 index 0000000..35b457a Binary files /dev/null and b/javaEE/day08/assets/image-20221209170354143.png differ diff --git a/javaEE/day08/assets/image-20221209172527630.png b/javaEE/day08/assets/image-20221209172527630.png new file mode 100644 index 0000000..428b65e Binary files /dev/null and b/javaEE/day08/assets/image-20221209172527630.png differ diff --git a/javaEE/day08/assets/image-20221209175843651.png b/javaEE/day08/assets/image-20221209175843651.png new file mode 100644 index 0000000..29b345b Binary files /dev/null and b/javaEE/day08/assets/image-20221209175843651.png differ diff --git a/javaEE/day08/assets/image-20221210143348119.png b/javaEE/day08/assets/image-20221210143348119.png new file mode 100644 index 0000000..7fd904f Binary files /dev/null and b/javaEE/day08/assets/image-20221210143348119.png differ diff --git a/javaEE/day08/assets/image-20221210143934318.png b/javaEE/day08/assets/image-20221210143934318.png new file mode 100644 index 0000000..66ce246 Binary files /dev/null and b/javaEE/day08/assets/image-20221210143934318.png differ diff --git a/javaEE/day08/assets/image-20221210144139792.png b/javaEE/day08/assets/image-20221210144139792.png new file mode 100644 index 0000000..4913cd9 Binary files /dev/null and b/javaEE/day08/assets/image-20221210144139792.png differ diff --git a/javaEE/day08/assets/image-20221210144811961.png b/javaEE/day08/assets/image-20221210144811961.png new file mode 100644 index 0000000..c74c505 Binary files /dev/null and b/javaEE/day08/assets/image-20221210144811961.png differ diff --git a/javaEE/day08/assets/image-20221210153407998.png b/javaEE/day08/assets/image-20221210153407998.png new file mode 100644 index 0000000..f72ec8f Binary files /dev/null and b/javaEE/day08/assets/image-20221210153407998.png differ diff --git a/javaEE/day08/assets/image-20221210154324151.png b/javaEE/day08/assets/image-20221210154324151.png new file mode 100644 index 0000000..a032512 Binary files /dev/null and b/javaEE/day08/assets/image-20221210154324151.png differ diff --git a/javaEE/day08/assets/image-20221210160341852.png b/javaEE/day08/assets/image-20221210160341852.png new file mode 100644 index 0000000..161ea28 Binary files /dev/null and b/javaEE/day08/assets/image-20221210160341852.png differ diff --git a/javaEE/day08/assets/image-20221210161016314.png b/javaEE/day08/assets/image-20221210161016314.png new file mode 100644 index 0000000..8765451 Binary files /dev/null and b/javaEE/day08/assets/image-20221210161016314.png differ diff --git a/javaEE/day08/assets/image-20221210164641266.png b/javaEE/day08/assets/image-20221210164641266.png new file mode 100644 index 0000000..6c593ab Binary files /dev/null and b/javaEE/day08/assets/image-20221210164641266.png differ diff --git a/javaEE/day08/assets/image-20221210165506359.png b/javaEE/day08/assets/image-20221210165506359.png new file mode 100644 index 0000000..c649cc3 Binary files /dev/null and b/javaEE/day08/assets/image-20221210165506359.png differ diff --git a/javaEE/day08/assets/image-20221210170733921.png b/javaEE/day08/assets/image-20221210170733921.png new file mode 100644 index 0000000..543d0f0 Binary files /dev/null and b/javaEE/day08/assets/image-20221210170733921.png differ diff --git a/javaEE/day08/img/1550291804592.png b/javaEE/day08/img/1550291804592.png new file mode 100644 index 0000000..93f5339 Binary files /dev/null and b/javaEE/day08/img/1550291804592.png differ diff --git a/javaEE/day08/img/1550322481022.png b/javaEE/day08/img/1550322481022.png new file mode 100644 index 0000000..207b7b9 Binary files /dev/null and b/javaEE/day08/img/1550322481022.png differ diff --git a/javaEE/day08/img/1551413050280.png b/javaEE/day08/img/1551413050280.png new file mode 100644 index 0000000..828ef7e Binary files /dev/null and b/javaEE/day08/img/1551413050280.png differ diff --git a/javaEE/day08/img/1551413102060.png b/javaEE/day08/img/1551413102060.png new file mode 100644 index 0000000..5fc898b Binary files /dev/null and b/javaEE/day08/img/1551413102060.png differ diff --git a/javaEE/day08/img/1551413219763.png b/javaEE/day08/img/1551413219763.png new file mode 100644 index 0000000..af6fe3f Binary files /dev/null and b/javaEE/day08/img/1551413219763.png differ diff --git a/javaEE/day08/img/1551413309793.png b/javaEE/day08/img/1551413309793.png new file mode 100644 index 0000000..a3d5c24 Binary files /dev/null and b/javaEE/day08/img/1551413309793.png differ diff --git a/javaEE/day08/img/1对1.png b/javaEE/day08/img/1对1.png new file mode 100644 index 0000000..9c18854 Binary files /dev/null and b/javaEE/day08/img/1对1.png differ diff --git a/javaEE/day08/img/1对12.png b/javaEE/day08/img/1对12.png new file mode 100644 index 0000000..63cb588 Binary files /dev/null and b/javaEE/day08/img/1对12.png differ diff --git a/javaEE/day08/img/1对多练习01.png b/javaEE/day08/img/1对多练习01.png new file mode 100644 index 0000000..97c5f93 Binary files /dev/null and b/javaEE/day08/img/1对多练习01.png differ diff --git a/javaEE/day08/img/1对多练习02.png b/javaEE/day08/img/1对多练习02.png new file mode 100644 index 0000000..ea5cc6f Binary files /dev/null and b/javaEE/day08/img/1对多练习02.png differ diff --git a/javaEE/day08/img/1对多练习03.png b/javaEE/day08/img/1对多练习03.png new file mode 100644 index 0000000..4980761 Binary files /dev/null and b/javaEE/day08/img/1对多练习03.png differ diff --git a/javaEE/day08/img/DCL01.png b/javaEE/day08/img/DCL01.png new file mode 100644 index 0000000..5163cce Binary files /dev/null and b/javaEE/day08/img/DCL01.png differ diff --git a/javaEE/day08/img/DCL02.png b/javaEE/day08/img/DCL02.png new file mode 100644 index 0000000..2ed78f8 Binary files /dev/null and b/javaEE/day08/img/DCL02.png differ diff --git a/javaEE/day08/img/DCL03.png b/javaEE/day08/img/DCL03.png new file mode 100644 index 0000000..2df945c Binary files /dev/null and b/javaEE/day08/img/DCL03.png differ diff --git a/javaEE/day08/img/DCL04.png b/javaEE/day08/img/DCL04.png new file mode 100644 index 0000000..165868c Binary files /dev/null and b/javaEE/day08/img/DCL04.png differ diff --git a/javaEE/day08/img/DCL05.png b/javaEE/day08/img/DCL05.png new file mode 100644 index 0000000..ca5fa66 Binary files /dev/null and b/javaEE/day08/img/DCL05.png differ diff --git a/javaEE/day08/img/DCL06.png b/javaEE/day08/img/DCL06.png new file mode 100644 index 0000000..07c7c6d Binary files /dev/null and b/javaEE/day08/img/DCL06.png differ diff --git a/javaEE/day08/img/DCL07.png b/javaEE/day08/img/DCL07.png new file mode 100644 index 0000000..556aa51 Binary files /dev/null and b/javaEE/day08/img/DCL07.png differ diff --git a/javaEE/day08/img/DCL08.png b/javaEE/day08/img/DCL08.png new file mode 100644 index 0000000..669af04 Binary files /dev/null and b/javaEE/day08/img/DCL08.png differ diff --git a/javaEE/day08/img/DCL09.png b/javaEE/day08/img/DCL09.png new file mode 100644 index 0000000..d370ba5 Binary files /dev/null and b/javaEE/day08/img/DCL09.png differ diff --git a/javaEE/day08/img/ifnull01.png b/javaEE/day08/img/ifnull01.png new file mode 100644 index 0000000..9cfb64f Binary files /dev/null and b/javaEE/day08/img/ifnull01.png differ diff --git a/javaEE/day08/img/ifnull02.png b/javaEE/day08/img/ifnull02.png new file mode 100644 index 0000000..dccc0bf Binary files /dev/null and b/javaEE/day08/img/ifnull02.png differ diff --git a/javaEE/day08/img/limit01.png b/javaEE/day08/img/limit01.png new file mode 100644 index 0000000..310b84d Binary files /dev/null and b/javaEE/day08/img/limit01.png differ diff --git a/javaEE/day08/img/limit02.png b/javaEE/day08/img/limit02.png new file mode 100644 index 0000000..76339ac Binary files /dev/null and b/javaEE/day08/img/limit02.png differ diff --git a/javaEE/day08/img/limit03.png b/javaEE/day08/img/limit03.png new file mode 100644 index 0000000..716f6a1 Binary files /dev/null and b/javaEE/day08/img/limit03.png differ diff --git a/javaEE/day08/img/orderby01.png b/javaEE/day08/img/orderby01.png new file mode 100644 index 0000000..4009521 Binary files /dev/null and b/javaEE/day08/img/orderby01.png differ diff --git a/javaEE/day08/img/orderby02.png b/javaEE/day08/img/orderby02.png new file mode 100644 index 0000000..7cb94c8 Binary files /dev/null and b/javaEE/day08/img/orderby02.png differ diff --git a/javaEE/day08/img/where查询01.png b/javaEE/day08/img/where查询01.png new file mode 100644 index 0000000..0fd7703 Binary files /dev/null and b/javaEE/day08/img/where查询01.png differ diff --git a/javaEE/day08/img/where查询02.png b/javaEE/day08/img/where查询02.png new file mode 100644 index 0000000..a8cae11 Binary files /dev/null and b/javaEE/day08/img/where查询02.png differ diff --git a/javaEE/day08/img/where查询03.png b/javaEE/day08/img/where查询03.png new file mode 100644 index 0000000..30c6a91 Binary files /dev/null and b/javaEE/day08/img/where查询03.png differ diff --git a/javaEE/day08/img/where查询04.png b/javaEE/day08/img/where查询04.png new file mode 100644 index 0000000..f220601 Binary files /dev/null and b/javaEE/day08/img/where查询04.png differ diff --git a/javaEE/day08/img/where查询05.png b/javaEE/day08/img/where查询05.png new file mode 100644 index 0000000..b59154b Binary files /dev/null and b/javaEE/day08/img/where查询05.png differ diff --git a/javaEE/day08/img/where查询06.png b/javaEE/day08/img/where查询06.png new file mode 100644 index 0000000..f2cc38f Binary files /dev/null and b/javaEE/day08/img/where查询06.png differ diff --git a/javaEE/day08/img/where查询07.png b/javaEE/day08/img/where查询07.png new file mode 100644 index 0000000..913c584 Binary files /dev/null and b/javaEE/day08/img/where查询07.png differ diff --git a/javaEE/day08/img/where查询08.png b/javaEE/day08/img/where查询08.png new file mode 100644 index 0000000..2028ff6 Binary files /dev/null and b/javaEE/day08/img/where查询08.png differ diff --git a/javaEE/day08/img/where查询09.png b/javaEE/day08/img/where查询09.png new file mode 100644 index 0000000..bce9586 Binary files /dev/null and b/javaEE/day08/img/where查询09.png differ diff --git a/javaEE/day08/img/where查询10.png b/javaEE/day08/img/where查询10.png new file mode 100644 index 0000000..15fdd6e Binary files /dev/null and b/javaEE/day08/img/where查询10.png differ diff --git a/javaEE/day08/img/where查询11.png b/javaEE/day08/img/where查询11.png new file mode 100644 index 0000000..c02517f Binary files /dev/null and b/javaEE/day08/img/where查询11.png differ diff --git a/javaEE/day08/img/where查询12.png b/javaEE/day08/img/where查询12.png new file mode 100644 index 0000000..d7b1b60 Binary files /dev/null and b/javaEE/day08/img/where查询12.png differ diff --git a/javaEE/day08/img/一对多.png b/javaEE/day08/img/一对多.png new file mode 100644 index 0000000..0b6ee01 Binary files /dev/null and b/javaEE/day08/img/一对多.png differ diff --git a/javaEE/day08/img/主键01.png b/javaEE/day08/img/主键01.png new file mode 100644 index 0000000..ccb613e Binary files /dev/null and b/javaEE/day08/img/主键01.png differ diff --git a/javaEE/day08/img/主键02.png b/javaEE/day08/img/主键02.png new file mode 100644 index 0000000..0aa553f Binary files /dev/null and b/javaEE/day08/img/主键02.png differ diff --git a/javaEE/day08/img/主键03.png b/javaEE/day08/img/主键03.png new file mode 100644 index 0000000..12c1ff1 Binary files /dev/null and b/javaEE/day08/img/主键03.png differ diff --git a/javaEE/day08/img/主键04.png b/javaEE/day08/img/主键04.png new file mode 100644 index 0000000..a5f1a5f Binary files /dev/null and b/javaEE/day08/img/主键04.png differ diff --git a/javaEE/day08/img/主键05.png b/javaEE/day08/img/主键05.png new file mode 100644 index 0000000..ff6ee94 Binary files /dev/null and b/javaEE/day08/img/主键05.png differ diff --git a/javaEE/day08/img/主键06.png b/javaEE/day08/img/主键06.png new file mode 100644 index 0000000..9597934 Binary files /dev/null and b/javaEE/day08/img/主键06.png differ diff --git a/javaEE/day08/img/主键07.png b/javaEE/day08/img/主键07.png new file mode 100644 index 0000000..215ef20 Binary files /dev/null and b/javaEE/day08/img/主键07.png differ diff --git a/javaEE/day08/img/事务01.PNG b/javaEE/day08/img/事务01.PNG new file mode 100644 index 0000000..b98bfab Binary files /dev/null and b/javaEE/day08/img/事务01.PNG differ diff --git a/javaEE/day08/img/事务02.PNG b/javaEE/day08/img/事务02.PNG new file mode 100644 index 0000000..7e8d6cb Binary files /dev/null and b/javaEE/day08/img/事务02.PNG differ diff --git a/javaEE/day08/img/事务03.PNG b/javaEE/day08/img/事务03.PNG new file mode 100644 index 0000000..396eb7e Binary files /dev/null and b/javaEE/day08/img/事务03.PNG differ diff --git a/javaEE/day08/img/事务04.png b/javaEE/day08/img/事务04.png new file mode 100644 index 0000000..1e5ff59 Binary files /dev/null and b/javaEE/day08/img/事务04.png differ diff --git a/javaEE/day08/img/事务05.png b/javaEE/day08/img/事务05.png new file mode 100644 index 0000000..5dd29d1 Binary files /dev/null and b/javaEE/day08/img/事务05.png differ diff --git a/javaEE/day08/img/事务06.png b/javaEE/day08/img/事务06.png new file mode 100644 index 0000000..1c6b1c0 Binary files /dev/null and b/javaEE/day08/img/事务06.png differ diff --git a/javaEE/day08/img/事务07.png b/javaEE/day08/img/事务07.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day08/img/事务07.png differ diff --git a/javaEE/day08/img/事务08.png b/javaEE/day08/img/事务08.png new file mode 100644 index 0000000..944a040 Binary files /dev/null and b/javaEE/day08/img/事务08.png differ diff --git a/javaEE/day08/img/事务09.png b/javaEE/day08/img/事务09.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day08/img/事务09.png differ diff --git a/javaEE/day08/img/事务10.png b/javaEE/day08/img/事务10.png new file mode 100644 index 0000000..8b14e4b Binary files /dev/null and b/javaEE/day08/img/事务10.png differ diff --git a/javaEE/day08/img/事务11.png b/javaEE/day08/img/事务11.png new file mode 100644 index 0000000..64e8919 Binary files /dev/null and b/javaEE/day08/img/事务11.png differ diff --git a/javaEE/day08/img/事务12.png b/javaEE/day08/img/事务12.png new file mode 100644 index 0000000..daa81e3 Binary files /dev/null and b/javaEE/day08/img/事务12.png differ diff --git a/javaEE/day08/img/事务13.png b/javaEE/day08/img/事务13.png new file mode 100644 index 0000000..c8ca875 Binary files /dev/null and b/javaEE/day08/img/事务13.png differ diff --git a/javaEE/day08/img/事务14.png b/javaEE/day08/img/事务14.png new file mode 100644 index 0000000..0de1c72 Binary files /dev/null and b/javaEE/day08/img/事务14.png differ diff --git a/javaEE/day08/img/事务15.png b/javaEE/day08/img/事务15.png new file mode 100644 index 0000000..16c4683 Binary files /dev/null and b/javaEE/day08/img/事务15.png differ diff --git a/javaEE/day08/img/事务16.png b/javaEE/day08/img/事务16.png new file mode 100644 index 0000000..396eb7e Binary files /dev/null and b/javaEE/day08/img/事务16.png differ diff --git a/javaEE/day08/img/事务17.png b/javaEE/day08/img/事务17.png new file mode 100644 index 0000000..1e5ff59 Binary files /dev/null and b/javaEE/day08/img/事务17.png differ diff --git a/javaEE/day08/img/事务18.png b/javaEE/day08/img/事务18.png new file mode 100644 index 0000000..03c7d40 Binary files /dev/null and b/javaEE/day08/img/事务18.png differ diff --git a/javaEE/day08/img/事务19.png b/javaEE/day08/img/事务19.png new file mode 100644 index 0000000..f610922 Binary files /dev/null and b/javaEE/day08/img/事务19.png differ diff --git a/javaEE/day08/img/事务20.png b/javaEE/day08/img/事务20.png new file mode 100644 index 0000000..455b5e7 Binary files /dev/null and b/javaEE/day08/img/事务20.png differ diff --git a/javaEE/day08/img/事务21.png b/javaEE/day08/img/事务21.png new file mode 100644 index 0000000..76de958 Binary files /dev/null and b/javaEE/day08/img/事务21.png differ diff --git a/javaEE/day08/img/事务22.png b/javaEE/day08/img/事务22.png new file mode 100644 index 0000000..166a40b Binary files /dev/null and b/javaEE/day08/img/事务22.png differ diff --git a/javaEE/day08/img/事务23.png b/javaEE/day08/img/事务23.png new file mode 100644 index 0000000..e2065d5 Binary files /dev/null and b/javaEE/day08/img/事务23.png differ diff --git a/javaEE/day08/img/事务24.png b/javaEE/day08/img/事务24.png new file mode 100644 index 0000000..6a20f27 Binary files /dev/null and b/javaEE/day08/img/事务24.png differ diff --git a/javaEE/day08/img/事务25.png b/javaEE/day08/img/事务25.png new file mode 100644 index 0000000..296f285 Binary files /dev/null and b/javaEE/day08/img/事务25.png differ diff --git a/javaEE/day08/img/事务26.png b/javaEE/day08/img/事务26.png new file mode 100644 index 0000000..e847aec Binary files /dev/null and b/javaEE/day08/img/事务26.png differ diff --git a/javaEE/day08/img/事务27.png b/javaEE/day08/img/事务27.png new file mode 100644 index 0000000..f1204df Binary files /dev/null and b/javaEE/day08/img/事务27.png differ diff --git a/javaEE/day08/img/事务28.png b/javaEE/day08/img/事务28.png new file mode 100644 index 0000000..a08694c Binary files /dev/null and b/javaEE/day08/img/事务28.png differ diff --git a/javaEE/day08/img/事务29.png b/javaEE/day08/img/事务29.png new file mode 100644 index 0000000..0ed2184 Binary files /dev/null and b/javaEE/day08/img/事务29.png differ diff --git a/javaEE/day08/img/事务30.png b/javaEE/day08/img/事务30.png new file mode 100644 index 0000000..95b8d75 Binary files /dev/null and b/javaEE/day08/img/事务30.png differ diff --git a/javaEE/day08/img/事务31.png b/javaEE/day08/img/事务31.png new file mode 100644 index 0000000..4472d04 Binary files /dev/null and b/javaEE/day08/img/事务31.png differ diff --git a/javaEE/day08/img/事务32.png b/javaEE/day08/img/事务32.png new file mode 100644 index 0000000..b50bed8 Binary files /dev/null and b/javaEE/day08/img/事务32.png differ diff --git a/javaEE/day08/img/事务33.png b/javaEE/day08/img/事务33.png new file mode 100644 index 0000000..14b4f03 Binary files /dev/null and b/javaEE/day08/img/事务33.png differ diff --git a/javaEE/day08/img/事务34.png b/javaEE/day08/img/事务34.png new file mode 100644 index 0000000..95c0471 Binary files /dev/null and b/javaEE/day08/img/事务34.png differ diff --git a/javaEE/day08/img/事务35.png b/javaEE/day08/img/事务35.png new file mode 100644 index 0000000..622d16b Binary files /dev/null and b/javaEE/day08/img/事务35.png differ diff --git a/javaEE/day08/img/事务36.png b/javaEE/day08/img/事务36.png new file mode 100644 index 0000000..e227228 Binary files /dev/null and b/javaEE/day08/img/事务36.png differ diff --git a/javaEE/day08/img/事务37.png b/javaEE/day08/img/事务37.png new file mode 100644 index 0000000..14bba1d Binary files /dev/null and b/javaEE/day08/img/事务37.png differ diff --git a/javaEE/day08/img/事务38.png b/javaEE/day08/img/事务38.png new file mode 100644 index 0000000..012610a Binary files /dev/null and b/javaEE/day08/img/事务38.png differ diff --git a/javaEE/day08/img/事务39.png b/javaEE/day08/img/事务39.png new file mode 100644 index 0000000..35f2d7f Binary files /dev/null and b/javaEE/day08/img/事务39.png differ diff --git a/javaEE/day08/img/事务40.png b/javaEE/day08/img/事务40.png new file mode 100644 index 0000000..95a8934 Binary files /dev/null and b/javaEE/day08/img/事务40.png differ diff --git a/javaEE/day08/img/事务41.png b/javaEE/day08/img/事务41.png new file mode 100644 index 0000000..6fa0a67 Binary files /dev/null and b/javaEE/day08/img/事务41.png differ diff --git a/javaEE/day08/img/事务42.png b/javaEE/day08/img/事务42.png new file mode 100644 index 0000000..9c8ecbf Binary files /dev/null and b/javaEE/day08/img/事务42.png differ diff --git a/javaEE/day08/img/事务43.png b/javaEE/day08/img/事务43.png new file mode 100644 index 0000000..4893409 Binary files /dev/null and b/javaEE/day08/img/事务43.png differ diff --git a/javaEE/day08/img/事务44.png b/javaEE/day08/img/事务44.png new file mode 100644 index 0000000..f9e33f3 Binary files /dev/null and b/javaEE/day08/img/事务44.png differ diff --git a/javaEE/day08/img/事务45.png b/javaEE/day08/img/事务45.png new file mode 100644 index 0000000..1ddda85 Binary files /dev/null and b/javaEE/day08/img/事务45.png differ diff --git a/javaEE/day08/img/事务46.png b/javaEE/day08/img/事务46.png new file mode 100644 index 0000000..3cf7bd3 Binary files /dev/null and b/javaEE/day08/img/事务46.png differ diff --git a/javaEE/day08/img/事务47.png b/javaEE/day08/img/事务47.png new file mode 100644 index 0000000..dafa871 Binary files /dev/null and b/javaEE/day08/img/事务47.png differ diff --git a/javaEE/day08/img/事务48.png b/javaEE/day08/img/事务48.png new file mode 100644 index 0000000..d96862d Binary files /dev/null and b/javaEE/day08/img/事务48.png differ diff --git a/javaEE/day08/img/事务49.png b/javaEE/day08/img/事务49.png new file mode 100644 index 0000000..5fa3b98 Binary files /dev/null and b/javaEE/day08/img/事务49.png differ diff --git a/javaEE/day08/img/事务50.png b/javaEE/day08/img/事务50.png new file mode 100644 index 0000000..4e92355 Binary files /dev/null and b/javaEE/day08/img/事务50.png differ diff --git a/javaEE/day08/img/事务51.png b/javaEE/day08/img/事务51.png new file mode 100644 index 0000000..462407d Binary files /dev/null and b/javaEE/day08/img/事务51.png differ diff --git a/javaEE/day08/img/事务52.png b/javaEE/day08/img/事务52.png new file mode 100644 index 0000000..8e08da1 Binary files /dev/null and b/javaEE/day08/img/事务52.png differ diff --git a/javaEE/day08/img/事务53.png b/javaEE/day08/img/事务53.png new file mode 100644 index 0000000..0740b6f Binary files /dev/null and b/javaEE/day08/img/事务53.png differ diff --git a/javaEE/day08/img/事务54.png b/javaEE/day08/img/事务54.png new file mode 100644 index 0000000..f68a652 Binary files /dev/null and b/javaEE/day08/img/事务54.png differ diff --git a/javaEE/day08/img/事务55.png b/javaEE/day08/img/事务55.png new file mode 100644 index 0000000..5a12dc1 Binary files /dev/null and b/javaEE/day08/img/事务55.png differ diff --git a/javaEE/day08/img/事务56.png b/javaEE/day08/img/事务56.png new file mode 100644 index 0000000..b53b40c Binary files /dev/null and b/javaEE/day08/img/事务56.png differ diff --git a/javaEE/day08/img/事务57.png b/javaEE/day08/img/事务57.png new file mode 100644 index 0000000..a51708b Binary files /dev/null and b/javaEE/day08/img/事务57.png differ diff --git a/javaEE/day08/img/事务58.png b/javaEE/day08/img/事务58.png new file mode 100644 index 0000000..2fbf971 Binary files /dev/null and b/javaEE/day08/img/事务58.png differ diff --git a/javaEE/day08/img/事务59.png b/javaEE/day08/img/事务59.png new file mode 100644 index 0000000..7f20925 Binary files /dev/null and b/javaEE/day08/img/事务59.png differ diff --git a/javaEE/day08/img/事务60.png b/javaEE/day08/img/事务60.png new file mode 100644 index 0000000..b6ebebd Binary files /dev/null and b/javaEE/day08/img/事务60.png differ diff --git a/javaEE/day08/img/分组01.png b/javaEE/day08/img/分组01.png new file mode 100644 index 0000000..fd55a36 Binary files /dev/null and b/javaEE/day08/img/分组01.png differ diff --git a/javaEE/day08/img/分组02.png b/javaEE/day08/img/分组02.png new file mode 100644 index 0000000..6a641f0 Binary files /dev/null and b/javaEE/day08/img/分组02.png differ diff --git a/javaEE/day08/img/分组03.png b/javaEE/day08/img/分组03.png new file mode 100644 index 0000000..97eeb4e Binary files /dev/null and b/javaEE/day08/img/分组03.png differ diff --git a/javaEE/day08/img/分组04.png b/javaEE/day08/img/分组04.png new file mode 100644 index 0000000..948542d Binary files /dev/null and b/javaEE/day08/img/分组04.png differ diff --git a/javaEE/day08/img/分组05.png b/javaEE/day08/img/分组05.png new file mode 100644 index 0000000..400d98d Binary files /dev/null and b/javaEE/day08/img/分组05.png differ diff --git a/javaEE/day08/img/分组06.png b/javaEE/day08/img/分组06.png new file mode 100644 index 0000000..978e04c Binary files /dev/null and b/javaEE/day08/img/分组06.png differ diff --git a/javaEE/day08/img/分组07.png b/javaEE/day08/img/分组07.png new file mode 100644 index 0000000..b11bba2 Binary files /dev/null and b/javaEE/day08/img/分组07.png differ diff --git a/javaEE/day08/img/分组08.png b/javaEE/day08/img/分组08.png new file mode 100644 index 0000000..fd3aaa7 Binary files /dev/null and b/javaEE/day08/img/分组08.png differ diff --git a/javaEE/day08/img/分组09.png b/javaEE/day08/img/分组09.png new file mode 100644 index 0000000..57c2b32 Binary files /dev/null and b/javaEE/day08/img/分组09.png differ diff --git a/javaEE/day08/img/外键01.png b/javaEE/day08/img/外键01.png new file mode 100644 index 0000000..fbf414a Binary files /dev/null and b/javaEE/day08/img/外键01.png differ diff --git a/javaEE/day08/img/外键02.png b/javaEE/day08/img/外键02.png new file mode 100644 index 0000000..9426f4b Binary files /dev/null and b/javaEE/day08/img/外键02.png differ diff --git a/javaEE/day08/img/外键03.png b/javaEE/day08/img/外键03.png new file mode 100644 index 0000000..767bba8 Binary files /dev/null and b/javaEE/day08/img/外键03.png differ diff --git a/javaEE/day08/img/外键04.png b/javaEE/day08/img/外键04.png new file mode 100644 index 0000000..17d26c3 Binary files /dev/null and b/javaEE/day08/img/外键04.png differ diff --git a/javaEE/day08/img/多对多.png b/javaEE/day08/img/多对多.png new file mode 100644 index 0000000..123f5a5 Binary files /dev/null and b/javaEE/day08/img/多对多.png differ diff --git a/javaEE/day08/img/多对多练习01.png b/javaEE/day08/img/多对多练习01.png new file mode 100644 index 0000000..a3c45ac Binary files /dev/null and b/javaEE/day08/img/多对多练习01.png differ diff --git a/javaEE/day08/img/多对多练习02.png b/javaEE/day08/img/多对多练习02.png new file mode 100644 index 0000000..fe60244 Binary files /dev/null and b/javaEE/day08/img/多对多练习02.png differ diff --git a/javaEE/day08/img/多对多练习03.png b/javaEE/day08/img/多对多练习03.png new file mode 100644 index 0000000..e499fab Binary files /dev/null and b/javaEE/day08/img/多对多练习03.png differ diff --git a/javaEE/day08/img/多表查询01.png b/javaEE/day08/img/多表查询01.png new file mode 100644 index 0000000..18276ba Binary files /dev/null and b/javaEE/day08/img/多表查询01.png differ diff --git a/javaEE/day08/img/多表查询02.png b/javaEE/day08/img/多表查询02.png new file mode 100644 index 0000000..88f6049 Binary files /dev/null and b/javaEE/day08/img/多表查询02.png differ diff --git a/javaEE/day08/img/多表查询03.png b/javaEE/day08/img/多表查询03.png new file mode 100644 index 0000000..3eb80f6 Binary files /dev/null and b/javaEE/day08/img/多表查询03.png differ diff --git a/javaEE/day08/img/多表查询04.png b/javaEE/day08/img/多表查询04.png new file mode 100644 index 0000000..b0e4295 Binary files /dev/null and b/javaEE/day08/img/多表查询04.png differ diff --git a/javaEE/day08/img/多表查询05.png b/javaEE/day08/img/多表查询05.png new file mode 100644 index 0000000..62642a1 Binary files /dev/null and b/javaEE/day08/img/多表查询05.png differ diff --git a/javaEE/day08/img/多表查询06.png b/javaEE/day08/img/多表查询06.png new file mode 100644 index 0000000..e1a12e5 Binary files /dev/null and b/javaEE/day08/img/多表查询06.png differ diff --git a/javaEE/day08/img/多表查询07.png b/javaEE/day08/img/多表查询07.png new file mode 100644 index 0000000..7b9a1a1 Binary files /dev/null and b/javaEE/day08/img/多表查询07.png differ diff --git a/javaEE/day08/img/多表查询08.png b/javaEE/day08/img/多表查询08.png new file mode 100644 index 0000000..b6e217e Binary files /dev/null and b/javaEE/day08/img/多表查询08.png differ diff --git a/javaEE/day08/img/多表查询09.png b/javaEE/day08/img/多表查询09.png new file mode 100644 index 0000000..1db828e Binary files /dev/null and b/javaEE/day08/img/多表查询09.png differ diff --git a/javaEE/day08/img/多表查询10.png b/javaEE/day08/img/多表查询10.png new file mode 100644 index 0000000..3b8b950 Binary files /dev/null and b/javaEE/day08/img/多表查询10.png differ diff --git a/javaEE/day08/img/多表查询11.png b/javaEE/day08/img/多表查询11.png new file mode 100644 index 0000000..192e4a1 Binary files /dev/null and b/javaEE/day08/img/多表查询11.png differ diff --git a/javaEE/day08/img/多表查询12.png b/javaEE/day08/img/多表查询12.png new file mode 100644 index 0000000..079d92a Binary files /dev/null and b/javaEE/day08/img/多表查询12.png differ diff --git a/javaEE/day08/img/多表查询13.png b/javaEE/day08/img/多表查询13.png new file mode 100644 index 0000000..cfc6de9 Binary files /dev/null and b/javaEE/day08/img/多表查询13.png differ diff --git a/javaEE/day08/img/多表查询14.png b/javaEE/day08/img/多表查询14.png new file mode 100644 index 0000000..46ac5b9 Binary files /dev/null and b/javaEE/day08/img/多表查询14.png differ diff --git a/javaEE/day08/img/多表查询15.png b/javaEE/day08/img/多表查询15.png new file mode 100644 index 0000000..2a4df7f Binary files /dev/null and b/javaEE/day08/img/多表查询15.png differ diff --git a/javaEE/day08/img/多表查询16.png b/javaEE/day08/img/多表查询16.png new file mode 100644 index 0000000..4f914ca Binary files /dev/null and b/javaEE/day08/img/多表查询16.png differ diff --git a/javaEE/day08/img/多表查询17.png b/javaEE/day08/img/多表查询17.png new file mode 100644 index 0000000..3bb4ec3 Binary files /dev/null and b/javaEE/day08/img/多表查询17.png differ diff --git a/javaEE/day08/img/多表查询18.png b/javaEE/day08/img/多表查询18.png new file mode 100644 index 0000000..48acb19 Binary files /dev/null and b/javaEE/day08/img/多表查询18.png differ diff --git a/javaEE/day08/img/多表查询19.png b/javaEE/day08/img/多表查询19.png new file mode 100644 index 0000000..f005b2a Binary files /dev/null and b/javaEE/day08/img/多表查询19.png differ diff --git a/javaEE/day08/img/多表查询20.png b/javaEE/day08/img/多表查询20.png new file mode 100644 index 0000000..28f163c Binary files /dev/null and b/javaEE/day08/img/多表查询20.png differ diff --git a/javaEE/day08/img/多表查询21.png b/javaEE/day08/img/多表查询21.png new file mode 100644 index 0000000..b118945 Binary files /dev/null and b/javaEE/day08/img/多表查询21.png differ diff --git a/javaEE/day08/img/多表查询22.png b/javaEE/day08/img/多表查询22.png new file mode 100644 index 0000000..d7859d8 Binary files /dev/null and b/javaEE/day08/img/多表查询22.png differ diff --git a/javaEE/day08/img/多表查询23.png b/javaEE/day08/img/多表查询23.png new file mode 100644 index 0000000..ee99716 Binary files /dev/null and b/javaEE/day08/img/多表查询23.png differ diff --git a/javaEE/day08/img/多表查询24.png b/javaEE/day08/img/多表查询24.png new file mode 100644 index 0000000..ffd1590 Binary files /dev/null and b/javaEE/day08/img/多表查询24.png differ diff --git a/javaEE/day08/img/多表查询25.png b/javaEE/day08/img/多表查询25.png new file mode 100644 index 0000000..7f7b75a Binary files /dev/null and b/javaEE/day08/img/多表查询25.png differ diff --git a/javaEE/day08/img/多表查询26.png b/javaEE/day08/img/多表查询26.png new file mode 100644 index 0000000..61aa9ea Binary files /dev/null and b/javaEE/day08/img/多表查询26.png differ diff --git a/javaEE/day08/img/多表查询27.png b/javaEE/day08/img/多表查询27.png new file mode 100644 index 0000000..bc1c8a2 Binary files /dev/null and b/javaEE/day08/img/多表查询27.png differ diff --git a/javaEE/day08/img/多表查询28.png b/javaEE/day08/img/多表查询28.png new file mode 100644 index 0000000..6bd8529 Binary files /dev/null and b/javaEE/day08/img/多表查询28.png differ diff --git a/javaEE/day08/img/多表查询29.png b/javaEE/day08/img/多表查询29.png new file mode 100644 index 0000000..5254d90 Binary files /dev/null and b/javaEE/day08/img/多表查询29.png differ diff --git a/javaEE/day08/img/多表查询30.png b/javaEE/day08/img/多表查询30.png new file mode 100644 index 0000000..60b37ea Binary files /dev/null and b/javaEE/day08/img/多表查询30.png differ diff --git a/javaEE/day08/img/多表查询31.png b/javaEE/day08/img/多表查询31.png new file mode 100644 index 0000000..065b940 Binary files /dev/null and b/javaEE/day08/img/多表查询31.png differ diff --git a/javaEE/day08/img/多表查询32.png b/javaEE/day08/img/多表查询32.png new file mode 100644 index 0000000..cced728 Binary files /dev/null and b/javaEE/day08/img/多表查询32.png differ diff --git a/javaEE/day08/img/多表查询33.png b/javaEE/day08/img/多表查询33.png new file mode 100644 index 0000000..241a129 Binary files /dev/null and b/javaEE/day08/img/多表查询33.png differ diff --git a/javaEE/day08/img/多表查询34.png b/javaEE/day08/img/多表查询34.png new file mode 100644 index 0000000..5e3e247 Binary files /dev/null and b/javaEE/day08/img/多表查询34.png differ diff --git a/javaEE/day08/img/多表查询35.png b/javaEE/day08/img/多表查询35.png new file mode 100644 index 0000000..9721497 Binary files /dev/null and b/javaEE/day08/img/多表查询35.png differ diff --git a/javaEE/day08/img/多表查询36.png b/javaEE/day08/img/多表查询36.png new file mode 100644 index 0000000..65f86ad Binary files /dev/null and b/javaEE/day08/img/多表查询36.png differ diff --git a/javaEE/day08/img/多表查询37.png b/javaEE/day08/img/多表查询37.png new file mode 100644 index 0000000..81b1795 Binary files /dev/null and b/javaEE/day08/img/多表查询37.png differ diff --git a/javaEE/day08/img/多表查询38.png b/javaEE/day08/img/多表查询38.png new file mode 100644 index 0000000..1ec4b93 Binary files /dev/null and b/javaEE/day08/img/多表查询38.png differ diff --git a/javaEE/day08/img/多表查询39.png b/javaEE/day08/img/多表查询39.png new file mode 100644 index 0000000..8e32559 Binary files /dev/null and b/javaEE/day08/img/多表查询39.png differ diff --git a/javaEE/day08/img/多表查询40.png b/javaEE/day08/img/多表查询40.png new file mode 100644 index 0000000..647d3ea Binary files /dev/null and b/javaEE/day08/img/多表查询40.png differ diff --git a/javaEE/day08/img/多表查询41.png b/javaEE/day08/img/多表查询41.png new file mode 100644 index 0000000..942641b Binary files /dev/null and b/javaEE/day08/img/多表查询41.png differ diff --git a/javaEE/day08/img/多表查询42.png b/javaEE/day08/img/多表查询42.png new file mode 100644 index 0000000..18795cc Binary files /dev/null and b/javaEE/day08/img/多表查询42.png differ diff --git a/javaEE/day08/img/多表查询43.png b/javaEE/day08/img/多表查询43.png new file mode 100644 index 0000000..a92204a Binary files /dev/null and b/javaEE/day08/img/多表查询43.png differ diff --git a/javaEE/day08/img/多表查询44.png b/javaEE/day08/img/多表查询44.png new file mode 100644 index 0000000..548738a Binary files /dev/null and b/javaEE/day08/img/多表查询44.png differ diff --git a/javaEE/day08/img/子查询01.png b/javaEE/day08/img/子查询01.png new file mode 100644 index 0000000..5a6be99 Binary files /dev/null and b/javaEE/day08/img/子查询01.png differ diff --git a/javaEE/day08/img/子查询02.png b/javaEE/day08/img/子查询02.png new file mode 100644 index 0000000..f67d12c Binary files /dev/null and b/javaEE/day08/img/子查询02.png differ diff --git a/javaEE/day08/img/子查询03.png b/javaEE/day08/img/子查询03.png new file mode 100644 index 0000000..34c91db Binary files /dev/null and b/javaEE/day08/img/子查询03.png differ diff --git a/javaEE/day08/img/子查询04.png b/javaEE/day08/img/子查询04.png new file mode 100644 index 0000000..e44766e Binary files /dev/null and b/javaEE/day08/img/子查询04.png differ diff --git a/javaEE/day08/img/子查询05.png b/javaEE/day08/img/子查询05.png new file mode 100644 index 0000000..3a72ad9 Binary files /dev/null and b/javaEE/day08/img/子查询05.png differ diff --git a/javaEE/day08/img/子查询06.png b/javaEE/day08/img/子查询06.png new file mode 100644 index 0000000..d9830d9 Binary files /dev/null and b/javaEE/day08/img/子查询06.png differ diff --git a/javaEE/day08/img/子查询07.png b/javaEE/day08/img/子查询07.png new file mode 100644 index 0000000..58df821 Binary files /dev/null and b/javaEE/day08/img/子查询07.png differ diff --git a/javaEE/day08/img/子查询08.png b/javaEE/day08/img/子查询08.png new file mode 100644 index 0000000..d27c9af Binary files /dev/null and b/javaEE/day08/img/子查询08.png differ diff --git a/javaEE/day08/img/子查询09.png b/javaEE/day08/img/子查询09.png new file mode 100644 index 0000000..e7887a6 Binary files /dev/null and b/javaEE/day08/img/子查询09.png differ diff --git a/javaEE/day08/img/子查询10.png b/javaEE/day08/img/子查询10.png new file mode 100644 index 0000000..2b10bda Binary files /dev/null and b/javaEE/day08/img/子查询10.png differ diff --git a/javaEE/day08/img/子查询11.png b/javaEE/day08/img/子查询11.png new file mode 100644 index 0000000..690a012 Binary files /dev/null and b/javaEE/day08/img/子查询11.png differ diff --git a/javaEE/day08/img/子查询12.png b/javaEE/day08/img/子查询12.png new file mode 100644 index 0000000..92d8a1c Binary files /dev/null and b/javaEE/day08/img/子查询12.png differ diff --git a/javaEE/day08/img/子查询13.png b/javaEE/day08/img/子查询13.png new file mode 100644 index 0000000..d570747 Binary files /dev/null and b/javaEE/day08/img/子查询13.png differ diff --git a/javaEE/day08/img/子查询14.png b/javaEE/day08/img/子查询14.png new file mode 100644 index 0000000..7fc8a14 Binary files /dev/null and b/javaEE/day08/img/子查询14.png differ diff --git a/javaEE/day08/img/数据库导出01.png b/javaEE/day08/img/数据库导出01.png new file mode 100644 index 0000000..934e98b Binary files /dev/null and b/javaEE/day08/img/数据库导出01.png differ diff --git a/javaEE/day08/img/数据库导出02.png b/javaEE/day08/img/数据库导出02.png new file mode 100644 index 0000000..3d8be5f Binary files /dev/null and b/javaEE/day08/img/数据库导出02.png differ diff --git a/javaEE/day08/img/数据库导出03.png b/javaEE/day08/img/数据库导出03.png new file mode 100644 index 0000000..3978e91 Binary files /dev/null and b/javaEE/day08/img/数据库导出03.png differ diff --git a/javaEE/day08/img/数据库导出04.png b/javaEE/day08/img/数据库导出04.png new file mode 100644 index 0000000..0b90bea Binary files /dev/null and b/javaEE/day08/img/数据库导出04.png differ diff --git a/javaEE/day08/img/数据库导出05.png b/javaEE/day08/img/数据库导出05.png new file mode 100644 index 0000000..3383adc Binary files /dev/null and b/javaEE/day08/img/数据库导出05.png differ diff --git a/javaEE/day08/img/数据库导出06.png b/javaEE/day08/img/数据库导出06.png new file mode 100644 index 0000000..e570201 Binary files /dev/null and b/javaEE/day08/img/数据库导出06.png differ diff --git a/javaEE/day08/img/数据库导出07.png b/javaEE/day08/img/数据库导出07.png new file mode 100644 index 0000000..13a5274 Binary files /dev/null and b/javaEE/day08/img/数据库导出07.png differ diff --git a/javaEE/day08/img/数据库导出08.png b/javaEE/day08/img/数据库导出08.png new file mode 100644 index 0000000..05c5197 Binary files /dev/null and b/javaEE/day08/img/数据库导出08.png differ diff --git a/javaEE/day08/img/数据库导出09.png b/javaEE/day08/img/数据库导出09.png new file mode 100644 index 0000000..869baa2 Binary files /dev/null and b/javaEE/day08/img/数据库导出09.png differ diff --git a/javaEE/day08/img/数据库导出10.png b/javaEE/day08/img/数据库导出10.png new file mode 100644 index 0000000..608a0ee Binary files /dev/null and b/javaEE/day08/img/数据库导出10.png differ diff --git a/javaEE/day08/img/级联操作01.png b/javaEE/day08/img/级联操作01.png new file mode 100644 index 0000000..a8c7a80 Binary files /dev/null and b/javaEE/day08/img/级联操作01.png differ diff --git a/javaEE/day08/img/级联操作02.png b/javaEE/day08/img/级联操作02.png new file mode 100644 index 0000000..e106e0e Binary files /dev/null and b/javaEE/day08/img/级联操作02.png differ diff --git a/javaEE/day08/img/聚合函数01.png b/javaEE/day08/img/聚合函数01.png new file mode 100644 index 0000000..e354ec8 Binary files /dev/null and b/javaEE/day08/img/聚合函数01.png differ diff --git a/javaEE/day08/img/聚合函数02.png b/javaEE/day08/img/聚合函数02.png new file mode 100644 index 0000000..524f214 Binary files /dev/null and b/javaEE/day08/img/聚合函数02.png differ diff --git a/javaEE/day08/img/聚合函数03.png b/javaEE/day08/img/聚合函数03.png new file mode 100644 index 0000000..0b03cfa Binary files /dev/null and b/javaEE/day08/img/聚合函数03.png differ diff --git a/javaEE/day08/img/聚合函数04.png b/javaEE/day08/img/聚合函数04.png new file mode 100644 index 0000000..3ad4532 Binary files /dev/null and b/javaEE/day08/img/聚合函数04.png differ diff --git a/javaEE/day08/img/聚合函数05.png b/javaEE/day08/img/聚合函数05.png new file mode 100644 index 0000000..c2d7061 Binary files /dev/null and b/javaEE/day08/img/聚合函数05.png differ diff --git a/javaEE/day08/img/聚合函数06.png b/javaEE/day08/img/聚合函数06.png new file mode 100644 index 0000000..ecdc143 Binary files /dev/null and b/javaEE/day08/img/聚合函数06.png differ diff --git a/javaEE/day08/img/聚合函数07.png b/javaEE/day08/img/聚合函数07.png new file mode 100644 index 0000000..409933c Binary files /dev/null and b/javaEE/day08/img/聚合函数07.png differ diff --git a/javaEE/day08/img/范式01.png b/javaEE/day08/img/范式01.png new file mode 100644 index 0000000..9e34fc3 Binary files /dev/null and b/javaEE/day08/img/范式01.png differ diff --git a/javaEE/day08/img/范式02.png b/javaEE/day08/img/范式02.png new file mode 100644 index 0000000..5864068 Binary files /dev/null and b/javaEE/day08/img/范式02.png differ diff --git a/javaEE/day08/img/范式03.png b/javaEE/day08/img/范式03.png new file mode 100644 index 0000000..95458fb Binary files /dev/null and b/javaEE/day08/img/范式03.png differ diff --git a/javaEE/day08/img/范式04.png b/javaEE/day08/img/范式04.png new file mode 100644 index 0000000..dad9650 Binary files /dev/null and b/javaEE/day08/img/范式04.png differ diff --git a/javaEE/day08/img/表连接查询01.png b/javaEE/day08/img/表连接查询01.png new file mode 100644 index 0000000..a880147 Binary files /dev/null and b/javaEE/day08/img/表连接查询01.png differ diff --git a/javaEE/day08/img/表连接查询02.png b/javaEE/day08/img/表连接查询02.png new file mode 100644 index 0000000..9144b9f Binary files /dev/null and b/javaEE/day08/img/表连接查询02.png differ diff --git a/javaEE/day08/img/表连接查询03.png b/javaEE/day08/img/表连接查询03.png new file mode 100644 index 0000000..cef586d Binary files /dev/null and b/javaEE/day08/img/表连接查询03.png differ diff --git a/javaEE/day08/img/表连接查询04.png b/javaEE/day08/img/表连接查询04.png new file mode 100644 index 0000000..22b5d81 Binary files /dev/null and b/javaEE/day08/img/表连接查询04.png differ diff --git a/javaEE/day08/img/表连接查询05.png b/javaEE/day08/img/表连接查询05.png new file mode 100644 index 0000000..c792627 Binary files /dev/null and b/javaEE/day08/img/表连接查询05.png differ diff --git a/javaEE/day08/img/表连接查询06.png b/javaEE/day08/img/表连接查询06.png new file mode 100644 index 0000000..b9d774e Binary files /dev/null and b/javaEE/day08/img/表连接查询06.png differ diff --git a/javaEE/day08/img/表连接查询07.png b/javaEE/day08/img/表连接查询07.png new file mode 100644 index 0000000..4960a54 Binary files /dev/null and b/javaEE/day08/img/表连接查询07.png differ diff --git a/javaEE/day08/img/表连接查询08.png b/javaEE/day08/img/表连接查询08.png new file mode 100644 index 0000000..535932b Binary files /dev/null and b/javaEE/day08/img/表连接查询08.png differ diff --git a/javaEE/day08/img/表连接查询09.png b/javaEE/day08/img/表连接查询09.png new file mode 100644 index 0000000..dbbec6f Binary files /dev/null and b/javaEE/day08/img/表连接查询09.png differ diff --git a/javaEE/day08/img/表连接查询10.png b/javaEE/day08/img/表连接查询10.png new file mode 100644 index 0000000..65819fd Binary files /dev/null and b/javaEE/day08/img/表连接查询10.png differ diff --git a/javaEE/day08/img/表连接查询11.png b/javaEE/day08/img/表连接查询11.png new file mode 100644 index 0000000..b8636b2 Binary files /dev/null and b/javaEE/day08/img/表连接查询11.png differ diff --git a/javaEE/day08/img/表连接查询12.png b/javaEE/day08/img/表连接查询12.png new file mode 100644 index 0000000..34535a7 Binary files /dev/null and b/javaEE/day08/img/表连接查询12.png differ diff --git a/javaEE/day08/img/表连接查询13.png b/javaEE/day08/img/表连接查询13.png new file mode 100644 index 0000000..4096d5f Binary files /dev/null and b/javaEE/day08/img/表连接查询13.png differ diff --git a/javaEE/day08/img/表连接查询14.png b/javaEE/day08/img/表连接查询14.png new file mode 100644 index 0000000..d775d2d Binary files /dev/null and b/javaEE/day08/img/表连接查询14.png differ diff --git a/javaEE/day08/img/表连接查询15.png b/javaEE/day08/img/表连接查询15.png new file mode 100644 index 0000000..7d3704b Binary files /dev/null and b/javaEE/day08/img/表连接查询15.png differ diff --git a/javaEE/day08/img/表连接查询16.png b/javaEE/day08/img/表连接查询16.png new file mode 100644 index 0000000..ec23ac0 Binary files /dev/null and b/javaEE/day08/img/表连接查询16.png differ diff --git a/javaEE/day08/img/表连接查询17.png b/javaEE/day08/img/表连接查询17.png new file mode 100644 index 0000000..baf5e3d Binary files /dev/null and b/javaEE/day08/img/表连接查询17.png differ diff --git a/javaEE/day08/img/默认值.png b/javaEE/day08/img/默认值.png new file mode 100644 index 0000000..bd7791b Binary files /dev/null and b/javaEE/day08/img/默认值.png differ diff --git a/javaEE/day09/Mybatis.md b/javaEE/day09/Mybatis.md new file mode 100644 index 0000000..fb0d42b --- /dev/null +++ b/javaEE/day09/Mybatis.md @@ -0,0 +1,1488 @@ + + +# 1. Mybatis基础操作 + +学习完mybatis入门后,我们继续学习mybatis基础操作。 + +## 1.1 需求 + +需求说明: + +- 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 + +![image-20221210180155700](assets/image-20221210180155700.png) + +![image-20221210180343288](assets/image-20221210180343288.png) + +![image-20221210180515206](assets/image-20221210180515206.png) + +通过分析以上的页面原型和需求,我们确定了功能列表: + +1. 查询 + - 根据主键ID查询 + - 条件查询 + +2. 新增 +3. 更新 +4. 删除 + - 根据主键ID删除 + - 根据主键ID批量删除 + + + + + +## 1.2 准备 + +实施前的准备工作: + +1. 准备数据库表 +2. 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok) +3. application.properties中引入数据库连接信息 +4. 创建对应的实体类 Emp(实体类属性采用驼峰命名) +5. 准备Mapper接口 EmpMapper + + + +**准备数据库表** + +~~~mysql +-- 部门管理 +create table dept +( + id int unsigned primary key auto_increment comment '主键ID', + name varchar(10) not null unique comment '部门名称', + create_time datetime not null comment '创建时间', + update_time datetime not null comment '修改时间' +) comment '部门表'; +-- 部门表测试数据 +insert into dept (id, name, create_time, update_time) +values (1, '学工部', now(), now()), + (2, '教研部', now(), now()), + (3, '咨询部', now(), now()), + (4, '就业部', now(), now()), + (5, '人事部', now(), now()); + + +-- 员工管理 +create table emp +( + id int unsigned primary key auto_increment comment 'ID', + username varchar(20) not null unique comment '用户名', + password varchar(32) default '123456' comment '密码', + name varchar(10) not null comment '姓名', + gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女', + image varchar(300) comment '图像', + job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师', + entrydate date comment '入职时间', + dept_id int unsigned comment '部门ID', + create_time datetime not null comment '创建时间', + update_time datetime not null comment '修改时间' +) comment '员工表'; +-- 员工表测试数据 +INSERT INTO emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time) +VALUES +(1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', 2, now(), now()), +(2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', 2, now(), now()), +(3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', 2, now(), now()), +(4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', 2, now(), now()), +(5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', 2, now(), now()), +(6, 'xiaozhao', '123456', '小昭', 2, '6.jpg', 3, '2013-09-05', 1, now(), now()), +(7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', 1, now(), now()), +(8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', 1, now(), now()), +(9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', 1, now(), now()), +(10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', 1, now(), now()), +(11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 5, '2007-02-01', 3, now(), now()), +(12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 5, '2008-08-18', 3, now(), now()), +(13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 5, '2012-11-01', 3, now(), now()), +(14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', 2, now(), now()), +(15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', 2, now(), now()), +(16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2010-01-01', 2, now(), now()), +(17, 'chenyouliang', '123456', '陈友谅', 1, '17.jpg', NULL, '2015-03-21', NULL, now(), now()); +~~~ + + + +**创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)** + +![image-20221210182008131](assets/image-20221210182008131.png) + + + +**application.properties中引入数据库连接信息** + +> 提示:可以把之前项目中已有的配置信息复制过来即可 + +~~~properties +#驱动类名称 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +#数据库连接的url +spring.datasource.url=jdbc:mysql://localhost:3306/mybatis +#连接数据库的用户名 +spring.datasource.username=root +#连接数据库的密码 +spring.datasource.password=1234 +~~~ + + + +**创建对应的实体类Emp(实体类属性采用驼峰命名)** + +~~~java +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Emp { + private Integer id; + private String username; + private String password; + private String name; + private Short gender; + private String image; + private Short job; + private LocalDate entrydate; //LocalDate类型对应数据表中的date类型 + private Integer deptId; + private LocalDateTime createTime;//LocalDateTime类型对应数据表中的datetime类型 + private LocalDateTime updateTime; +} +~~~ + + + +**准备Mapper接口:EmpMapper** + +~~~java +/*@Mapper注解:表示当前接口为mybatis中的Mapper接口 + 程序运行时会自动创建接口的实现类对象(代理对象),并交给Spring的IOC容器管理 +*/ +@Mapper +public interface EmpMapper { + +} +~~~ + +完成以上操作后,项目工程结构目录如下: + +![image-20250621171125313](Mybatis/image-20250621171125313.png) + + + + + +## 1.3 删除 + +### 1.3.1 功能实现 + +页面原型: + +![image-20221210183336095](assets/image-20221210183336095.png) + +> 当我们点击后面的"删除"按钮时,前端页面会给服务端传递一个参数,也就是该行数据的ID。 我们接收到ID后,根据ID删除数据即可。 + + + +**功能:根据主键删除数据** + +- SQL语句 + +~~~mysql +-- 删除id=17的数据 +delete from emp where id = 17; +~~~ + +> Mybatis框架让程序员更关注于SQL语句 + +- 接口方法 + +~~~java +@Mapper +public interface EmpMapper { + + //@Delete("delete from emp where id = 17") + //public void delete(); + //以上delete操作的SQL语句中的id值写成固定的17,就表示只能删除id=17的用户数据 + //SQL语句中的id值不能写成固定数值,需要变为动态的数值 + //解决方案:在delete方法中添加一个参数(用户id),将方法中的参数,传给SQL语句 + + /** + * 根据id删除数据 + * @param id 用户id + */ + @Delete("delete from emp where id = #{id}")//使用#{key}方式获取方法中的参数值 + public void delete(Integer id); + +} +~~~ + +> @Delete注解:用于编写delete操作的SQL语句 + +> 如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。但是建议保持名字一致。 + +- 测试 + - 在单元测试类中通过@Autowired注解注入EmpMapper类型对象 + +~~~java +@SpringBootTest +class SpringbootMybatisCrudApplicationTests { + @Autowired //从Spring的IOC容器中,获取类型是EmpMapper的对象并注入 + private EmpMapper empMapper; + + @Test + public void testDel(){ + //调用删除方法 + empMapper.delete(16); + } + +} +~~~ + + + + + +### 1.3.2 日志输入 + +在Mybatis当中我们可以借助日志,查看到sql语句的执行、执行传递的参数以及执行结果。具体操作如下: + +1. 打开application.properties文件 + +2. 开启mybatis的日志,并指定输出到控制台 + +```properties +#指定mybatis输出日志的位置, 输出控制台 +mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +``` + +开启日志之后,我们再次运行单元测试,可以看到在控制台中,输出了以下的SQL语句信息: + +![image-20220901164225644](assets/image-20220901164225644.png) + +> 但是我们发现输出的SQL语句:delete from emp where id = ?,我们输入的参数16并没有在后面拼接,id的值是使用?进行占位。那这种SQL语句我们称为预编译SQL。 + + + + + +### 1.3.3 预编译SQL + +#### 1.3.3.1 介绍 + +预编译SQL有两个优势: + +1. 性能更高 +2. 更安全(防止SQL注入) + +![image-20221210202222206](assets/image-20221210202222206.png) + +> 性能更高:预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译。(只是输入的参数不同) +> +> 更安全(防止SQL注入):将敏感字进行转义,保障SQL的安全性。 + + + +#### 1.3.3.2 SQL注入 + +SQL注入:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。 + +> 由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。 + +**测试1:使用资料中提供的程序,来验证SQL注入问题** + +![image-20221210205419634](assets/image-20221210205419634.png) + +第1步:进入到DOS + +![image-20221211124744203](assets/image-20221211124744203.png) + +![image-20221211124840720](assets/image-20221211124840720.png) + +第2步:执行以下命令,启动程序 + +~~~powershell +#启动存在SQL注入的程序 +java -jar sql_Injection_demo-0.0.1-SNAPSHOT.jar +~~~ + +![image-20221210211605231](assets/image-20221210211605231.png) + +第3步:打开浏览器输入`http://localhost:9090/login.html` + +![image-20221210212406527](assets/image-20221210212406527.png) + +发现竟然能够登录成功: + +![image-20221210212511915](assets/image-20221210212511915.png) + + + +以上操作为什么能够登录成功呢? + +- 由于没有对用户输入内容进行充分检查,而SQL又是字符串拼接方式而成,在用户输入参数时,在参数中添加一些SQL关键字,达到改变SQL运行结果的目的,从而完成恶意攻击。 + +![image-20221210213311518](assets/image-20221210213311518.png) + +> ![image-20221210214431228](assets/image-20221210214431228.png) +> +> 用户在页面提交数据的时候人为的添加一些特殊字符,使得sql语句的结构发生了变化,最终可以在没有用户名或者密码的情况下进行登录。 + + + +**测试2:使用资料中提供的程序,来验证SQL注入问题** + +第1步:进入到DOS + +第2步:执行以下命令,启动程序: + +~~~powershell +#启动解决了SQL注入的程序 +java -jar sql_prepared_demo-0.0.1-SNAPSHOT.jar +~~~ + +第3步:打开浏览器输入`http://localhost:9090/login.html` + +![image-20221210212406527](assets/image-20221210212406527.png) + +发现无法登录: + +![image-20221211125751981](assets/image-20221211125751981.png) + +以上操作SQL语句的执行: + +![image-20221211130011973](assets/image-20221211130011973.png) + +> 把整个`' or '1'='1`作为一个完整的参数,赋值给第2个问号(`' or '1'='1`进行了转义,只当做字符串使用) + + + +#### 1.3.3.3 参数占位符 + +在Mybatis中提供的参数占位符有两种:${...} 、#{...} + +- #{...} + - 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值 + - 使用时机:参数传递,都使用#{…} + +- ${...} + - 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题 + - 使用时机:如果对表名、列表进行动态设置时使用 + +> 注意事项:在项目开发中,建议使用#{...},生成预编译SQL,防止SQL注入安全。 + + + + + + + +## 1.4 新增 + +功能:新增员工信息 + +![image-20221211134239610](assets/image-20221211134239610.png) + +### 1.4.1 基本新增 + +员工表结构: + +![image-20221211134746319](assets/image-20221211134746319.png) + +SQL语句: + +```sql +insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values ('songyuanqiao','宋远桥',1,'1.jpg',2,'2012-10-09',2,'2022-10-01 10:00:00','2022-10-01 10:00:00'); +``` + +接口方法: + +```java +@Mapper +public interface EmpMapper { + + @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})") + public void insert(Emp emp); + +} +``` + +> 说明:#{...} 里面写的名称是对象的属性名 + +测试类: + +```java +import com.inmind.mapper.EmpMapper; +import com.inmind.pojo.Emp; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@SpringBootTest +class SpringbootMybatisCrudApplicationTests { + @Autowired + private EmpMapper empMapper; + + @Test + public void testInsert(){ + //创建员工对象 + Emp emp = new Emp(); + emp.setUsername("tom"); + emp.setName("汤姆"); + emp.setImage("1.jpg"); + emp.setGender((short)1); + emp.setJob((short)1); + emp.setEntrydate(LocalDate.of(2000,1,1)); + emp.setCreateTime(LocalDateTime.now()); + emp.setUpdateTime(LocalDateTime.now()); + emp.setDeptId(1); + //调用添加方法 + empMapper.insert(emp); + } +} + +``` + +> 日志输出: +> +> ![image-20221211140222240](assets/image-20221211140222240.png) + + + + + + + +### 1.4.2 主键返回 + +概念:在数据添加成功后,需要获取插入数据库数据的主键。 + +> + +那要如何实现在插入数据之后返回所插入行的主键值呢? + +- 默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在Mapper接口中的方法上添加一个Options注解,并在注解中指定属性useGeneratedKeys=true和keyProperty="实体类属性名" + + + +主键返回代码实现: + +~~~java +@Mapper +public interface EmpMapper { + + //会自动将生成的主键值,赋值给emp对象的id属性 + @Options(useGeneratedKeys = true,keyProperty = "id") + @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})") + public void insert(Emp emp); + +} +~~~ + +测试: + +~~~java +@SpringBootTest +class SpringbootMybatisCrudApplicationTests { + @Autowired + private EmpMapper empMapper; + + @Test + public void testInsert(){ + //创建员工对象 + Emp emp = new Emp(); + emp.setUsername("jack"); + emp.setName("杰克"); + emp.setImage("1.jpg"); + emp.setGender((short)1); + emp.setJob((short)1); + emp.setEntrydate(LocalDate.of(2000,1,1)); + emp.setCreateTime(LocalDateTime.now()); + emp.setUpdateTime(LocalDateTime.now()); + emp.setDeptId(1); + //调用添加方法 + empMapper.insert(emp); + + System.out.println(emp.getDeptId()); + } +} +~~~ + + + + + + + +## 1.5 更新 + +功能:修改员工信息 + +![image-20221212095605863](assets/image-20221212095605863.png) + +> 点击"编辑"按钮后,会查询所在行记录的员工信息,并把员工信息回显在修改员工的窗体上(下个知识点学习) +> +> 在修改员工的窗体上,可以修改的员工数据:用户名、员工姓名、性别、图像、职位、入职日期、归属部门 +> +> 思考:在修改员工数据时,要以什么做为条件呢? +> +> 答案:员工id + +SQL语句: + +```sql +update emp set username = 'linghushaoxia', name = '令狐少侠', gender = 1 , image = '1.jpg' , job = 2, entrydate = '2012-01-01', dept_id = 2, update_time = '2022-10-01 12:12:12' where id = 18; +``` + +接口方法: + +```java +@Mapper +public interface EmpMapper { + /** + * 根据id修改员工信息 + * @param emp + */ + @Update("update emp set username=#{username}, name=#{name}, gender=#{gender}, image=#{image}, job=#{job}, entrydate=#{entrydate}, dept_id=#{deptId}, update_time=#{updateTime} where id=#{id}") + public void update(Emp emp); + +} +``` + +测试类: + +```java +@SpringBootTest +class SpringbootMybatisCrudApplicationTests { + @Autowired + private EmpMapper empMapper; + + @Test + public void testUpdate(){ + //要修改的员工信息 + Emp emp = new Emp(); + emp.setId(23); + emp.setUsername("songdaxia"); + emp.setPassword(null); + emp.setName("老宋"); + emp.setImage("2.jpg"); + emp.setGender((short)1); + emp.setJob((short)2); + emp.setEntrydate(LocalDate.of(2012,1,1)); + emp.setCreateTime(null); + emp.setUpdateTime(LocalDateTime.now()); + emp.setDeptId(2); + //调用方法,修改员工数据 + empMapper.update(emp); + } +} +``` + + + + + +## 1.6 查询 + +### 1.6.1 根据ID查询 + +在员工管理的页面中,当我们进行更新数据时,会点击 “编辑” 按钮,然后此时会发送一个请求到服务端,会根据Id查询该员工信息,并将员工数据回显在页面上。 + +![image-20221212101331292](assets/image-20221212101331292.png) + +SQL语句: + +~~~mysql +select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp; +~~~ + +接口方法: + +~~~java +@Mapper +public interface EmpMapper { + @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where id=#{id}") + public Emp getById(Integer id); +} +~~~ + +测试类: + +~~~java +@SpringBootTest +class SpringbootMybatisCrudApplicationTests { + @Autowired + private EmpMapper empMapper; + + @Test + public void testGetById(){ + Emp emp = empMapper.getById(1); + System.out.println(emp); + } +} +~~~ + +> 执行结果: +> +> ![image-20221212103004961](assets/image-20221212103004961.png) +> +> 而在测试的过程中,我们会发现有几个字段(deptId、createTime、updateTime)是没有数据值的 + + + + + +### 1.6.2 数据封装 + +我们看到查询返回的结果中大部分字段是有值的,但是deptId,createTime,updateTime这几个字段是没有值的,而数据库中是有对应的字段值的,这是为什么呢? + +![image-20221212103124490](assets/image-20221212103124490.png) + +原因如下: + +- 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。 +- 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。 + + + + 解决方案: + +1. 起别名 +2. 结果映射 +3. 开启驼峰命名 + + + +**起别名**:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样 + +```java +@Select("select id, username, password, name, gender, image, job, entrydate, " + + "dept_id AS deptId, create_time AS createTime, update_time AS updateTime " + + "from emp " + + "where id=#{id}") +public Emp getById(Integer id); +``` + +> 再次执行测试类: +> +> ![image-20221212111027396](assets/image-20221212111027396.png) + + + +**手动结果映射**:通过 @Results及@Result 进行手动结果映射 + +```java +@Results({@Result(column = "dept_id", property = "deptId"), + @Result(column = "create_time", property = "createTime"), + @Result(column = "update_time", property = "updateTime")}) +@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where id=#{id}") +public Emp getById(Integer id); +``` + +> @Results源代码: +> +> ~~~java +> @Documented +> @Retention(RetentionPolicy.RUNTIME) +> @Target({ElementType.METHOD}) +> public @interface Results { +> String id() default ""; +> +> Result[] value() default {}; //Result类型的数组 +> } +> ~~~ +> +> @Result源代码: +> +> ~~~java +> @Documented +> @Retention(RetentionPolicy.RUNTIME) +> @Target({ElementType.METHOD}) +> @Repeatable(Results.class) +> public @interface Result { +> boolean id() default false;//表示当前列是否为主键(true:是主键) +> +> String column() default "";//指定表中字段名 +> +> String property() default "";//指定类中属性名 +> +> Class<?> javaType() default void.class; +> +> JdbcType jdbcType() default JdbcType.UNDEFINED; +> +> Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class; +> +> One one() default @One; +> +> Many many() default @Many; +> } +> ~~~ + + + +**开启驼峰命名(推荐)**:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射 + +> 驼峰命名规则: abc_xyz => abcXyz +> +> - 表中字段名:abc_xyz +> - 类中属性名:abcXyz + +```properties +# 在application.properties中添加: +mybatis.configuration.map-underscore-to-camel-case=true +``` + +> 要使用驼峰命名前提是 实体类的属性 与 数据库表中的字段名严格遵守驼峰命名。 + + + + + +### 1.6.3 条件查询 + +在员工管理的列表页面中,我们需要根据条件查询员工信息,查询条件包括:姓名、性别、入职时间。 + +![image-20221212113422924](assets/image-20221212113422924.png) + +通过页面原型以及需求描述我们要实现的查询: + +- 姓名:要求支持模糊匹配 +- 性别:要求精确匹配 +- 入职时间:要求进行范围查询 +- 根据最后修改时间进行降序排序 + + + +SQL语句: + +```sql +select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time +from emp +where name like '%张%' + and gender = 1 + and entrydate between '2010-01-01' and '2020-01-01 ' +order by update_time desc; +``` + +接口方法: + +- 方式一 + +```java +@Mapper +public interface EmpMapper { + @Select("select * from emp " + + "where name like '%${name}%' " + + "and gender = #{gender} " + + "and entrydate between #{begin} and #{end} " + + "order by update_time desc") + public List list(String name, Short gender, LocalDate begin, LocalDate end); +} +``` + +> ![image-20221212115149151](assets/image-20221212115149151.png) +> +> 以上方式注意事项: +> +> 1. 方法中的形参名和SQL语句中的参数占位符名保持一致 +> +> 2. 模糊查询使用${...}进行字符串拼接,这种方式呢,由于是字符串拼接,并不是预编译的形式,所以效率不高、且存在sql注入风险。 + + + +- 方式二(解决SQL注入风险) + - 使用MySQL提供的字符串拼接函数:concat('%' , '关键字' , '%') + +~~~java +@Mapper +public interface EmpMapper { + + @Select("select * from emp " + + "where name like concat('%',#{name},'%') " + + "and gender = #{gender} " + + "and entrydate between #{begin} and #{end} " + + "order by update_time desc") + public List list(String name, Short gender, LocalDate begin, LocalDate end); + +} + +~~~ + +> 执行结果:生成的SQL都是预编译的SQL语句(性能高、安全) +> +> ![image-20221212120006242](assets/image-20221212120006242.png) + + + + + +### 1.6.4 参数名说明 + +在上面我们所编写的条件查询功能中,我们需要保证接口中方法的形参名和SQL语句中的参数占位符名相同。 + +> 当方法中的形参名和SQL语句中的占位符参数名不相同时,就会出现以下问题: +> +> ![image-20221212150611796](assets/image-20221212150611796.png) + + + +参数名在不同的SpringBoot版本中,处理方案还不同: + +- 在springBoot的2.x版本(保证参数名一致) + +![image-20221212151156273](assets/image-20221212151156273.png) + +> springBoot的父工程对compiler编译插件进行了默认的参数parameters配置,使得在编译时,会在生成的字节码文件中保留原方法形参的名称,所以#{…}里面可以直接通过形参名获取对应的值 +> +> ![image-20221212151411154](assets/image-20221212151411154.png) + + + +- 在springBoot的1.x版本/单独使用mybatis(使用@Param注解来指定SQL语句中的参数名) + +![image-20221212151628715](assets/image-20221212151628715.png) + +> 在编译时,生成的字节码文件当中,不会保留Mapper接口中方法的形参名称,而是使用var1、var2、...这样的形参名字,此时要获取参数值时,就要通过@Param注解来指定SQL语句中的参数名 +> +> ![image-20221212151736274](assets/image-20221212151736274.png) + + + + + + + + + + + +# 2. Mybatis的XML配置文件 + +Mybatis的开发有两种方式: + +1. 注解 +2. XML + +## 2.1 XML配置文件规范 + +使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。 + +在Mybatis中使用XML映射文件方式开发,需要符合一定的规范: + +1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名) + +2. XML映射文件的namespace属性为Mapper接口全限定名一致 + +3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。 + +![image-20221212153529732](assets/image-20221212153529732.png) + +> \<select>标签:就是用于编写select查询语句的。 +> +> - resultType属性,指的是查询返回的单条记录所封装的类型。 + + + + + +## 2.2 XML配置文件实现 + +第1步:创建XML映射文件 + +![image-20221212154908306](assets/image-20221212154908306.png) + +![image-20221212155304635](assets/image-20221212155304635.png) + +![image-20221212155544404](assets/image-20221212155544404.png) + + + +第2步:编写XML映射文件 + +> xml映射文件中的dtd约束,直接从mybatis官网复制即可 + +~~~xml + + + + + +~~~ + + + +配置:XML映射文件的namespace属性为Mapper接口全限定名 + +![image-20221212160316644](assets/image-20221212160316644.png) + +~~~xml + + + + + +~~~ + + + +配置:XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致 + +![image-20221212163528787](assets/image-20221212163528787.png) + +~~~xml + + + + + + + +~~~ + +> 运行测试类,执行结果: +> +> ![image-20221212163719534](assets/image-20221212163719534.png) + + + + + +## 2.3 MybatisX的使用 + +MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率而生。 + +MybatisX的安装: + +![image-20221213120923252](assets/image-20221213120923252.png) + +可以通过MybatisX快速定位: + +![image-20221213121521406](assets/image-20221213121521406.png) + +> MybatisX的使用在后续学习中会继续分享 + + + +学习了Mybatis中XML配置文件的开发方式了,大家可能会存在一个疑问:到底是使用注解方式开发还是使用XML方式开发? + +> 官方说明:https://mybatis.net.cn/getting-started.html +> +> ![image-20220901173948645](assets/image-20220901173948645.png) + +**结论:**使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。 + + + + + + + + + + + +# 3. Mybatis动态SQL + +## 3.1 什么是动态SQL + +在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。 + +![](assets/image-20220901172933012.png) + +![image-20220901173203491](assets/image-20220901173203491.png) + +而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字段,其他两个字段 性别 和 入职时间没有传递,那么这两个参数的值就是null。 + +此时,执行的SQL语句为: + +![image-20220901173431554](assets/image-20220901173431554.png) + + + +这个查询结果是不正确的。正确的做法应该是:传递了参数,再组装这个查询条件;如果没有传递参数,就不应该组装这个查询条件。 + + + +比如:如果姓名输入了"张", 对应的SQL为: + +```sql +select * from emp where name like '%张%' order by update_time desc; +``` + + + +如果姓名输入了"张",,性别选择了"男",则对应的SQL为: + +```sql +select * from emp where name like '%张%' and gender = 1 order by update_time desc; +``` + + + +SQL语句会随着用户的输入或外部条件的变化而变化,我们称为:**动态SQL**。 + +![image-20221213122623278](assets/image-20221213122623278.png) + +在Mybatis中提供了很多实现动态SQL的标签,我们学习Mybatis中的动态SQL就是掌握这些动态SQL标签。 + + + + + + + +## 3.2 动态SQL-if + +`<if>`:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。 + +~~~xml + + 要拼接的sql语句 + +~~~ + +接下来,我们就通过`<if>`标签来改造之前条件查询的案例。 + +### 3.2.1 条件查询 + +示例:把SQL语句改造为动态SQL方式 + +- 原有的SQL语句 + +~~~xml + +~~~ + +- 动态SQL语句 + +~~~xml + +~~~ + +测试方法: + +~~~java +@Test +public void testList(){ + //性别数据为null、开始时间和结束时间也为null + List list = empMapper.list("张", null, null, null); + for(Emp emp : list){ + System.out.println(emp); + } +} +~~~ + +> 执行的SQL语句: +> +> ![image-20221213140353285](assets/image-20221213140353285.png) + + + +下面呢,我们修改测试方法中的代码,再次进行测试,观察执行情况: + +~~~java +@Test +public void testList(){ + //姓名为null + List list = empMapper.list(null, (short)1, null, null); + for(Emp emp : list){ + System.out.println(emp); + } +} +~~~ + + + +执行结果: + +![image-20221213141139015](assets/image-20221213141139015.png) + +![image-20221213141253355](assets/image-20221213141253355.png) + + + +再次修改测试方法中的代码,再次进行测试: + +~~~java +@Test +public void testList(){ + //传递的数据全部为null + List list = empMapper.list(null, null, null, null); + for(Emp emp : list){ + System.out.println(emp); + } +} +~~~ + +执行的SQL语句: + +![image-20221213143854434](assets/image-20221213143854434.png) + + + + + +以上问题的解决方案:使用`<where>`标签代替SQL语句中的where关键字 + +- `<where>`只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR + +~~~xml + +~~~ + +测试方法: + +~~~java +@Test +public void testList(){ + //只有性别 + List list = empMapper.list(null, (short)1, null, null); + for(Emp emp : list){ + System.out.println(emp); + } +} +~~~ + +> 执行的SQL语句: +> +> ![image-20221213141909455](assets/image-20221213141909455.png) + + + + + +### 3.2.2 更新员工 + +案例:完善更新员工功能,修改为动态更新员工数据信息 + +- 动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新 +- 解决方案:动态SQL + +修改Mapper接口: + +~~~java +@Mapper +public interface EmpMapper { + //删除@Update注解编写的SQL语句 + //update操作的SQL语句编写在Mapper映射文件中 + public void update(Emp emp); +} +~~~ + +修改Mapper映射文件: + +~~~xml + + + + + + + update emp + set + + username=#{username}, + + + name=#{name}, + + + gender=#{gender}, + + + image=#{image}, + + + job=#{job}, + + + entrydate=#{entrydate}, + + + dept_id=#{deptId}, + + + update_time=#{updateTime} + + where id=#{id} + + + +~~~ + +测试方法: + +~~~java +@Test +public void testUpdate2(){ + //要修改的员工信息 + Emp emp = new Emp(); + emp.setId(20); + emp.setUsername("Tom111"); + emp.setName("汤姆111"); + + emp.setUpdateTime(LocalDateTime.now()); + + //调用方法,修改员工数据 + empMapper.update(emp); +} +~~~ + +> 执行的SQL语句: +> +> ![image-20221213152533851](assets/image-20221213152533851.png) + + + +再次修改测试方法,观察SQL语句执行情况: + +~~~java +@Test +public void testUpdate2(){ + //要修改的员工信息 + Emp emp = new Emp(); + emp.setId(20); + emp.setUsername("Tom222"); + + //调用方法,修改员工数据 + empMapper.update(emp); +} +~~~ + +> 执行的SQL语句: +> +> ![image-20221213152850322](assets/image-20221213152850322.png) + +以上问题的解决方案:使用`<set>`标签代替SQL语句中的set关键字 + +- `<set>`:动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中) + +~~~xml + + + + + + + update emp + + + + username=#{username}, + + + name=#{name}, + + + gender=#{gender}, + + + image=#{image}, + + + job=#{job}, + + + entrydate=#{entrydate}, + + + dept_id=#{deptId}, + + + update_time=#{updateTime} + + + where id=#{id} + + +~~~ + +> 再次执行测试方法,执行的SQL语句: +> +> ![image-20221213153329553](assets/image-20221213153329553.png) + + + +**小结** + +- `<if>` + + - 用于判断条件是否成立,如果条件为true,则拼接SQL + + - 形式: + + ~~~xml + + ~~~ + +- `<where>` + + - where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR + +- `<set>` + + - 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中) + + + + + + + + + +## 3.3 动态SQL-foreach + +案例:员工删除功能(既支持删除单条记录,又支持批量删除) + +![image-20220901181751004](assets/image-20220901181751004.png) + +SQL语句: + +~~~mysql +delete from emp where id in (1,2,3); +~~~ + +Mapper接口: + +~~~java +@Mapper +public interface EmpMapper { + //批量删除 + public void deleteByIds(List ids); +} +~~~ + +XML映射文件: + +- 使用`<foreach>`遍历deleteByIds方法中传递的参数ids集合 + +~~~xml + + +~~~ + +~~~xml + + + + + + delete from emp where id in + + #{id} + + + +~~~ + +> ![image-20221213165710141](assets/image-20221213165710141.png) + +> 执行的SQL语句: +> +> ![image-20221213164957636](assets/image-20221213164957636.png) + + + + + +## 3.4 动态SQL-sql&include + +问题分析: + +- 在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码 + +![](assets/image-20220901182204358.png) + +![](assets/image-20220901182249421.png) + +我们可以对重复的代码片段进行抽取,将其通过`<sql>`标签封装到一个SQL片段,然后再通过`<include>`标签进行引用。 + +- `<sql>`:定义可重用的SQL片段 + +- `<include>`:通过属性refid,指定包含的SQL片段 + +![image-20221213171244796](assets/image-20221213171244796.png) + +SQL片段: 抽取重复的代码 + +```xml + + select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp + +``` + +然后通过`<include>` 标签在原来抽取的地方进行引用。操作如下: + +```xml + +``` + diff --git a/javaEE/day09/Mybatis/image-20250621171040447.png b/javaEE/day09/Mybatis/image-20250621171040447.png new file mode 100644 index 0000000..46b37c6 Binary files /dev/null and b/javaEE/day09/Mybatis/image-20250621171040447.png differ diff --git a/javaEE/day09/Mybatis/image-20250621171125313.png b/javaEE/day09/Mybatis/image-20250621171125313.png new file mode 100644 index 0000000..19ec827 Binary files /dev/null and b/javaEE/day09/Mybatis/image-20250621171125313.png differ diff --git a/javaEE/day09/assets/image-20220901164225644.png b/javaEE/day09/assets/image-20220901164225644.png new file mode 100644 index 0000000..fb062ad Binary files /dev/null and b/javaEE/day09/assets/image-20220901164225644.png differ diff --git a/javaEE/day09/assets/image-20220901172933012.png b/javaEE/day09/assets/image-20220901172933012.png new file mode 100644 index 0000000..ca548d0 Binary files /dev/null and b/javaEE/day09/assets/image-20220901172933012.png differ diff --git a/javaEE/day09/assets/image-20220901173203491.png b/javaEE/day09/assets/image-20220901173203491.png new file mode 100644 index 0000000..79d497e Binary files /dev/null and b/javaEE/day09/assets/image-20220901173203491.png differ diff --git a/javaEE/day09/assets/image-20220901173431554.png b/javaEE/day09/assets/image-20220901173431554.png new file mode 100644 index 0000000..e6937ec Binary files /dev/null and b/javaEE/day09/assets/image-20220901173431554.png differ diff --git a/javaEE/day09/assets/image-20220901173948645.png b/javaEE/day09/assets/image-20220901173948645.png new file mode 100644 index 0000000..1086e05 Binary files /dev/null and b/javaEE/day09/assets/image-20220901173948645.png differ diff --git a/javaEE/day09/assets/image-20220901181751004.png b/javaEE/day09/assets/image-20220901181751004.png new file mode 100644 index 0000000..121ae7b Binary files /dev/null and b/javaEE/day09/assets/image-20220901181751004.png differ diff --git a/javaEE/day09/assets/image-20220901182204358.png b/javaEE/day09/assets/image-20220901182204358.png new file mode 100644 index 0000000..a5581d1 Binary files /dev/null and b/javaEE/day09/assets/image-20220901182204358.png differ diff --git a/javaEE/day09/assets/image-20220901182249421.png b/javaEE/day09/assets/image-20220901182249421.png new file mode 100644 index 0000000..9dc0001 Binary files /dev/null and b/javaEE/day09/assets/image-20220901182249421.png differ diff --git a/javaEE/day09/assets/image-20221210180155700.png b/javaEE/day09/assets/image-20221210180155700.png new file mode 100644 index 0000000..8599bb7 Binary files /dev/null and b/javaEE/day09/assets/image-20221210180155700.png differ diff --git a/javaEE/day09/assets/image-20221210180343288.png b/javaEE/day09/assets/image-20221210180343288.png new file mode 100644 index 0000000..c33bbb8 Binary files /dev/null and b/javaEE/day09/assets/image-20221210180343288.png differ diff --git a/javaEE/day09/assets/image-20221210180515206.png b/javaEE/day09/assets/image-20221210180515206.png new file mode 100644 index 0000000..308eaf4 Binary files /dev/null and b/javaEE/day09/assets/image-20221210180515206.png differ diff --git a/javaEE/day09/assets/image-20221210182008131.png b/javaEE/day09/assets/image-20221210182008131.png new file mode 100644 index 0000000..2e65ad9 Binary files /dev/null and b/javaEE/day09/assets/image-20221210182008131.png differ diff --git a/javaEE/day09/assets/image-20221210182500817.png b/javaEE/day09/assets/image-20221210182500817.png new file mode 100644 index 0000000..6bc7b47 Binary files /dev/null and b/javaEE/day09/assets/image-20221210182500817.png differ diff --git a/javaEE/day09/assets/image-20221210183336095.png b/javaEE/day09/assets/image-20221210183336095.png new file mode 100644 index 0000000..47c2f28 Binary files /dev/null and b/javaEE/day09/assets/image-20221210183336095.png differ diff --git a/javaEE/day09/assets/image-20221210202222206.png b/javaEE/day09/assets/image-20221210202222206.png new file mode 100644 index 0000000..061c399 Binary files /dev/null and b/javaEE/day09/assets/image-20221210202222206.png differ diff --git a/javaEE/day09/assets/image-20221210205419634.png b/javaEE/day09/assets/image-20221210205419634.png new file mode 100644 index 0000000..e9621e0 Binary files /dev/null and b/javaEE/day09/assets/image-20221210205419634.png differ diff --git a/javaEE/day09/assets/image-20221210211605231.png b/javaEE/day09/assets/image-20221210211605231.png new file mode 100644 index 0000000..b8e0c87 Binary files /dev/null and b/javaEE/day09/assets/image-20221210211605231.png differ diff --git a/javaEE/day09/assets/image-20221210212406527.png b/javaEE/day09/assets/image-20221210212406527.png new file mode 100644 index 0000000..516072f Binary files /dev/null and b/javaEE/day09/assets/image-20221210212406527.png differ diff --git a/javaEE/day09/assets/image-20221210212511915.png b/javaEE/day09/assets/image-20221210212511915.png new file mode 100644 index 0000000..ead4fdf Binary files /dev/null and b/javaEE/day09/assets/image-20221210212511915.png differ diff --git a/javaEE/day09/assets/image-20221210213311518.png b/javaEE/day09/assets/image-20221210213311518.png new file mode 100644 index 0000000..bbff7d3 Binary files /dev/null and b/javaEE/day09/assets/image-20221210213311518.png differ diff --git a/javaEE/day09/assets/image-20221210214431228.png b/javaEE/day09/assets/image-20221210214431228.png new file mode 100644 index 0000000..0071d87 Binary files /dev/null and b/javaEE/day09/assets/image-20221210214431228.png differ diff --git a/javaEE/day09/assets/image-20221211124744203.png b/javaEE/day09/assets/image-20221211124744203.png new file mode 100644 index 0000000..fcd0a61 Binary files /dev/null and b/javaEE/day09/assets/image-20221211124744203.png differ diff --git a/javaEE/day09/assets/image-20221211124840720.png b/javaEE/day09/assets/image-20221211124840720.png new file mode 100644 index 0000000..e171d0d Binary files /dev/null and b/javaEE/day09/assets/image-20221211124840720.png differ diff --git a/javaEE/day09/assets/image-20221211125751981.png b/javaEE/day09/assets/image-20221211125751981.png new file mode 100644 index 0000000..9eb9841 Binary files /dev/null and b/javaEE/day09/assets/image-20221211125751981.png differ diff --git a/javaEE/day09/assets/image-20221211130011973.png b/javaEE/day09/assets/image-20221211130011973.png new file mode 100644 index 0000000..fcd3011 Binary files /dev/null and b/javaEE/day09/assets/image-20221211130011973.png differ diff --git a/javaEE/day09/assets/image-20221211134239610.png b/javaEE/day09/assets/image-20221211134239610.png new file mode 100644 index 0000000..e9f02e9 Binary files /dev/null and b/javaEE/day09/assets/image-20221211134239610.png differ diff --git a/javaEE/day09/assets/image-20221211134746319.png b/javaEE/day09/assets/image-20221211134746319.png new file mode 100644 index 0000000..338d066 Binary files /dev/null and b/javaEE/day09/assets/image-20221211134746319.png differ diff --git a/javaEE/day09/assets/image-20221211140222240.png b/javaEE/day09/assets/image-20221211140222240.png new file mode 100644 index 0000000..bc4bed0 Binary files /dev/null and b/javaEE/day09/assets/image-20221211140222240.png differ diff --git a/javaEE/day09/assets/image-20221211150353385.png b/javaEE/day09/assets/image-20221211150353385.png new file mode 100644 index 0000000..f2de15e Binary files /dev/null and b/javaEE/day09/assets/image-20221211150353385.png differ diff --git a/javaEE/day09/assets/image-20221212093655389.png b/javaEE/day09/assets/image-20221212093655389.png new file mode 100644 index 0000000..d757c84 Binary files /dev/null and b/javaEE/day09/assets/image-20221212093655389.png differ diff --git a/javaEE/day09/assets/image-20221212095605863.png b/javaEE/day09/assets/image-20221212095605863.png new file mode 100644 index 0000000..e8c9cfd Binary files /dev/null and b/javaEE/day09/assets/image-20221212095605863.png differ diff --git a/javaEE/day09/assets/image-20221212101331292.png b/javaEE/day09/assets/image-20221212101331292.png new file mode 100644 index 0000000..6fbf6e7 Binary files /dev/null and b/javaEE/day09/assets/image-20221212101331292.png differ diff --git a/javaEE/day09/assets/image-20221212103004961.png b/javaEE/day09/assets/image-20221212103004961.png new file mode 100644 index 0000000..c36ccb2 Binary files /dev/null and b/javaEE/day09/assets/image-20221212103004961.png differ diff --git a/javaEE/day09/assets/image-20221212103124490.png b/javaEE/day09/assets/image-20221212103124490.png new file mode 100644 index 0000000..e7960ec Binary files /dev/null and b/javaEE/day09/assets/image-20221212103124490.png differ diff --git a/javaEE/day09/assets/image-20221212111027396.png b/javaEE/day09/assets/image-20221212111027396.png new file mode 100644 index 0000000..e94669a Binary files /dev/null and b/javaEE/day09/assets/image-20221212111027396.png differ diff --git a/javaEE/day09/assets/image-20221212113422924.png b/javaEE/day09/assets/image-20221212113422924.png new file mode 100644 index 0000000..b8795d5 Binary files /dev/null and b/javaEE/day09/assets/image-20221212113422924.png differ diff --git a/javaEE/day09/assets/image-20221212115149151.png b/javaEE/day09/assets/image-20221212115149151.png new file mode 100644 index 0000000..7d344e4 Binary files /dev/null and b/javaEE/day09/assets/image-20221212115149151.png differ diff --git a/javaEE/day09/assets/image-20221212120006242.png b/javaEE/day09/assets/image-20221212120006242.png new file mode 100644 index 0000000..12a13e9 Binary files /dev/null and b/javaEE/day09/assets/image-20221212120006242.png differ diff --git a/javaEE/day09/assets/image-20221212150611796.png b/javaEE/day09/assets/image-20221212150611796.png new file mode 100644 index 0000000..389ddde Binary files /dev/null and b/javaEE/day09/assets/image-20221212150611796.png differ diff --git a/javaEE/day09/assets/image-20221212151156273.png b/javaEE/day09/assets/image-20221212151156273.png new file mode 100644 index 0000000..00f8f05 Binary files /dev/null and b/javaEE/day09/assets/image-20221212151156273.png differ diff --git a/javaEE/day09/assets/image-20221212151411154.png b/javaEE/day09/assets/image-20221212151411154.png new file mode 100644 index 0000000..0c0c557 Binary files /dev/null and b/javaEE/day09/assets/image-20221212151411154.png differ diff --git a/javaEE/day09/assets/image-20221212151628715.png b/javaEE/day09/assets/image-20221212151628715.png new file mode 100644 index 0000000..8090199 Binary files /dev/null and b/javaEE/day09/assets/image-20221212151628715.png differ diff --git a/javaEE/day09/assets/image-20221212151736274.png b/javaEE/day09/assets/image-20221212151736274.png new file mode 100644 index 0000000..bb40315 Binary files /dev/null and b/javaEE/day09/assets/image-20221212151736274.png differ diff --git a/javaEE/day09/assets/image-20221212153529732.png b/javaEE/day09/assets/image-20221212153529732.png new file mode 100644 index 0000000..e36b2d7 Binary files /dev/null and b/javaEE/day09/assets/image-20221212153529732.png differ diff --git a/javaEE/day09/assets/image-20221212154908306.png b/javaEE/day09/assets/image-20221212154908306.png new file mode 100644 index 0000000..0ca94a8 Binary files /dev/null and b/javaEE/day09/assets/image-20221212154908306.png differ diff --git a/javaEE/day09/assets/image-20221212155304635.png b/javaEE/day09/assets/image-20221212155304635.png new file mode 100644 index 0000000..5e3771d Binary files /dev/null and b/javaEE/day09/assets/image-20221212155304635.png differ diff --git a/javaEE/day09/assets/image-20221212155544404.png b/javaEE/day09/assets/image-20221212155544404.png new file mode 100644 index 0000000..41807c2 Binary files /dev/null and b/javaEE/day09/assets/image-20221212155544404.png differ diff --git a/javaEE/day09/assets/image-20221212160316644.png b/javaEE/day09/assets/image-20221212160316644.png new file mode 100644 index 0000000..54530f3 Binary files /dev/null and b/javaEE/day09/assets/image-20221212160316644.png differ diff --git a/javaEE/day09/assets/image-20221212163528787.png b/javaEE/day09/assets/image-20221212163528787.png new file mode 100644 index 0000000..26d1317 Binary files /dev/null and b/javaEE/day09/assets/image-20221212163528787.png differ diff --git a/javaEE/day09/assets/image-20221212163719534.png b/javaEE/day09/assets/image-20221212163719534.png new file mode 100644 index 0000000..bf60b13 Binary files /dev/null and b/javaEE/day09/assets/image-20221212163719534.png differ diff --git a/javaEE/day09/assets/image-20221213120923252.png b/javaEE/day09/assets/image-20221213120923252.png new file mode 100644 index 0000000..6e2cd81 Binary files /dev/null and b/javaEE/day09/assets/image-20221213120923252.png differ diff --git a/javaEE/day09/assets/image-20221213121521406.png b/javaEE/day09/assets/image-20221213121521406.png new file mode 100644 index 0000000..52c4c38 Binary files /dev/null and b/javaEE/day09/assets/image-20221213121521406.png differ diff --git a/javaEE/day09/assets/image-20221213122623278.png b/javaEE/day09/assets/image-20221213122623278.png new file mode 100644 index 0000000..2815100 Binary files /dev/null and b/javaEE/day09/assets/image-20221213122623278.png differ diff --git a/javaEE/day09/assets/image-20221213140353285.png b/javaEE/day09/assets/image-20221213140353285.png new file mode 100644 index 0000000..b1f8c35 Binary files /dev/null and b/javaEE/day09/assets/image-20221213140353285.png differ diff --git a/javaEE/day09/assets/image-20221213141139015.png b/javaEE/day09/assets/image-20221213141139015.png new file mode 100644 index 0000000..0325c66 Binary files /dev/null and b/javaEE/day09/assets/image-20221213141139015.png differ diff --git a/javaEE/day09/assets/image-20221213141253355.png b/javaEE/day09/assets/image-20221213141253355.png new file mode 100644 index 0000000..b335252 Binary files /dev/null and b/javaEE/day09/assets/image-20221213141253355.png differ diff --git a/javaEE/day09/assets/image-20221213141909455.png b/javaEE/day09/assets/image-20221213141909455.png new file mode 100644 index 0000000..9b3e90b Binary files /dev/null and b/javaEE/day09/assets/image-20221213141909455.png differ diff --git a/javaEE/day09/assets/image-20221213143854434.png b/javaEE/day09/assets/image-20221213143854434.png new file mode 100644 index 0000000..9688f44 Binary files /dev/null and b/javaEE/day09/assets/image-20221213143854434.png differ diff --git a/javaEE/day09/assets/image-20221213152533851.png b/javaEE/day09/assets/image-20221213152533851.png new file mode 100644 index 0000000..282105e Binary files /dev/null and b/javaEE/day09/assets/image-20221213152533851.png differ diff --git a/javaEE/day09/assets/image-20221213152850322.png b/javaEE/day09/assets/image-20221213152850322.png new file mode 100644 index 0000000..212f625 Binary files /dev/null and b/javaEE/day09/assets/image-20221213152850322.png differ diff --git a/javaEE/day09/assets/image-20221213153329553.png b/javaEE/day09/assets/image-20221213153329553.png new file mode 100644 index 0000000..be08452 Binary files /dev/null and b/javaEE/day09/assets/image-20221213153329553.png differ diff --git a/javaEE/day09/assets/image-20221213164957636.png b/javaEE/day09/assets/image-20221213164957636.png new file mode 100644 index 0000000..2ca9033 Binary files /dev/null and b/javaEE/day09/assets/image-20221213164957636.png differ diff --git a/javaEE/day09/assets/image-20221213165710141.png b/javaEE/day09/assets/image-20221213165710141.png new file mode 100644 index 0000000..ad11720 Binary files /dev/null and b/javaEE/day09/assets/image-20221213165710141.png differ diff --git a/javaEE/day09/assets/image-20221213171244796.png b/javaEE/day09/assets/image-20221213171244796.png new file mode 100644 index 0000000..4c1523f Binary files /dev/null and b/javaEE/day09/assets/image-20221213171244796.png differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】.md b/javaSE1/day01/day01【前言、入门程序、常量、变量】.md new file mode 100644 index 0000000..49435b9 --- /dev/null +++ b/javaSE1/day01/day01【前言、入门程序、常量、变量】.md @@ -0,0 +1,493 @@ +# day01【前言、入门程序、常量、变量】 + +### 今日内容 + +- Java语言的发展历史 +- Java开发环境搭建 +- 编写HelloWorld程序 +- 常量和变量 + +### 教学目标 + +* [ ] 能够计算二进制和十进制数之间的互转 +* [ ] 能够使用常见的DOS命令 +* [ ] 理解Java语言的跨平台实现原理 +* [ ] 理解JDK和JRE的组成和作用 +* [ ] 能够配置环境变量JAVA_HOME +* [ ] 能够编写HelloWorld程序编译并执行 +* [ ] 理解关键字的含义 +* [ ] 理解标识符的含义 +* [ ] 能够定义出所有类型的常量 +* [ ] 理解Java中的基本数据类型分类 +* [ ] 能够定义8种基本数据集类型的变量 + + +## 第一章 开发前言 + +### 1.1 Java语言概述 + +#### 什么是Java语言 + +Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级的编程语言。所谓编程语言,是计算机的语言,人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。 + +#### Java语言发展历史 + +* 1995年Sun公司发布Java1.0版本 +* 1997年发布Java 1.1版本 +* 1998年发布Java 1.2版本 +* 2000年发布Java 1.3版本 +* 2002年发布Java 1.4版本 +* 2004年发布Java 1.5版本 +* 2006年发布Java 1.6版本 +* 2009年Oracle甲骨文公司收购Sun公司,并于2011发布Java 1.7版本 +* 2014年发布Java 1.8版本 +* 2017年发布Java 9版本 +* 2018年发布Java 10,11版本 +* 2019年发布Java 12,13版本 +* 2020年发布Java 14,15版本 +* 2021年发布Java 16,17版本 +* 2022年发布Java 18,19版本 +* 2023年发布Java 20版本 + +#### Java语言能做什么 + +Java语言主要应用在互联网程序的开发领域。常见的互联网程序比如天猫、京东、物流系统、网银系统等,以及服务器后台处理大数据的存储、查询、数据挖掘等也有很多应用。 + +![](day01【前言、入门程序、常量、变量】/京东.jpg) + +![天猫](day01【前言、入门程序、常量、变量】/天猫.jpg) + +![运单查询](day01【前言、入门程序、常量、变量】/运单查询.jpg) + +![网银](day01【前言、入门程序、常量、变量】/网银.jpg) + +### 1.2 计算机基础知识 + +#### 二进制 + +计算机中的数据不同于人们生活中的数据,人们生活采用十进制数,而计算机中全部采用二进制数表示,它只包含0、1两个数,逢二进一,1+1=10。每一个0或者每一个1,叫做一个bit(比特)。 + +下面了解一下十进制和二进制数据之间的转换计算。 + +* **十进制数据转成二进制数据:**使用除以2获取余数的方式 + +![十进制转二进制](day01【前言、入门程序、常量、变量】/十进制转二进制.jpg) + +* **二进制数据转成十进制数据:**使用8421编码的方式 + +![二进制转十进制](day01【前言、入门程序、常量、变量】/二进制转十进制.jpg) + +> 小贴士: +> +> 二进制数系统中,每个0或1就是一个位,叫做bit(比特)。 + +#### 字节 + +字节是我们常见的计算机中最小存储单元。计算机存储任何的数据,都是以字节的形式存储,右键点击文件属性,我们可以查看文件的字节大小。 + +8个bit(二进制位) 0000-0000表示为1个字节,写成**1 byte**或者**1 B**。 + +* 8 bit = 1 B +* 1024 B =1 KB +* 1024 KB =1 MB +* 1024 MB =1 GB +* 1024 GB = 1 TB + +#### 常用DOS命令 + +Java语言的初学者,学习一些DOS命令,会非常有帮助。DOS是一个早期的操作系统,现在已经被Windows系统取代,对于我们开发人员,目前需要在DOS中完成一些事情,因此就需要掌握一些必要的命令。 + +* **进入DOS操作窗口** + + * 按下Windows+R键盘,打开运行窗口,输入cmd回车,进入到DOS的操作窗口。 + + ![运行窗口](day01【前言、入门程序、常量、变量】/运行窗口.jpg) + + * 打开DOS命令行后,看到一个路径 c:\user 就表示我们现在操作的磁盘是c盘。 + +![dos命令行](day01【前言、入门程序、常量、变量】/dos命令行.jpg) + +* **常用命令** + + | 命令 | 操作符号 | + | ---------------- | ------------- | + | 盘符切换命令 | `盘符名:` | + | 查看当前文件夹 | ` dir` | + | 进入文件夹命令 | `cd 文件夹名` | + | 退出文件夹命令 | `cd..` | + | 退出到磁盘根目录 | `cd\` | + | 清屏 | `cls` | + + + +## 第二章 Java语言开发环境搭建 + +### 2.1 Java虚拟机——JVM + +* **JVM**(Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在`JVM` 之上。 + + +* **跨平台**:任何软件的运行,都必须要运行在操作系统之上,而我们用Java编写的软件可以运行在任何的操作系统上,这个特性称为**Java语言的跨平台特性**。该特性是由JVM实现的,我们编写的程序运行在JVM上,而JVM运行在操作系统上。![跨平台](day01【前言、入门程序、常量、变量】/跨平台.jpg) + +如图所示,Java的虚拟机本身不具备跨平台功能的,每个操作系统下都有不同版本的虚拟机。 + +### 2.2 JRE 和 JDK + +* **JRE** (Java Runtime Environment) :是Java程序的运行时环境,包含`JVM` 和运行时所需要的`核心类库` 。 +* **JDK** (Java Development Kit):是Java程序开发工具包,包含`JRE` 和开发人员使用的工具。 + +我们想要运行一个已有的Java程序,那么只需安装`JRE` 即可。 + +我们想要开发一个全新的Java程序,那么必须安装`JDK` 。 + +![JDKJRE](day01【前言、入门程序、常量、变量】/JDKJRE.jpg) + +> 小贴士: +> +> 三者关系: JDK > JRE > JVM + +### 2.3 JDK9安装图解 + +![jdk1](day01【前言、入门程序、常量、变量】/jdk1.jpg) + +![jdk2](day01【前言、入门程序、常量、变量】/jdk2.jpg) + +![jdk3](day01【前言、入门程序、常量、变量】/jdk3.jpg) + +![jdk4](day01【前言、入门程序、常量、变量】/jdk4.jpg) + +![jdk5](day01【前言、入门程序、常量、变量】/jdk5.jpg) + +> 小贴士: +> +> 安装路径中,不要包含中文和空格。 + +### 2.4 JAVA_HOME环境变量的配置 + +#### **配置环境变量作用** + +开发Java程序,需要使用JDK中提供的工具,工具在JDK9安装目录的`bin` 目录下。 + +![开发工具](day01【前言、入门程序、常量、变量】/开发工具.jpg) + +在DOS命令行下使用这些工具,就要先进入到JDK的bin目录下,这个过程就会非常的麻烦。 + +![环境变量1](day01【前言、入门程序、常量、变量】/环境变量1.jpg) + +不进入JDK的`bin`目录,这些工具就不能使用,会报错。 + +![环境变量2](day01【前言、入门程序、常量、变量】/环境变量2.jpg) + +为了开发方便,我们想**在任意的目录下都可以使用JDK的开发工具**,则必须要配置环境变量,配置环境变量的意义在于告诉操作系统,我们使用的JDK开发工具在哪个目录下。 + +#### 配置环境变量步骤 + +##### Windows 7,8版本 + +1. 计算机鼠标右键,选择`属性 ` + +![环境变量3](day01【前言、入门程序、常量、变量】/环境变量3.jpg) + +2. 选择`高级系统设置` + +![环境变量4](day01【前言、入门程序、常量、变量】/环境变量4.jpg) + +3. `高级` 选项卡,点击`环境变量` + +![环境变量5](day01【前言、入门程序、常量、变量】/环境变量5.jpg) + +4. 点击`新建` ,创建新的环境变量 + +![环境变量6](day01【前言、入门程序、常量、变量】/环境变量6.jpg) + +5. 变量名输入`JAVA_HOME`,变量值输入JDK9的安装目录 `c:\Java9\jdk-9.0.1` + +![环境变量7](day01【前言、入门程序、常量、变量】/环境变量7.jpg) + +6. 选中`Path` 环境变量,`双击`或者`点击编辑` + +![环境变量8](day01【前言、入门程序、常量、变量】/环境变量8.jpg) + +7. 在变量值的最前面,键入`%JAVA_HOME%\bin;` 分号必须要写,必须是英文格式。 + +![环境变量9](day01【前言、入门程序、常量、变量】/环境变量9.jpg) + +8. 环境变量配置完成,重新开启DOS命令行,在任意目录下输入`javac` 命令,运行成功。 + +![环境变量10](day01【前言、入门程序、常量、变量】/环境变量10.jpg) + +##### Windows 10 版本 + +1. 文件资源管理器 --> 此电脑鼠标右键 --> 选择`属性 ` + +![5](day01【前言、入门程序、常量、变量】/win10-01.jpg) + +2. 选择`高级系统设置` --> 选择 `环境变量` + +![4](day01【前言、入门程序、常量、变量】/win10-02.jpg) + +3. 点击下方系统变量的 `新建` ,创建新的环境变量,变量名输入`JAVA_HOME`,变量值输入JDK9的安装目录 `D:\02_DevelopTools\Java\jdk-9.0.1` + +![3](day01【前言、入门程序、常量、变量】/win10-03.jpg) + +4. 选中`Path` 环境变量,`双击`或者`点击编辑` + +![2](day01【前言、入门程序、常量、变量】/win10-04.jpg) + +5. 点击` 新建`,键入`%JAVA_HOME%\bin` ,必须是英文格式。选中该行,上移到最上方,点击确定。 + +![1](day01【前言、入门程序、常量、变量】/win10-05.jpg) + +6. 环境变量配置完成,重新开启DOS命令行,在任意目录下输入`javac` 命令。 + +![环境变量10](day01【前言、入门程序、常量、变量】/环境变量10.jpg) + + + +## 第三章 HelloWorld入门程序 + +### 3.1 程序开发步骤说明 + +开发环境已经搭建完毕,可以开发我们第一个Java程序了。 + +Java程序开发三步骤:**编写**、**编译**、**运行**。 + +![开发步骤](day01【前言、入门程序、常量、变量】/开发步骤.jpg) + +### 3.2 编写Java源程序 + +1. 在`d:\day01` 目录下新建文本文件,完整的文件名修改为`HelloWorld.java`,其中文件名为`HelloWorld`,后缀名必须为`.java` 。 +2. 用记事本打开 + +> 使用notepad++记事本软件。 + +3. 在文件中键入文本并保存,代码如下: + +```java +public class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello World!"); + } +} + +``` + +> 文件名必须是`HelloWorld` ,保证文件名和类的名字是一致的,注意大小写。 +> +> 每个字母和符号必须与示例代码一模一样。 + +第一个`HelloWord` 源程序就编写完成了,但是这个文件是程序员编写的,JVM是看不懂的,也就不能运行,因此我们必须将编写好的`Java源文件` 编译成JVM可以看懂的`字节码文件` 。 + +### 3.3 编译Java源文件 + +在DOS命令行中,**进入Java源文件的目录**,使用`javac` 命令进行编译。 + +命令: + +```java +javac Java源文件名.后缀名 +``` + +举例: + +``` +javac HelloWorld.java +``` + +![编译](day01【前言、入门程序、常量、变量】/编译.jpg) + +编译成功后,命令行没有任何提示。打开`d:\day01`目录,发现产生了一个新的文件 `HelloWorld.class`,该文件就是编译后的文件,是Java的可运行文件,称为**字节码文件**,有了字节码文件,就可以运行程序了。 + +> Java源文件的编译工具`javac.exe`,在JDK安装目录的bin目录下。但是由于配置了环境变量,可以再任意目录下使用。 + +### 3.4 运行Java程序 + +在DOS命令行中,**进入Java源文件的目录**,使用`java` 命令进行运行。 + +命令: + +```java +java 类名字 +``` + +举例: + +``` +java HelloWorld +``` + +> java HelloWord 不要写 不要写 不要写 .class + +![运行](day01【前言、入门程序、常量、变量】/运行.jpg) + +> Java程序`.class文件` 的运行工具`java.exe` ,在JDK安装目录的bin目录下。但是由于配置了环境变量,可以再任意目录下使用。 + +### 3.5 入门程序说明 + +#### 编译和运行是两回事 + +* **编译**:是指将我们编写的Java源文件翻译成JVM认识的class文件,在这个过程中,`javac` 编译器会检查我们所写的程序是否有错误,有错误就会提示出来,如果没有错误就会编译成功。 +* **运行**:是指将`class文件` 交给JVM去运行,此时JVM就会去执行我们编写的程序了。 + +#### 关于main方法 + +* **main方法**:称为主方法。写法是**固定格式**不可以更改。main方法是程序的入口点或起始点,无论我们编写多少程序,JVM在运行的时候,都会从main方法这里开始执行。 + +### 3.6 添加注释comment + +* **注释**:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行。 +* Java中有单行注释和多行注释 + * 单行注释以 `//开头 换行结束` + * 多行注释以 `/*开头 以*/结束` + +### 3.7 关键字keywords + +* **关键字**:是指在程序中,Java已经定义好的单词,具有特殊含义。 + * HelloWorld案例中,出现的关键字有 `public ` 、`class` 、 `static` 、 `void` 等,这些单词已经被Java定义好,全部都是小写字母,notepad++中颜色特殊。 + * 关键字比较多,不能死记硬背,学到哪里记到哪里即可。 + +### 3.8 标识符 + +* **标识符**:是指在程序中,我们自己定义内容。比如类的名字、方法的名字和变量的名字等等,都是标识符。 + * HelloWorld案例中,出现的标识符有类名字`HelloWorld` 。 +* **命名规则:`硬性要求`** + * 标识符可以包含`英文字母26个(区分大小写)`、`0-9数字` 、`$(美元符号)`和`_(下划线)`。 + * 标识符不能以数字开头。 + * 标识符不能是关键字。 +* **命名规范:`软性建议`** + * 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。 + * 方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。 + * 变量名规范:全部小写。 + +## 第四章 常量 + +### 4.1 概述 + +**常量:是指在Java程序中固定不变的数据**。 + +### 4.2 分类 + +| 类型 | 含义 | 数据举例 | +| :--------- | :------------------------------------- | :-------------------------- | +| 整数常量 | 所有的整数 | 0,1, 567, -9 | +| 小数常量 | 所有的小数 | 0.0, -0.1, 2.55 | +| 字符常量 | 单引号引起来,只能写一个字符,必须有内容 | 'a' , ' ', '好' | +| 字符串常量 | 双引号引起来,可以写多个字符,也可以不写 | "A" ,"Hello" ,"你好" ,"" | +| 布尔常量 | 只有两个值(流程控制中讲解) | true , false | +| 空常量 | 只有一个值(引用数据类型中讲解) | null | + +### 4.3 练习 + +需求:输出各种类型的常量。 + +```java +public class ConstantDemo { + public static void main(String[] args){ + //输出整数常量 + System.out.println(123); + //输出小数常量 + System.out.println(0.125); + //输出字符常量 + System.out.println('A'); + //输出布尔常量 + System.out.println(true); + //输出字符串常量 + System.out.println("你好Java"); + } +} + +``` + +## 第五章 变量和数据类型 + +### 5.1 变量概述 + +* **变量:常量是固定不变的数据,那么在程序中可以变化的量称为变量。** + +> 数学中,可以使用字母代替数字运算,例如 x=1+5 或者 6=x+5。 +> +> 程序中,可以使用字母保存数字的方式进行运算,提高计算能力,可以解决更多的问题。比如x保存5,x也可以保存6,这样x保存的数据是可以改变的,也就是我们所讲解的变量。 + +Java中要求一个变量每次只能保存一个数据,必须要明确保存的数据类型。 + +### 5.2 数据类型 + +#### 数据类型分类 + +Java的数据类型分为两大类: + +* **基本数据类型**:包括 `整数`、`浮点数`、`字符`、`布尔`。 +* **引用数据类型**:包括 `类`、`数组`、`接口`。 + +#### 基本数据类型 + +四类八种基本数据类型: + +| 数据类型 | 关键字 | 内存占用 | 取值范围 | +| :----------- | :------------- | :------- | :--------------------- | +| 字节型 | byte | 1个字节 | -128~127 | +| 短整型 | short | 2个字节 | -32768~32767 | +| 整型 | int(默认) | 4个字节 | -231次方~2的31次方-1 | +| 长整型 | long | 8个字节 | -2的63次方~2的63次方-1 | +| 单精度浮点数 | float | 4个字节 | 1.4013E-45~3.4028E+38 | +| 双精度浮点数 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 | +| 字符型 | char | 2个字节 | 0-65535 | +| 布尔类型 | boolean | 1个字节 | true,false | + +> Java中的默认类型:整数类型是`int` 、浮点类型是`double` 。 + + +### 5.3 变量的定义 + +变量定义的格式包括三个要素:`数据类型` 、 `变量名` 、 ` 数据值` 。 + +#### 格式 + +```java +数据类型 变量名 = 数据值; +``` + +#### 练习 + +定义所有基本数据类型的变量,代码如下: + +```java +public class Variable { + public static void main(String[] args){ + //定义字节型变量 + byte b = 100; + System.out.println(b); + //定义短整型变量 + short s = 1000; + System.out.println(s); + //定义整型变量 + int i = 123456; + System.out.println(i); + //定义长整型变量 + long l = 12345678900L; + System.out.println(l); + //定义单精度浮点型变量 + float f = 5.5F; + System.out.println(f); + //定义双精度浮点型变量 + double d = 8.5; + System.out.println(d); + //定义布尔型变量 + boolean bool = false; + System.out.println(bool); + //定义字符型变量 + char c = 'A'; + System.out.println(c); + } +} +``` + +> long类型:建议数据后加L表示。 +> +> float类型:建议数据后加F表示。 + +### 5.4 注意事项 + +* 变量名称:在同一个大括号范围内,变量的名字不可以相同。 +* 变量赋值:定义的变量,不赋值不能使用。 + diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/JDKJRE.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/JDKJRE.jpg new file mode 100644 index 0000000..38d45dd Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/JDKJRE.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/dos命令行.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/dos命令行.jpg new file mode 100644 index 0000000..9b78727 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/dos命令行.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk1.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk1.jpg new file mode 100644 index 0000000..cfc4e09 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk1.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk2.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk2.jpg new file mode 100644 index 0000000..9941f58 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk2.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk3.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk3.jpg new file mode 100644 index 0000000..63e02b4 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk3.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk4.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk4.jpg new file mode 100644 index 0000000..5df134c Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk4.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk5.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk5.jpg new file mode 100644 index 0000000..7f0c4e0 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/jdk5.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-01.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-01.jpg new file mode 100644 index 0000000..f850904 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-01.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-02.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-02.jpg new file mode 100644 index 0000000..4fa342a Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-02.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-03.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-03.jpg new file mode 100644 index 0000000..3c90153 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-03.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-04.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-04.jpg new file mode 100644 index 0000000..080fc38 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-04.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-05.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-05.jpg new file mode 100644 index 0000000..b8bb880 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/win10-05.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/二进制转十进制.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/二进制转十进制.jpg new file mode 100644 index 0000000..c20bf13 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/二进制转十进制.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/京东.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/京东.jpg new file mode 100644 index 0000000..ea24577 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/京东.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/十进制转二进制.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/十进制转二进制.jpg new file mode 100644 index 0000000..d262fe6 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/十进制转二进制.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/天猫.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/天猫.jpg new file mode 100644 index 0000000..7b66a7e Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/天猫.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/开发工具.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/开发工具.jpg new file mode 100644 index 0000000..e9828a3 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/开发工具.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/开发步骤.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/开发步骤.jpg new file mode 100644 index 0000000..f9de4b6 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/开发步骤.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/数据类型.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/数据类型.jpg new file mode 100644 index 0000000..6059e5f Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/数据类型.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量1.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量1.jpg new file mode 100644 index 0000000..62c8614 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量1.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量10.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量10.jpg new file mode 100644 index 0000000..f6b3b6c Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量10.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量2.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量2.jpg new file mode 100644 index 0000000..8753ffd Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量2.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量3.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量3.jpg new file mode 100644 index 0000000..2f56bb7 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量3.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量4.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量4.jpg new file mode 100644 index 0000000..7175e80 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量4.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量5.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量5.jpg new file mode 100644 index 0000000..b117ca3 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量5.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量6.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量6.jpg new file mode 100644 index 0000000..25b428d Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量6.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量7.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量7.jpg new file mode 100644 index 0000000..63920fb Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量7.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量8.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量8.jpg new file mode 100644 index 0000000..15ce724 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量8.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量9.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量9.jpg new file mode 100644 index 0000000..1f7fe74 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/环境变量9.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/编译.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/编译.jpg new file mode 100644 index 0000000..2d93213 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/编译.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/网银.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/网银.jpg new file mode 100644 index 0000000..f78c144 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/网银.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/跨平台.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/跨平台.jpg new file mode 100644 index 0000000..33887e1 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/跨平台.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/运单查询.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/运单查询.jpg new file mode 100644 index 0000000..9d4ded7 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/运单查询.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/运行.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/运行.jpg new file mode 100644 index 0000000..1f70752 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/运行.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/运行窗口.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/运行窗口.jpg new file mode 100644 index 0000000..e96e5c5 Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/运行窗口.jpg differ diff --git a/javaSE1/day01/day01【前言、入门程序、常量、变量】/韵达快递.jpg b/javaSE1/day01/day01【前言、入门程序、常量、变量】/韵达快递.jpg new file mode 100644 index 0000000..8f9890c Binary files /dev/null and b/javaSE1/day01/day01【前言、入门程序、常量、变量】/韵达快递.jpg differ diff --git a/javaSE1/day02/day02【数据类型转换、运算符、方法入门】.md b/javaSE1/day02/day02【数据类型转换、运算符、方法入门】.md new file mode 100644 index 0000000..3671ca0 --- /dev/null +++ b/javaSE1/day02/day02【数据类型转换、运算符、方法入门】.md @@ -0,0 +1,466 @@ +# day02 【数据类型转换、运算符、方法入门】 + +### 今日内容 + +- 数据类型转换 +- 算数运算符 +- 比较运算符 +- 逻辑运算符 +- 三元运算符 +- 简单方法定义和调用 + +### 教学目标 + +- [ ] 理解数据类型的强制转换 +- [ ] 理解数据类型的自动转换 +- [ ] 了解ASCII编码表 +- [ ] 理解int类型和char类型的运算原理 +- [ ] 理解运算符++ --的运算方式 +- [ ] 理解+符号在字符串中的作用 +- [ ] 理解比较运算符 +- [ ] 理解逻辑运算符 +- [ ] 掌握三元运算符的格式和计算结果 +- [ ] 了解方法的概念 +- [ ] 掌握无返回值无参数方法的定义格式 +- [ ] 了解方法定义的注意事项 +## 第一章 数据类型转换 + +Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。 + +### 1.1 自动转换 + + 一个`int` 类型变量和一个`byte`类型变量进行加法运算, 结果会是什么数据类型? + +```java +int i = 1; +byte b = 2; +``` + +运算结果,变量的类型将是`int` 类型,这就是出现了数据类型的自动类型转换现象。 + +* **自动转换**:将`取值范围小的类型`自动提升为`取值范围大的类型` 。 + +```java +public static void main(String[] args) { + int i = 1; + byte b = 2; + // byte x = b + i; // 报错 + //int类型和byte类型运算,结果是int类型 + int j = b + i; + System.out.println(j); +} + +``` + +#### 转换原理图解 + +`byte` 类型内存占有1个字节,在和`int` 类型运算时会提升为`int`类型 ,自动补充3个字节,因此计算后的结果还是`int` 类型。 + +![](img/类型自动提升.jpg) + +同样道理,当一个`int` 类型变量和一个`double` 变量运算时,`int` 类型将会自动提升为`double` 类型进行运算。 + +```java +public static void main(String[] args) { + int i = 1; + double d = 2.5; + //int类型和double类型运算,结果是double类型 + //int类型会提升为double类型 + double e = d+i; + System.out.println(e); +} +``` +#### 转换规则 + +范围小的类型向范围大的类型提升,`byte、short、char` 运算时直接提升为`int` 。 + +```java +byte、short、char-->int-->long-->float-->double +``` + +### 1.2 强制转换 + +将`1.5` 赋值到`int` 类型变量会发生什么?产生编译失败,肯定无法赋值。 + +```java +int i = 1.5; // 错误 +``` + +`double` 类型内存8个字节,`int` 类型内存4个字节。`1.5` 是`double` 类型,取值范围大于`int` 。可以理解为`double` 是8升的水壶,`int` 是4升的水壶,不能把大水壶中的水直接放进小水壶去。 + +想要赋值成功,只有通过强制类型转换,将`double` 类型强制转换成`int` 类型才能赋值。 + +* **强制类型转换**:将`取值范围大的类型`强制转换成`取值范围小的类型`。 + + 比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。 + +**转换格式:** + +```java +数据类型 变量名 = (数据类型)被转数据值; +``` + +将`1.5` 赋值到`int` 类型,代码修改为: + +```java +// double类型数据强制转成int类型,直接去掉小数点。 +int i = (int)1.5; +``` + +同样道理,当一个`short`类型与`1`相加,我们知道会类型提升,但是还想给结果赋值给short类型变量,就需要强制转换。 + +```java +public static void main(String[] args) { + //short类型变量,内存中2个字节 + short s = 1; + /* + 出现编译失败 + s和1做运算的时候,1是int类型,s会被提升为int类型 + s+1后的结果是int类型,将结果在赋值会short类型时发生错误 + short内存2个字节,int类型4个字节 + 必须将int强制转成short才能完成赋值 + */ + s = s + 1;//编译失败 + s = (short)(s+1);//编译成功 +} +``` + +#### 转换原理图解 + +![](img/类型强制转换.jpg) + + + +#### 强烈注意 + +- 浮点转成整数,直接取消小数点,可能造成数据损失精度。 +- `int` 强制转成`short` 砍掉2个字节,可能造成数据丢失。 + +```java +// 定义s为short范围内最大值 +short s = 32767; +// 运算后,强制转换,砍掉2个字节后会出现不确定的结果 +s = (short)(s + 10); +``` + +### 1.3 ASCII编码表 + +```java +public static void main(String[] args) { + //字符类型变量 + char c = 'a'; + int i = 1; + //字符类型和int类型计算 + System.out.println(c+i);//输出结果是98 +} +``` + +在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。 + +* **编码表** :就是将人类的文字和一个十进制数进行对应起来组成一张表格。 + + 人们就规定: + + | 字符 | 数值 | + | :--: | :--: | + | 0 | 48 | + | 9 | 57 | + | A | 65 | + | Z | 90 | + | a | 97 | + | z | 122 | + + - 将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII( + + American Standard Code for Information Interchange 美国标准信息交换码)。 + +> 小贴士: +> +> 在char类型和int类型计算的过程中,char类型的字符先查询编码表,得到97,再和1求和,结果为98。char类型提升为了int类型。char类型内存2个字节,int类型内存4个字节。 + +## 第二章 运算符 + +### 2.1 算数运算符 + +| 算数运算符包括: | | +| ---------------- | ---------------------------- | +| `+` | 加法运算,字符串连接运算 | +| `-` | 减法运算 | +| `*` | 乘法运算 | +| `/` | 除法运算 | +| `%` | 取模运算,两个数字相除取余数 | +| `++` 、 `--` | 自增自减运算 | + + +Java中,整数使用以上运算符,无论怎么计算,也不会得到小数。 + +```java +public static void main(String[] args) { + int i = 1234; + System.out.println(i/1000*1000);//计算结果是1000 +} +``` + +- `++` **运算,变量自己增长1**。反之,`--` 运算,变量自己减少1,用法与`++` 一致。 + + - 独立运算: + + - 变量在独立运算时,`前++`和`后++`没有区别 。 + - 变量`前++` :例如 `++i` 。 + - 变量`后++` :例如 `i++` 。 + + - 混合运算: + + * 和其他变量放在一起,`前++`和`后++`就产生了不同。 + + - 变量`前++` :变量a自己加1,将加1后的结果赋值给b,也就是说a先计算。a和b的结果都是2。 + + ```java + public static void main(String[] args) { + int a = 1; + int b = ++a; + System.out.println(a);//计算结果是2 + System.out.println(b);//计算结果是2 + } + ``` + + - 变量`后++` :变量a先把自己的值1,赋值给变量b,此时变量b的值就是1,变量a自己再加1。a的结果是2,b的结果是1。 + + ```java + public static void main(String[] args) { + int a = 1; + int b = a++; + System.out.println(a);//计算结果是2 + System.out.println(b);//计算结果是1 + } + ``` + + + +- `+` 符号在字符串中的操作: + - `+` 符号在遇到字符串的时候,表示**连接、拼接**的含义。 + - "a"+"b"的结果是“ab”,连接含义 + +```java +public static void main(String[] args){ + System.out.println("5+5="+5+5);//输出5+5=55 +} +``` + +### 2.2 赋值运算符 + +| 赋值运算符包括: | | +| ---------------- | ------ | +| `=` | 等于号 | +| `+=` | 加等于 | +| `-=` | 减等于 | +| `*=` | 乘等于 | +| `/=` | 除等于 | +| `%=` | 取模等 | + +* 赋值运算符,就是将符号右边的值,赋给左边的变量。 + + +```java +public static void main(String[] args){ + int i = 5; + i+=5;//计算方式 i=i+5 变量i先加5,再赋值变量i + System.out.println(i); //输出结果是10 +} +``` +### 2.3 比较运算符 + +| 比较运算符包括: | | +| ---------------- | ------------------------------------------------------------ | +| `==` | 比较符号两边数据是否相等,相等结果是true。 | +| `<` | 比较符号左边的数据是否小于右边的数据,如果小于结果是true。 | +| `>` | 比较符号左边的数据是否大于右边的数据,如果大于结果是true。 | +| `<=` | 比较符号左边的数据是否小于或者等于右边的数据,如果小于结果是true。 | +| `>=` | 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是true。 | +| `!=` | 不等于符号 ,如果符号两边的数据不相等,结果是true。 | + +* 比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值`true`或者`false` 。 + +```java +public static void main(String[] args) { + System.out.println(1==1);//true + System.out.println(1<2);//true + System.out.println(3>4);//false + System.out.println(3<=4);//true + System.out.println(3>=4);//false + System.out.println(3!=4);//true +} +``` +### 2.4 逻辑运算符 + +| 逻辑运算符包括: | | +| ---------------- | ------------------------------------------------------------ | +| `&&` 短路与 | 1. 两边都是true,结果是true
2. 一边是false,结果是false
短路特点:符号左边是false,右边不再运算 | +| `\|\|` 短路或 | 1. 两边都是false,结果是false
2. 一边是true,结果是true
短路特点: 符号左边是true,右边不再运算 | +| `!` 取反 | 1. ! true 结果是false
2. ! false结果是true | + +* 逻辑运算符,是用来连接两个布尔类型结果的运算符,运算结果都是布尔值`true`或者`false` + +```java +public static void main(String[] args) { + System.out.println(true && true);//true + System.out.println(true && false);//false + System.out.println(false && true);//false,右边不计算 + + System.out.println(false || false);//falase + System.out.println(false || true);//true + System.out.println(true || false);//true,右边不计算 + + System.out.println(!false);//true +} +``` +### 2.5 三元运算符 + +* 三元运算符格式: + +```java + 数据类型 变量名 = 布尔类型表达式?结果1:结果2 +``` + +- 三元运算符计算方式: + - 布尔类型表达式结果是true,三元运算符整体结果为结果1,赋值给变量。 + - 布尔类型表达式结果是false,三元运算符整体结果为结果2,赋值给变量。 + +```java +public static void main(String[] args) { + int i = (1==2 ? 100 : 200); + System.out.println(i);//200 + int j = (3<=4 ? 500 : 600); + System.out.println(j);//500 +} +``` + +## 第三章 方法入门 + +### 3.1 概述 + +我们在学习运算符的时候,都为每个运算符单独的创建一个新的类和main方法,我们会发现这样编写代码非常的繁琐,而且重复的代码过多。能否避免这些重复的代码呢,就需要使用方法来实现。 + +- **方法:**就是将一个**功能**抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。 + + +当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。 + +### 3.2 方法的定义 + +* 定义格式: + +```java +修饰符 返回值类型 方法名 (参数列表){ + 代码... + return ; +} +``` + +- 定义格式解释: + - 修饰符: 目前固定写法 `public static` 。 + - 返回值类型: 目前固定写法 `void` ,其他返回值类型在后面的课程讲解。 + - 方法名:为我们定义的方法起名,满足标识符的规范,用来调用方法。 + - 参数列表: 目前无参数, 带有参数的方法在后面的课程讲解。 + - return:方法结束。因为返回值类型是void,方法大括号内的return可以不写。 +- 举例: + +```java +public static void methodName() { + System.out.println("这是一个方法"); +} +``` + +### 3.3 方法的调用 + +方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法。在主方法中,直接写要调用的方法名字就可以调用了。 + +```java +public static void main(String[] args) { + //调用定义的方法method + method(); +} +//定义方法,被main方法调用 +public static void method() { + System.out.println("自己定义的方法,需要被main调用运行"); +} +``` + +### 3.4 调用练习 + +将三元运算符代码抽取到自定义的方法中,并调用。 + +```java +public static void main(String[] args) { + //调用定义的方法operator + operator(); +} +//定义方法,方法中定义三元运算符 +public static void operator() { + int i = 0; + i = (1==2 ? 100:200); + System.out.println(i); + int j = 0 ; + j = (3<=4 ? 500:600); + System.out.println(j); +} +``` +### 3.5 注意事项 + +- 方法定义注意事项: + + - 方法必须定义在一类中方法外 + - 方法不能定义在另一个方法的里面 + +```java +public class Demo { + public static void main(String[] args){ + } + //正确写法,类中,main方法外面可以定义方法 + public static void method(){} +} +``` + +```java +public class Demo { + public static void main(String[] args){ + //错误写法,一个方法不能定义在另一方法内部 + public static void method(){} + } +} +``` + + +## 第四章 扩展知识点 + +### 4.1 +=符号的扩展 + +下面的程序有问题吗? + +```java +public static void main(String[] args){ + short s = 1; + s+=1; + System.out.println(s); +} +``` + +分析: `s += 1` 逻辑上看作是`s = s + 1` 计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是,`s=s+1进行两次运算`,`+=` 是一个运算符,只运算一次,并带有强制转换的特点,也就是说`s += 1` 就是`s = (short)(s + 1)`,因此程序没有问题编译通过,运行结果是2. + +### 4.2 常量和变量的运算 + +下面的程序有问题吗? + +```java +public static void main(String[] args){ + byte b1=1; + byte b2=2; + byte b3=1 + 2; + byte b4=b1 + b2; + System.out.println(b3); + System.out.println(b4); +} +``` +分析:`b3 = 1 + 2` ,`1 `和 `2 ` 是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了`1+2` 的结果并没有超过byte类型的取值范围,可以赋值给变量`b3` ,因此`b3=1 + 2`是正确的。 + +反之,`b4 = b2 + b3`,`b2` 和 `b3` 是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。 diff --git a/javaSE1/day02/img/jshell使用.jpg b/javaSE1/day02/img/jshell使用.jpg new file mode 100644 index 0000000..fae92db Binary files /dev/null and b/javaSE1/day02/img/jshell使用.jpg differ diff --git a/javaSE1/day02/img/jshell开启.jpg b/javaSE1/day02/img/jshell开启.jpg new file mode 100644 index 0000000..9d3ed8a Binary files /dev/null and b/javaSE1/day02/img/jshell开启.jpg differ diff --git a/javaSE1/day02/img/扩展.jpg b/javaSE1/day02/img/扩展.jpg new file mode 100644 index 0000000..3ea1ed9 Binary files /dev/null and b/javaSE1/day02/img/扩展.jpg differ diff --git a/javaSE1/day02/img/类型强制转换.jpg b/javaSE1/day02/img/类型强制转换.jpg new file mode 100644 index 0000000..a19c5fb Binary files /dev/null and b/javaSE1/day02/img/类型强制转换.jpg differ diff --git a/javaSE1/day02/img/类型自动提升.jpg b/javaSE1/day02/img/类型自动提升.jpg new file mode 100644 index 0000000..0e78496 Binary files /dev/null and b/javaSE1/day02/img/类型自动提升.jpg differ diff --git a/javaSE1/day03/day03【流程控制语句】.md b/javaSE1/day03/day03【流程控制语句】.md new file mode 100644 index 0000000..7bb2870 --- /dev/null +++ b/javaSE1/day03/day03【流程控制语句】.md @@ -0,0 +1,571 @@ +# day03【 流程控制语句】 + +### 今日内容 + +- if else判断语句 +- switch选择语句 +- for循环语句 +- while循环语句 +- do while循环语句 +- 跳出语句break,continue + +### 教学目标 + +- [ ] 理解if语句的格式和执行流程 +- [ ] 理解if...else语句的格式和执行流程 +- [ ] 理解if...else if语句的格式和执行流程 +- [ ] 了解if语句和三元运算符互换 +- [ ] 理解switch选择语句的格式和执行流程 +- [ ] 了解switch选择语句接收的数据类型 +- [ ] 了解case的穿透性 +- [ ] 理解while语句的格式和执行流程 +- [ ] 理解for语句的格式和执行流程 +- [ ] 理解do...while语句的格式和执行流程 +- [ ] 了解do...while循环的特点 +- [ ] 了解跳出语句break,continue的意义 +- [ ] 理解嵌套for循环的执行流程 + +## 第一章 流程控制 + +### 1.1 概述 + +在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。 + +### 1.2 顺序结构 + +```java +public static void main(String[] args){ + //顺序执行,根据编写的顺序,从上到下运行 + System.out.println(1); + System.out.println(2); + System.out.println(3); +} +``` + +## 第二章 判断语句 + +### 2.1 判断语句1--if + +- **if语句第一种格式:** if + + +```java +if(关系表达式){ + 语句体; +} +``` + +- **执行流程** + + - 首先判断关系表达式看其结果是true还是false + + - 如果是true就执行语句体 + + - 如果是false就不执行语句体 + + ![](img/if.jpg) + +```java +public static void main(String[] args){ + System.out.println("开始"); + // 定义两个变量 + int a = 10; + int b = 20; + //变量使用if判断 + if (a == b){ + System.out.println("a等于b"); + } + int c = 10; + if(a == c){ + System.out.println("a等于c"); + } + System.out.println("结束"); +} +``` + +### 2.2 判断语句2--if...else + +- **if语句第二种格式:** if...else + + +```java +if(关系表达式) { + 语句体1; +}else { + 语句体2; +} +``` + +- 执行流程 + + - 首先判断关系表达式看其结果是true还是false + + - 如果是true就执行语句体1 + + - 如果是false就执行语句体2 + + ![](img/ifelse.jpg) + +```java +public static void main(String[] args){ + // 判断给定的数据是奇数还是偶数 + // 定义变量 + int a = 1; + if(a % 2 == 0) { + System.out.println("a是偶数"); + } else{ + System.out.println("a是奇数"); + } + System.out.println("结束"); +} +``` + +### 2.3 判断语句3--if..else if...else + +- **if语句第三种格式:** if...else if ...else + + +```java +if (判断条件1) { + 执行语句1; +} else if (判断条件2) { + 执行语句2; +} +... +}else if (判断条件n) { + 执行语句n; +} else { + 执行语句n+1; +} +``` + +- **执行流程** + - 首先判断关系表达式1看其结果是true还是false + - 如果是true就执行语句体1 + - 如果是false就继续判断关系表达式2看其结果是true还是false + - 如果是true就执行语句体2 + - 如果是false就继续判断关系表达式…看其结果是true还是false + - … + - 如果没有任何关系表达式为true,就执行语句体n+1。 + +![](img/ifelseif.jpg) + +```java +public static void main(String[] args) { + // x和y的关系满足如下: + // x>=3 y = 2x + 1; + //-1<=x<3 y = 2x; + // x<=-1 y = 2x – 1; + // 根据给定的x的值,计算出y的值并输出。 + // 定义变量 + int x = 5; + int y; + if (x>= 3) { + y = 2 * x + 1; + } else if (x >= -1 && x < 3) { + y = 2 * x; + } else { + y = 2 * x - 1; + } + System.out.println("y的值是:"+y); +} +``` +### 2.4 语句练习 + +- 指定考试成绩,判断学生等级 + - 90-100 优秀 + - 80-89 好 + - 70-79 良 + - 60-69 及格 + - 60以下 不及格 + + + +```java +public static void main(String[] args) { + int score = 100; + if(score<0 || score>100){ + System.out.println("你的成绩是错误的"); + }else if(score>=90 && score<=100){ + System.out.println("你的成绩属于优秀"); + }else if(score>=80 && score<90){ + System.out.println("你的成绩属于好"); + }else if(score>=70 && score<80){ + System.out.println("你的成绩属于良"); + }else if(score>=60 && score<70){ + System.out.println("你的成绩属于及格"); + }else { + System.out.println("你的成绩属于不及格"); + } +}} +``` +### 2.5 if语句和三元运算符的互换 + +在某些简单的应用中,if语句是可以和三元运算符互换使用的。 + +```java +public static void main(String[] args) { + int a = 10; + int b = 20; + //定义变量,保存a和b的较大值 + int c; + if(a > b) { + c = a; + } else { + c = b; + } + //可以上述功能改写为三元运算符形式 + c = a > b ? a:b; +} +``` + +## 第三章 选择语句 + +### 3.1 选择语句--switch + +- **switch语句格式:** + + +```java +switch(表达式) { + case 常量值1: + 语句体1; + break; + case 常量值2: + 语句体2; + break; + ... + default: + 语句体n+1; + break; +} +``` +- **执行流程** + - 首先计算出表达式的值 + - 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。 + - 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。 + +![](img/switch.jpg) + + + +```java +public static void main(String[] args) { + //定义变量,判断是星期几 + int weekday = 6; + //switch语句实现选择 + switch(weekday) { + case 1: + System.out.println("星期一"); + break; + case 2: + System.out.println("星期二"); + break; + case 3: + System.out.println("星期三"); + break; + case 4: + System.out.println("星期四"); + break; + case 5: + System.out.println("星期五"); + break; + case 6: + System.out.println("星期六"); + break; + case 7: + System.out.println("星期日"); + break; + default: + System.out.println("你输入的数字有误"); + break; + } +} +``` +switch语句中,表达式的数据类型,可以是byte,short,int,char,enum(枚举),JDK7后可以接收字符串。 + +### 3.2 case的穿透性 + +在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。 + +```java +public static void main(String[] args) { + int i = 5; + switch (i){ + case 0: + System.out.println("执行case0"); + break; + case 5: + System.out.println("执行case5"); + case 10: + System.out.println("执行case10"); + default: + System.out.println("执行default"); + } +} +``` + +上述程序中,执行case5后,由于没有break语句,程序会一直向后走,不会在判断case,也不会理会break,直接运行完整体switch。 + +由于case存在穿透性,因此初学者在编写switch语句时,必须要写上break。 + +## 第四章 循环语句 + +### 4.1 循环概述 + +循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。 + +### 4.2 循环语句1--for + +- **for循环语句格式:** + + +```java +for(初始化表达式①; 布尔表达式②; 步进表达式④){ + 循环体③ +} +``` + +- **执行流程** + - 执行顺序:①②③④>②③④>②③④…②不满足为止。 + - ①负责完成循环变量初始化 + - ②负责判断是否满足循环条件,不满足则跳出循环 + - ③具体执行的语句 + - ④循环后,循环条件所涉及变量的变化情况 + +![](img/for.jpg) + +```java +public static void main(String[] args) { + //控制台输出10次HelloWorld,不使用循环 + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("HelloWorld"); + System.out.println("-------------------------"); + + //用循环改进,循环10次 + //定义变量从0开始,循环条件为<10 + for(int x = 0; x < 10; x++) { + System.out.println("HelloWorld"+x); + } +} +``` + +* 循环练习:使用循环,计算1-100之间的偶数和 + +```java +public static void main(String[] args) { + //1.定义一个初始化变量,记录累加求和,初始值为0 + int sum = 0; + //2.利用for循环获取1-100之间的数字 + for (int i = 1; i <= 100; i++) { + //3.判断获取的数组是奇数还是偶数 + if(i % 2==0){ + //4.如果是偶数就累加求和 + sum += i; + } + } + //5.循环结束之后,打印累加结果 + System.out.println("sum:"+sum); +} +``` + +### 4.3 循环语句2--while + +- **while循环语句格式:** + + +```java +初始化表达式① + while(布尔表达式②){ + 循环体③ + 步进表达式④ +} +``` + +- **执行流程** + - 执行顺序:①②③④>②③④>②③④…②不满足为止。 + - ①负责完成循环变量初始化。 + - ②负责判断是否满足循环条件,不满足则跳出循环。 + - ③具体执行的语句。 + - ④循环后,循环变量的变化情况。 + +![](img/while.jpg) + +while循环输出10次HelloWorld + +```java +public static void main(String[] args) { + //while循环实现打印10次HelloWorld + //定义初始化变量 + int i = 1; + //循环条件<=10 + while(i<=10){ + System.out.println("HelloWorld"); + //步进 + i++; + } +} +``` + +while循环计算1-100之间的和 + +```java +public static void main(String[] args) { + //使用while循环实现 + //定义一个变量,记录累加求和 + int sum = 0; + //定义初始化表达式 + int i = 1; + //使用while循环让初始化表达式的值变化 + while(i<=100){ + //累加求和 + sum += i ; + //步进表达式改变变量的值 + i++; + } + //打印求和的变量 + System.out.println("1-100的和是:"+sum); +} +``` + +### 4.4 循环语句3--do...while + +- **do...while循环格式** + + +```java +初始化表达式① + do{ + 循环体③ + 步进表达式④ +}while(布尔表达式②); +``` + +- **执行流程** + - 执行顺序:①③④>②③④>②③④…②不满足为止。 + - ①负责完成循环变量初始化。 + - ②负责判断是否满足循环条件,不满足则跳出循环。 + - ③具体执行的语句 + - ④循环后,循环变量的变化情况 + +![](img/dowhile.jpg) + + + +输出10次HelloWorld + +```java +public static void main(String[] args) { + int x=1; + do { + System.out.println("HelloWorld"); + x++; + }while(x<=10); +} +``` + +do...while循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。这样的循环具有一定的风险性,因此初学者不建议使用do...while循环。 + +```java +public static void main(String[] args){ + do{ + System.out.println("无条件执行一次"); + }while(false); +} +``` + +### 4.5 循环语句的区别 + +- `for` 和 `while` 的小区别: + - 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。 + - 在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while。 + +### 4.6 跳出语句 + +#### break + +- **使用场景:终止switch或者循环** + - 在选择结构switch语句中 + - 在循环语句中 + - 离开使用场景的存在是没有意义的 + +```java +public static void main(String[] args) { + for (int i = 1; i<=10; i++) { + //需求:打印完两次HelloWorld之后结束循环 + if(i == 3){ + break; + } + System.out.println("HelloWorld"+i); + } +} +``` + +#### continue + +- **使用场景:结束本次循环,继续下一次的循环** + +```java +public static void main(String[] args) { + for (int i = 1; i <= 10; i++) { + //需求:不打印第三次HelloWorld + if(i == 3){ + continue; + } + System.out.println("HelloWorld"+i); + } +} +``` + +## 第五章 扩展知识点 + +### 5.1 死循环 + +- **死循环:**也就是循环中的条件永远为true,死循环的是永不结束的循环。例如:while(true){}。 + +在后期的开发中,会出现使用死循环的场景,例如:我们需要读取用户输入的输入,但是用户输入多少数据我们并不清楚,也只能使用死循环,当用户不想输入数据了,就可以结束循环了,如何去结束一个死循环呢,就需要使用到跳出语句了。 + +### 5.2 嵌套循环 + +- **所谓嵌套循环**,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总共的循环次数=外循环次数*内循环次数 + + +- **嵌套循环格式:** + +```java +for(初始化表达式①; 循环条件②; 步进表达式⑦) { + for(初始化表达式③; 循环条件④; 步进表达式⑥) { + 执行语句⑤; + } +} +``` + +- **嵌套循环执行流程:** + - 执行顺序:①②③④⑤⑥>④⑤⑥>⑦②③④⑤⑥>④⑤⑥ + - 外循环一次,内循环多次。 + - 比如跳绳:一共跳5组,每组跳10个。5组就是外循环,10个就是内循环。 +- **练习**:使用嵌套循环,打印5*8的矩形 + +```java +public static void main(String[] args) { + //5*8的矩形,打印5行*号,每行8个 + //外循环5次,内循环8次 + for(int i = 0; i < 5; i++){ + for(int j = 0; j < 8; j++){ + //不换行打印星号 + System.out.print("*"); + } + //内循环打印8个星号后,需要一次换行 + System.out.println(); + } +} +``` + diff --git a/javaSE1/day03/img/dowhile.jpg b/javaSE1/day03/img/dowhile.jpg new file mode 100644 index 0000000..73a7d3f Binary files /dev/null and b/javaSE1/day03/img/dowhile.jpg differ diff --git a/javaSE1/day03/img/for.jpg b/javaSE1/day03/img/for.jpg new file mode 100644 index 0000000..1f39b12 Binary files /dev/null and b/javaSE1/day03/img/for.jpg differ diff --git a/javaSE1/day03/img/if.jpg b/javaSE1/day03/img/if.jpg new file mode 100644 index 0000000..bb2fca4 Binary files /dev/null and b/javaSE1/day03/img/if.jpg differ diff --git a/javaSE1/day03/img/ifelse.jpg b/javaSE1/day03/img/ifelse.jpg new file mode 100644 index 0000000..0907bff Binary files /dev/null and b/javaSE1/day03/img/ifelse.jpg differ diff --git a/javaSE1/day03/img/ifelseif.jpg b/javaSE1/day03/img/ifelseif.jpg new file mode 100644 index 0000000..62a1955 Binary files /dev/null and b/javaSE1/day03/img/ifelseif.jpg differ diff --git a/javaSE1/day03/img/switch.jpg b/javaSE1/day03/img/switch.jpg new file mode 100644 index 0000000..541f899 Binary files /dev/null and b/javaSE1/day03/img/switch.jpg differ diff --git a/javaSE1/day03/img/while.jpg b/javaSE1/day03/img/while.jpg new file mode 100644 index 0000000..a14f53c Binary files /dev/null and b/javaSE1/day03/img/while.jpg differ diff --git a/javaSE1/day04/day04【Idea、方法】.md b/javaSE1/day04/day04【Idea、方法】.md new file mode 100644 index 0000000..ab04aad --- /dev/null +++ b/javaSE1/day04/day04【Idea、方法】.md @@ -0,0 +1,553 @@ +# day04【 Idea、方法】 + +### 今日内容 + +- 集成开发工具IDEA +- 方法的参数和返回值 +- 方法的重载 + +### 教学目标 + +- [ ] 掌握idea开发工具的安装 +- [ ] 能够使用idea创建Java工程 +- [ ] 能够使用idea创建包和类 +- [ ] 了解idea的Java工程目录 +- [ ] 了解idea字体的设置 +- [ ] 掌握idea常用开发快捷键 +- [ ] 了解项目的导入和删除 +- [ ] 掌握方法定义的参数和返回值含义 +- [ ] 了解方法的调用过程 +- [ ] 了解方法的三种调用形式 +- [ ] 掌握方法定义的注意事项 +- [ ] 掌握方法重载的概念 +- [ ] 能够判断出方法的重置 + +## 第一章 开发工具IntelliJ IDEA + +### 1.1 开发工具概述 + +IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写。所以,需要有JRE运行环境并配置好环境变量。它可以极大地提升我们的开发效率。可以自动编译,检查错误。在公司中,使用的就是IDEA进行开发。 + +### 1.2 IDEA软件安装 + +此软件集成了32位和64位,双击`ideaIU-2025.1.1.exe` 进入安装。 + +1. 欢迎界面 + + + ![](img/image-20250521211304386.png) + +2. 选择安装路径 + + +![](img/image-20250521211958347.png) + +3. 配置安装选项 + + +![](img/image-20250521212225552.png) + +4. 开始菜单 + + +![](img/image-20250521212325105.png) + +5. 安装完毕 + +![](img/idea5.jpg) + + +![](img/image-20250521215022830.png) + +IDEA开发工具安装完成 + +### 1.3 IDEA首次启动 + +1. 如果有以下弹窗,选择不导入任何设置,点击`OK` + +![](img/idea6.jpg) + +2. 选择 `Projects -> New Project` + + +![](img/image-20250521220057940.png) + +3. 点击`java` 工程,设置`工程名称`、`工程目录`、`DK版本`、`模块名称`、`模块目录` + + + + +![](img/image-20250521224309863.png) + +​ + +4. 点击`create`按钮,创建工程,如果对应盘符没有这个目录,会自动创建 + + +![](img/image-20250521224935481.png) + +5.IDEA的工作界面,我们的项目已经创建好了,如果再新建项目,点击`File->new->Project` + + +![](img/image-20250521225238179.png) + +### 1.4 创建包和类 + +1. 展开创建的工程,在源代码目录`src` 上,鼠标右键,选择`new->package` ,键入包名`com.inmind.demo` ,点击确定。 + + +![](img/image-20250521231255552.png) + +![image-20250521231336051](img/image-20250521231336051.png) + +​ 右键点击`com.inmind.demo` ,选择 `Open in -> Explorer` ,会发现创建包的目录结构。 + + +![](img/image-20250521231636549.png) + +​ 可见`com.inmind.demo` ,表示创建了多级的文件夹。 + +![image-20250521231715287](img/image-20250521231715287.png) + +> 小贴士:所谓包,就是文件夹,用来对类文件进行管理。 + +2. 在创建好的包上,鼠标右键,选择 `new->Java Class` 创建类,键入类名。 + +![image-20250521231822220](img/image-20250521231822220.png) + +![image-20250521231854773](img/image-20250521231854773.png) + +3. 在代码编辑区,键入主方法,并输出`HelloWorld` 。 + +![image-20250521231937222](img/image-20250521231937222.png) + +4. 运行程序,在代码编辑区鼠标右键,选择`Run HelloWorld.main()` 即可,或点击main方法左侧的绿色启动三角。 + +![image-20250521232129512](img/image-20250521232129512.png) + +### 1.5 字体设置 + +IDEA工具的默认字体非常小,代码编辑器和控制台的输出字体都需要进行调整。 + +* 点击菜单栏上的`File->Settings->Editor->Font`修改字体。 + + +![](img/image-20250521232303300.png) + +### 1.6 IDEA的项目目录 + +- 我们创建的项目,Project01目录下 + - `.idea` 目录和`demo.iml` 和我们开发无关,是IDEA工具自己使用的 + - `out`目录是存储编译后的.class文件 + - `src` 目录是存储我们编写的.java源文件 + + ![image-20250521233741690](img/image-20250521233741690.png) + +### 1.7 IDEA常用快捷键 + +| 快捷键 | 功能 | +| ---------------- | -------------------------- | +| `Alt+Enter` | 导入包,自动修正代码 | +| `Ctrl+Y` | 删除光标所在行 | +| `Ctrl+D` | 复制光标所在行的内容,插入光标位置下面 | +| `Ctrl+Alt+L` | 格式化代码 | +| `Ctrl+/` | 单行注释 | +| `Ctrl+Shift+/` | 选中代码注释,多行注释,再按取消注释 | +| `Alt+Ins` | 自动生成代码,toString,get,set等方法 | +| `Alt+Shift+上下箭头` | 移动当前代码行 | + +### 1.8 IDEA修改快捷键 + +在IDEA工具中,`Ctrl+空格`的快捷键,可以帮助我们补全代码,但是这个快捷键和Windows中的输入法切换快捷键冲突,需要修改IDEA中的快捷键。 + +`File->Settings->keymap->Main menu->code->Completion->Basic` + +![](img/idea25.jpg) + +双击`Basic->remove->Ctrl+空格` + +![](img/idea26.jpg) + +再次双击`Basic->Add Keyboard->键入 Alt+/->点击OK` + +![](img/idea28.jpg) + +### 1.9 IDEA导入和关闭项目 + +关闭IDEA中已经存在的项目,`File->Close Project` + + +![](img/image-20250521233938325.png) + +`File->Close Project `这时IDEA回到了刚启动界面,点击项目上的`三个点的选项`,点击Remove from Recent Projects ,IDEA中就没有这个项目了 + +![image-20250521234433853](img/image-20250521234433853.png) + +在IDEA的启动界面上,点击`OPEN` ,选择项目目录即可 + + +![](img/image-20250521234846397.png) + +> 小贴士: +> +> 课后若想通过IDEA同时开启多个项目,点击OPEN打开项目时,点击New Window按钮 + +![image-20250521234941828](img/image-20250521234941828.png) + +## 第二章 方法 + +### 2.1 回顾--方法的定义和调用 + +前面的课程中,使用过嵌套循环输出矩形,控制台打印出矩形就可以了,因此将方法定义为`void`,没有返回值。在主方法`main` 中直接被调用。 + +```java +public class Method_Demo1 { + public static void main(String[] args) { + print(); + } + + private static void print() { + for (int i = 0; i < 5; i++) { + for (int j = 0; j < 8; j++) { + System.out.print("*"); + } + System.out.println(); + } + } +} +``` + +`print`方法被`main`方法调用后直接输出结果,而`main`方法并不需要`print`方法的执行结果,所以被定义为`void`。 + +### 2.2 定义方法的格式详解 + +```java +修饰符 返回值类型 方法名(参数列表){ + //代码省略... + return 结果; +} +``` + +- 修饰符: public static 固定写法 +- 返回值类型: 表示方法运行的结果的数据类型,方法执行后将结果返回到调用者 +- 参数列表:方法在运算过程中的未知数据,调用者调用方法时传递 +- return:将方法执行后的结果带给调用者,方法执行到`return` ,整体方法运行结束 + +> 小贴士:return **结果**; 这里的"结果"在开发中,我们正确的叫法成为**方法的返回值** + +### 2.3 定义方法的两个明确 + +- **需求:**定义方法实现两个整数的求和计算。 + - **明确返回值类型**:方法计算的是整数的求和,结果也必然是个整数,返回值类型定义为int类型。 + - **明确参数列表**:计算哪两个整数的和,并不清楚,但可以确定是整数,参数列表可以定义两个int类型的变量,由调用者调用方法时传递 + +```java +public class Method_Demo2 { + public static void main(String[] args) { + // 调用方法getSum,传递两个整数,这里传递的实际数据又称为实际参数 + // 并接收方法计算后的结果,返回值 + int sum = getSum(5, 6); + System.out.println(sum); + } + + /* + 定义计算两个整数和的方法 + 返回值类型,计算结果是int + 参数:不确定数据求和,定义int参数.参数又称为形式参数 + */ + public static int getSum(int a, int b) { + return a + b; + } +} +``` + +程序执行,主方法`main` 调用`getSum` 方法,传递了实际数据`5和6` ,两个变量`a和b`接收到的就是实际参数,并将计算后的结果返回,主方法`main`中的变量`sum`接收的就是方法的返回值。 + +### 2.4 调用方法的流程图解 + +![](img/方法调用图解.jpg) + +### 2.5 定义方法练习 + +#### 练习一 + +**比较两个整数是否相同** + +- 分析:定义方法实现功能,需要有两个明确,即`返回值` 和 `参数列表`。 + - **明确返回值**:比较整数,比较的结果只有两种可能,相同或不同,因此结果是布尔类型,比较的结果相同为true。 + - **明确参数列表**:比较的两个整数不确定,所以默认定义两个int类型的参数。 + +```java +public class Method_Demo3 { + public static void main(String[] args) { + //调用方法compare,传递两个整数 + //并接收方法计算后的结果,布尔值 + boolean bool = compare(3, 8); + System.out.println(bool); + } + + /* + 定义比较两个整数是否相同的方法 + 返回值类型,比较的结果布尔类型 + 参数:不确定参与比较的两个整数 + */ + public static boolean compare(int a, int b) { + if (a == b) { + return true; + } else { + return false; + } + } +} +``` + +#### 练习二 + +**计算1+2+3...+100的和** + +- 分析:定义方法实现功能,需要有两个明确,即`返回值`和`参数`。 + - **明确返回值**:1~100的求和,计算后必然还是整数,返回值类型是int + - **明确参数**:需求中已知到计算的数据,没有未知的数据,不定义参数 + +```java +public class Method_Demo4 { + public static void main(String[] args) { + //调用方法getSum + //并接收方法计算后的结果,整数 + int sum = getSum(); + System.out.println(sum); + } + + /* + 定义计算1~100的求和方法 + 返回值类型,计算结果整数int + 参数:没有不确定数据 + */ + public static int getSum() { + //定义变量保存求和 + int sum = 0; + //从1开始循环,到100结束 + for (int i = 1; i <= 100; i++) { + sum = sum + i; + } + return sum; + } +} +``` + +#### 练习三 + +**实现不定次数打印** + +- 分析:定义方法实现功能,需要有两个明确,即`返回值`和`参数`。 + - **明确返回值**:方法中打印出`HelloWorld`即可,没有计算结果,返回值类型`void`。 + - **明确参数**:打印几次不清楚,参数定义一个整型参数 + +```java +public class Method_Demo5 { + public static void main(String[] args) { + //调用方法printHelloWorld,传递整数 + printHelloWorld(9); + } + + /* + 定义打印HelloWorld方法 + 返回值类型,计算没有结果 void + 参数:不确定打印几次 + */ + public static void printHelloWorld(int n) { + for (int i = 0; i < n; i++) { + System.out.println("HelloWorld"); + } + } +} +``` + +### 2.6 定义方法的注意事项 + +- 定义位置,类中方法外面。 +- 返回值类型,必须要和`return`语句返回的类型相同,否则编译失败 。 + +```java +// 返回值类型要求是int +public static int getSum() { + return 5;// 正确,int类型 + return 1.2;// 错误,类型不匹配 + return true;// 错误,类型不匹配 +} +``` + +- 不能在`return` 后面写代码,`return` 意味着方法结束,所有后面的代码永远不会执行,属于无效代码。 + +```java +public static int getSum(int a,int b) { + return a + b; + System.out.println("Hello");// 错误,return已经结束,这里不会执行,无效代码 +} +``` + +### 2.7 调用方法的三种形式 + +- **直接调用:**直接写方法名调用 + +```java +public static void main(String[] args) { + print(); +} +public static void print() { + System.out.println("方法被调用"); +} +``` + +- **赋值调用:**调用方法,在方法前面定义变量,接收方法返回值 + +```java +public static void main(String[] args) { + int sum = getSum(5,6); + System.out.println(sum); +} +public static int getSum(int a,int b) { + return a + b; +} +``` + +- **输出语句调用:** + + - 在输出语句中调用方法,`System.out.println(方法名())` 。 + + ```java + public static void main(String[] args) { + System.out.println(getSum(5,6)); + } + public static int getSum(int a,int b) { + return a + b; + } + ``` + + - 不能用输出语句调用`void` 类型的方法。因为方法执行后没有结果,也就打印不出任何内容。 + + ```java + public static void main(String[] args) { + System.out.println(printHello());// 错误,不能输出语句调用void类型方法 + } + public static void printHello() { + System.out.println("Hello"); + } + ``` + +### 2.8 方法重载 + +- **方法重载**:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。 +- 参数列表:个数不同,数据类型不同,顺序不同。 +- 重载方法调用:JVM通过方法的参数列表,调用不同的方法。 + +### 2.9 方法重载练习 + +#### 练习一 + +比较两个数据是否相等。参数类型分别为两个`byte`类型,两个`short`类型,两个`int`类型,两个`long`类型,并在`main`方法中进行测试。 + +```java +public class Method_Demo6 { + public static void main(String[] args) { + //定义不同数据类型的变量 + byte a = 10; + byte b = 20; + short c = 10; + short d = 20; + int e = 10; + int f = 10; + long g = 10; + long h = 20; + // 调用 + System.out.println(compare(a, b)); + System.out.println(compare(c, d)); + System.out.println(compare(e, f)); + System.out.println(compare(g, h)); + } + + // 两个byte类型的 + public static boolean compare(byte a, byte b) { + System.out.println("byte"); + return a == b; + } + + // 两个short类型的 + public static boolean compare(short a, short b) { + System.out.println("short"); + return a == b; + } + + // 两个int类型的 + public static boolean compare(int a, int b) { + System.out.println("int"); + return a == b; + } + + // 两个long类型的 + public static boolean compare(long a, long b) { + System.out.println("long"); + return a == b; + } +} +``` + +#### 练习二 + +判断哪些方法是重载关系。 + +```java +public static void open(){} +public static void open(int a){} +static void open(int a,int b){} +public static void open(double a,int b){} +public static void open(int a,double b){} +public void open(int i,double d){} +public static void OPEN(){} +public static void open(int i,int j){} +``` + +#### 练习三 + +模拟输出语句中的`println`方法效果,传递什么类型的数据就输出什么类型的数据,只允许定义一个方法名`println`。 + +```java +public class Method_Demo7 { + public static void println(byte a) { + System.out.println(a); + } + + public static void println(short a) { + System.out.println(a); + } + + public static void println(int a) { + System.out.println(a); + } + + public static void println(long a) { + System.out.println(a); + } + + public static void println(float a) { + System.out.println(a); + } + + public static void println(double a) { + System.out.println(a); + } + + public static void println(char a) { + System.out.println(a); + } + + public static void println(boolean a) { + System.out.println(a); + } + + public static void println(String a) { + System.out.println(a); + } +} +``` + diff --git a/javaSE1/day04/img/idea1.jpg b/javaSE1/day04/img/idea1.jpg new file mode 100644 index 0000000..7da0567 Binary files /dev/null and b/javaSE1/day04/img/idea1.jpg differ diff --git a/javaSE1/day04/img/idea10.jpg b/javaSE1/day04/img/idea10.jpg new file mode 100644 index 0000000..003727c Binary files /dev/null and b/javaSE1/day04/img/idea10.jpg differ diff --git a/javaSE1/day04/img/idea11.jpg b/javaSE1/day04/img/idea11.jpg new file mode 100644 index 0000000..889ab80 Binary files /dev/null and b/javaSE1/day04/img/idea11.jpg differ diff --git a/javaSE1/day04/img/idea12.jpg b/javaSE1/day04/img/idea12.jpg new file mode 100644 index 0000000..ab955c4 Binary files /dev/null and b/javaSE1/day04/img/idea12.jpg differ diff --git a/javaSE1/day04/img/idea13.jpg b/javaSE1/day04/img/idea13.jpg new file mode 100644 index 0000000..89e18c2 Binary files /dev/null and b/javaSE1/day04/img/idea13.jpg differ diff --git a/javaSE1/day04/img/idea14.jpg b/javaSE1/day04/img/idea14.jpg new file mode 100644 index 0000000..037461a Binary files /dev/null and b/javaSE1/day04/img/idea14.jpg differ diff --git a/javaSE1/day04/img/idea15.jpg b/javaSE1/day04/img/idea15.jpg new file mode 100644 index 0000000..2d7024e Binary files /dev/null and b/javaSE1/day04/img/idea15.jpg differ diff --git a/javaSE1/day04/img/idea16.jpg b/javaSE1/day04/img/idea16.jpg new file mode 100644 index 0000000..0015f22 Binary files /dev/null and b/javaSE1/day04/img/idea16.jpg differ diff --git a/javaSE1/day04/img/idea16_2.jpg b/javaSE1/day04/img/idea16_2.jpg new file mode 100644 index 0000000..e8e733d Binary files /dev/null and b/javaSE1/day04/img/idea16_2.jpg differ diff --git a/javaSE1/day04/img/idea17.jpg b/javaSE1/day04/img/idea17.jpg new file mode 100644 index 0000000..e7ae7bc Binary files /dev/null and b/javaSE1/day04/img/idea17.jpg differ diff --git a/javaSE1/day04/img/idea18.jpg b/javaSE1/day04/img/idea18.jpg new file mode 100644 index 0000000..0dc71a9 Binary files /dev/null and b/javaSE1/day04/img/idea18.jpg differ diff --git a/javaSE1/day04/img/idea19.jpg b/javaSE1/day04/img/idea19.jpg new file mode 100644 index 0000000..37e328a Binary files /dev/null and b/javaSE1/day04/img/idea19.jpg differ diff --git a/javaSE1/day04/img/idea2.jpg b/javaSE1/day04/img/idea2.jpg new file mode 100644 index 0000000..dd38443 Binary files /dev/null and b/javaSE1/day04/img/idea2.jpg differ diff --git a/javaSE1/day04/img/idea20.jpg b/javaSE1/day04/img/idea20.jpg new file mode 100644 index 0000000..bcd4f14 Binary files /dev/null and b/javaSE1/day04/img/idea20.jpg differ diff --git a/javaSE1/day04/img/idea21.jpg b/javaSE1/day04/img/idea21.jpg new file mode 100644 index 0000000..48ff016 Binary files /dev/null and b/javaSE1/day04/img/idea21.jpg differ diff --git a/javaSE1/day04/img/idea22.jpg b/javaSE1/day04/img/idea22.jpg new file mode 100644 index 0000000..3b1823e Binary files /dev/null and b/javaSE1/day04/img/idea22.jpg differ diff --git a/javaSE1/day04/img/idea23.jpg b/javaSE1/day04/img/idea23.jpg new file mode 100644 index 0000000..8ee22a3 Binary files /dev/null and b/javaSE1/day04/img/idea23.jpg differ diff --git a/javaSE1/day04/img/idea24.jpg b/javaSE1/day04/img/idea24.jpg new file mode 100644 index 0000000..6fc2926 Binary files /dev/null and b/javaSE1/day04/img/idea24.jpg differ diff --git a/javaSE1/day04/img/idea25.jpg b/javaSE1/day04/img/idea25.jpg new file mode 100644 index 0000000..faf92f5 Binary files /dev/null and b/javaSE1/day04/img/idea25.jpg differ diff --git a/javaSE1/day04/img/idea26.jpg b/javaSE1/day04/img/idea26.jpg new file mode 100644 index 0000000..3ef5206 Binary files /dev/null and b/javaSE1/day04/img/idea26.jpg differ diff --git a/javaSE1/day04/img/idea27.jpg b/javaSE1/day04/img/idea27.jpg new file mode 100644 index 0000000..db07e48 Binary files /dev/null and b/javaSE1/day04/img/idea27.jpg differ diff --git a/javaSE1/day04/img/idea28.jpg b/javaSE1/day04/img/idea28.jpg new file mode 100644 index 0000000..21c7de7 Binary files /dev/null and b/javaSE1/day04/img/idea28.jpg differ diff --git a/javaSE1/day04/img/idea29.jpg b/javaSE1/day04/img/idea29.jpg new file mode 100644 index 0000000..28547b3 Binary files /dev/null and b/javaSE1/day04/img/idea29.jpg differ diff --git a/javaSE1/day04/img/idea3.jpg b/javaSE1/day04/img/idea3.jpg new file mode 100644 index 0000000..46110e8 Binary files /dev/null and b/javaSE1/day04/img/idea3.jpg differ diff --git a/javaSE1/day04/img/idea30.jpg b/javaSE1/day04/img/idea30.jpg new file mode 100644 index 0000000..a8d766c Binary files /dev/null and b/javaSE1/day04/img/idea30.jpg differ diff --git a/javaSE1/day04/img/idea31.jpg b/javaSE1/day04/img/idea31.jpg new file mode 100644 index 0000000..b4e6548 Binary files /dev/null and b/javaSE1/day04/img/idea31.jpg differ diff --git a/javaSE1/day04/img/idea32.jpg b/javaSE1/day04/img/idea32.jpg new file mode 100644 index 0000000..b99a3e2 Binary files /dev/null and b/javaSE1/day04/img/idea32.jpg differ diff --git a/javaSE1/day04/img/idea33.jpg b/javaSE1/day04/img/idea33.jpg new file mode 100644 index 0000000..00c8cbd Binary files /dev/null and b/javaSE1/day04/img/idea33.jpg differ diff --git a/javaSE1/day04/img/idea4.jpg b/javaSE1/day04/img/idea4.jpg new file mode 100644 index 0000000..ca6a658 Binary files /dev/null and b/javaSE1/day04/img/idea4.jpg differ diff --git a/javaSE1/day04/img/idea5.jpg b/javaSE1/day04/img/idea5.jpg new file mode 100644 index 0000000..cabe8da Binary files /dev/null and b/javaSE1/day04/img/idea5.jpg differ diff --git a/javaSE1/day04/img/idea6.jpg b/javaSE1/day04/img/idea6.jpg new file mode 100644 index 0000000..f75113f Binary files /dev/null and b/javaSE1/day04/img/idea6.jpg differ diff --git a/javaSE1/day04/img/idea7.jpg b/javaSE1/day04/img/idea7.jpg new file mode 100644 index 0000000..55a7048 Binary files /dev/null and b/javaSE1/day04/img/idea7.jpg differ diff --git a/javaSE1/day04/img/idea8.jpg b/javaSE1/day04/img/idea8.jpg new file mode 100644 index 0000000..fc9942b Binary files /dev/null and b/javaSE1/day04/img/idea8.jpg differ diff --git a/javaSE1/day04/img/idea9.jpg b/javaSE1/day04/img/idea9.jpg new file mode 100644 index 0000000..2f21266 Binary files /dev/null and b/javaSE1/day04/img/idea9.jpg differ diff --git a/javaSE1/day04/img/image-20250521211304386.jpg b/javaSE1/day04/img/image-20250521211304386.jpg new file mode 100644 index 0000000..9f0045d Binary files /dev/null and b/javaSE1/day04/img/image-20250521211304386.jpg differ diff --git a/javaSE1/day04/img/image-20250521211304386.png b/javaSE1/day04/img/image-20250521211304386.png new file mode 100644 index 0000000..9f0045d Binary files /dev/null and b/javaSE1/day04/img/image-20250521211304386.png differ diff --git a/javaSE1/day04/img/image-20250521211951691.png b/javaSE1/day04/img/image-20250521211951691.png new file mode 100644 index 0000000..cbac45a Binary files /dev/null and b/javaSE1/day04/img/image-20250521211951691.png differ diff --git a/javaSE1/day04/img/image-20250521211958347.png b/javaSE1/day04/img/image-20250521211958347.png new file mode 100644 index 0000000..cbac45a Binary files /dev/null and b/javaSE1/day04/img/image-20250521211958347.png differ diff --git a/javaSE1/day04/img/image-20250521212225552.png b/javaSE1/day04/img/image-20250521212225552.png new file mode 100644 index 0000000..dff7e4b Binary files /dev/null and b/javaSE1/day04/img/image-20250521212225552.png differ diff --git a/javaSE1/day04/img/image-20250521212325105.png b/javaSE1/day04/img/image-20250521212325105.png new file mode 100644 index 0000000..7498e77 Binary files /dev/null and b/javaSE1/day04/img/image-20250521212325105.png differ diff --git a/javaSE1/day04/img/image-20250521215022830.png b/javaSE1/day04/img/image-20250521215022830.png new file mode 100644 index 0000000..88806b4 Binary files /dev/null and b/javaSE1/day04/img/image-20250521215022830.png differ diff --git a/javaSE1/day04/img/image-20250521215908656.png b/javaSE1/day04/img/image-20250521215908656.png new file mode 100644 index 0000000..25c8fb8 Binary files /dev/null and b/javaSE1/day04/img/image-20250521215908656.png differ diff --git a/javaSE1/day04/img/image-20250521215939801.png b/javaSE1/day04/img/image-20250521215939801.png new file mode 100644 index 0000000..dc1b742 Binary files /dev/null and b/javaSE1/day04/img/image-20250521215939801.png differ diff --git a/javaSE1/day04/img/image-20250521220057940.png b/javaSE1/day04/img/image-20250521220057940.png new file mode 100644 index 0000000..2d5cc7f Binary files /dev/null and b/javaSE1/day04/img/image-20250521220057940.png differ diff --git a/javaSE1/day04/img/image-20250521224309863.png b/javaSE1/day04/img/image-20250521224309863.png new file mode 100644 index 0000000..f974410 Binary files /dev/null and b/javaSE1/day04/img/image-20250521224309863.png differ diff --git a/javaSE1/day04/img/image-20250521224935481.png b/javaSE1/day04/img/image-20250521224935481.png new file mode 100644 index 0000000..35c12c4 Binary files /dev/null and b/javaSE1/day04/img/image-20250521224935481.png differ diff --git a/javaSE1/day04/img/image-20250521225238179.png b/javaSE1/day04/img/image-20250521225238179.png new file mode 100644 index 0000000..35fa340 Binary files /dev/null and b/javaSE1/day04/img/image-20250521225238179.png differ diff --git a/javaSE1/day04/img/image-20250521231255552.png b/javaSE1/day04/img/image-20250521231255552.png new file mode 100644 index 0000000..aa158d3 Binary files /dev/null and b/javaSE1/day04/img/image-20250521231255552.png differ diff --git a/javaSE1/day04/img/image-20250521231336051.png b/javaSE1/day04/img/image-20250521231336051.png new file mode 100644 index 0000000..30550ed Binary files /dev/null and b/javaSE1/day04/img/image-20250521231336051.png differ diff --git a/javaSE1/day04/img/image-20250521231636549.png b/javaSE1/day04/img/image-20250521231636549.png new file mode 100644 index 0000000..bca4db2 Binary files /dev/null and b/javaSE1/day04/img/image-20250521231636549.png differ diff --git a/javaSE1/day04/img/image-20250521231715287.png b/javaSE1/day04/img/image-20250521231715287.png new file mode 100644 index 0000000..5efc02f Binary files /dev/null and b/javaSE1/day04/img/image-20250521231715287.png differ diff --git a/javaSE1/day04/img/image-20250521231822220.png b/javaSE1/day04/img/image-20250521231822220.png new file mode 100644 index 0000000..8cbd2a2 Binary files /dev/null and b/javaSE1/day04/img/image-20250521231822220.png differ diff --git a/javaSE1/day04/img/image-20250521231854773.png b/javaSE1/day04/img/image-20250521231854773.png new file mode 100644 index 0000000..9002abf Binary files /dev/null and b/javaSE1/day04/img/image-20250521231854773.png differ diff --git a/javaSE1/day04/img/image-20250521231937222.png b/javaSE1/day04/img/image-20250521231937222.png new file mode 100644 index 0000000..ffcaeaf Binary files /dev/null and b/javaSE1/day04/img/image-20250521231937222.png differ diff --git a/javaSE1/day04/img/image-20250521232129512.png b/javaSE1/day04/img/image-20250521232129512.png new file mode 100644 index 0000000..4b60c34 Binary files /dev/null and b/javaSE1/day04/img/image-20250521232129512.png differ diff --git a/javaSE1/day04/img/image-20250521232303300.png b/javaSE1/day04/img/image-20250521232303300.png new file mode 100644 index 0000000..464f84c Binary files /dev/null and b/javaSE1/day04/img/image-20250521232303300.png differ diff --git a/javaSE1/day04/img/image-20250521233741690.png b/javaSE1/day04/img/image-20250521233741690.png new file mode 100644 index 0000000..476a17a Binary files /dev/null and b/javaSE1/day04/img/image-20250521233741690.png differ diff --git a/javaSE1/day04/img/image-20250521233938325.png b/javaSE1/day04/img/image-20250521233938325.png new file mode 100644 index 0000000..cad3b82 Binary files /dev/null and b/javaSE1/day04/img/image-20250521233938325.png differ diff --git a/javaSE1/day04/img/image-20250521234433853.png b/javaSE1/day04/img/image-20250521234433853.png new file mode 100644 index 0000000..1183412 Binary files /dev/null and b/javaSE1/day04/img/image-20250521234433853.png differ diff --git a/javaSE1/day04/img/image-20250521234846397.png b/javaSE1/day04/img/image-20250521234846397.png new file mode 100644 index 0000000..5dc813f Binary files /dev/null and b/javaSE1/day04/img/image-20250521234846397.png differ diff --git a/javaSE1/day04/img/image-20250521234941828.png b/javaSE1/day04/img/image-20250521234941828.png new file mode 100644 index 0000000..f6d11de Binary files /dev/null and b/javaSE1/day04/img/image-20250521234941828.png differ diff --git a/javaSE1/day04/img/方法调用图解.jpg b/javaSE1/day04/img/方法调用图解.jpg new file mode 100644 index 0000000..8ef51fe Binary files /dev/null and b/javaSE1/day04/img/方法调用图解.jpg differ diff --git a/javaSE1/day04/img/方法调用图解.jpg.peda b/javaSE1/day04/img/方法调用图解.jpg.peda new file mode 100644 index 0000000..7a1d5f8 Binary files /dev/null and b/javaSE1/day04/img/方法调用图解.jpg.peda differ diff --git a/javaSE1/day05/day05【数组】.md b/javaSE1/day05/day05【数组】.md new file mode 100644 index 0000000..952dc9a --- /dev/null +++ b/javaSE1/day05/day05【数组】.md @@ -0,0 +1,481 @@ +# day05【数组】 + +### 今日内容 + +- 数组概念 +- 数组的定义 +- 数组的索引 +- 数组内存 +- 数组的遍历 +- 数组的最大值获取 +- 数组反转 +- 数组作为方法参数和返回值 + +### 教学目标 + +- [ ] 理解容器的概念 +- [ ] 掌握数组的第一种定义方式 +- [ ] 掌握数组的第二种定义方式 +- [ ] 掌握数组的第三种定义方式 +- [ ] 使用索引访问数组的元素 +- [ ] 了解数组的内存图解 +- [ ] 了解空指针和越界异常 +- [ ] 掌握数组的遍历 +- [ ] 掌握数组最大值的获取 +- [ ] 了解数组反转的原理 +- [ ] 了解数组作为方法参数传递 +- [ ] 了解数组作为方法的返回值 + +## 第一章 数组定义和访问 + +### 1.1 容器概述 + +#### 案例分析 + +现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有50名员工,用前面所学的知识,程序首先需要声明50个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦,而且错误率也会很高。因此我们可以使用容器进行操作。将所有的数据全部存储到一个容器中,统一操作。 + +#### 容器概念 + +- **容器:**是将多个数据存储到一起,每个数据称为该容器的元素。 +- **生活中的容器:**水杯,衣柜,教室 + +### 1.2 数组概念 + +- **数组概念:** 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。 + +### 1.3 数组的定义 + +#### 方式一 + +- **格式:** + +```java + 数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度]; +``` + +- 数组定义格式详解: + - 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。 + - [] : 表示数组。 + - 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。 + - new:关键字,创建数组使用的关键字。 + - 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。 + - [长度]:数组的长度,表示数组容器中可以存储多少个元素。 + - **注意:数组有定长特性,长度一旦指定,不可更改。** + - 和水杯道理相同,买了一个2升的水杯,总容量就是2升,不能多也不能少。 +- 举例: + +定义可以存储3个整数的数组容器,代码如下: + +```java +int[] arr = new int[3]; +``` + +#### 方式二 + +- **格式:** + +```java +数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...}; +``` + +* 举例: + +定义存储1,2,3,4,5整数的数组容器。 + +```java +int[] arr = new int[]{1,2,3,4,5}; +``` + +#### 方式三 + +- **格式:** + +```java +数据类型[] 数组名 = {元素1,元素2,元素3...}; +``` + +* 举例: + +定义存储1,2,3,4,5整数的数组容器 + +```java +int[] arr = {1,2,3,4,5}; +``` + +### 1.4 数组的访问 + +- **索引:** 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为**数组索引(index)**,可以通过数组的索引访问到数组中的元素。 +- **格式:** + +```java +数组名[索引] +``` + +- **数组的长度属性:** 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:`数组名.length` ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为`数组名.length-1`。 + +```java +public static void main(String[] args) { + int[] arr = new int[]{1,2,3,4,5}; + //打印数组的属性,输出结果是5 + System.out.println(arr.length); +} +``` + +- **索引访问数组中的元素:** + - 数组名[索引]=数值,为数组中的元素赋值 + - 变量=数组名[索引],获取出数组中的元素 + +```java +public static void main(String[] args) { + //定义存储int类型数组,赋值元素1,2,3,4,5 + int[] arr = {1,2,3,4,5}; + //为0索引元素赋值为6 + arr[0] = 6; + //获取数组0索引上的元素 + int i = arr[0]; + System.out.println(i); + //直接输出数组0索引元素 + System.out.println(arr[0]); +} +``` + +## 第二章 数组原理内存图 + +### 2.1 内存概述 + +内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。 + +Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。 + +### 2.2 Java虚拟机的内存划分 + +为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 + +- JVM的内存划分: + + | 区域名称 | 作用 | + | ----- | ------------------------------- | + | 寄存器 | 给CPU使用,和我们开发无关。 | + | 本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 | + | 方法区 | 存储可以运行的class文件。 | + | 堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 | + | 方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 | + +### 2.3 数组在内存中的存储 + +#### 一个数组内存图 + +```java +public static void main(String[] args) { + int[] arr = new int[3]; + System.out.println(arr);//[I@5f150435 +} +``` + +以上方法执行,输出的结果是[I@5f150435,这个是什么呢?是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。 + +**输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素** + +![](img/数组内存图1.jpg) + +#### 两个数组内存图 + +```java +public static void main(String[] args) { + int[] arr = new int[3]; + int[] arr2 = new int[2]; + System.out.println(arr); + System.out.println(arr2); +} +``` + +![](img/数组内存图2.jpg) + +#### 两个变量指向一个数组 + +```java +public static void main(String[] args) { + // 定义数组,存储3个元素 + int[] arr = new int[3]; + //数组索引进行赋值 + arr[0] = 5; + arr[1] = 6; + arr[2] = 7; + //输出3个索引上的元素值 + System.out.println(arr[0]); + System.out.println(arr[1]); + System.out.println(arr[2]); + //定义数组变量arr2,将arr的地址赋值给arr2 + int[] arr2 = arr; + arr2[1] = 9; + System.out.println(arr[1]); +} +``` + + ![](img/数组内存图3.jpg) + +## 第三章 数组的常见操作 + +### 3.1 数组越界异常 + +观察一下代码,运行后会出现什么结果。 + +```java +public static void main(String[] args) { + int[] arr = {1,2,3}; + System.out.println(arr[3]); +} +``` + +创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出 `ArrayIndexOutOfBoundsException` 数组越界异常。在开发中,数组的越界异常是**不能出现**的,一旦出现了,就必须要修改我们编写的代码。 + +![](img/数组越界异常.jpg) + +### 3.2 数组空指针异常 + +观察一下代码,运行后会出现什么结果。 + +```java +public static void main(String[] args) { + int[] arr = {1,2,3}; + arr = null; + System.out.println(arr[0]); +} +``` +`arr = null`这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出`NullPointerException` 空指针异常。在开发中,数组的越界异常是**不能出现**的,一旦出现了,就必须要修改我们编写的代码。 + +![](img/空指针异常.jpg) + +**空指针异常在内存图中的表现** + +![](img/空指针异常内存图.jpg) + +### 3.3 数组遍历【重点】 + +- **数组遍历:** 就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。 + +```java +public static void main(String[] args) { + int[] arr = { 1, 2, 3, 4, 5 }; + System.out.println(arr[0]); + System.out.println(arr[1]); + System.out.println(arr[2]); + System.out.println(arr[3]); + System.out.println(arr[4]); +} +``` + +以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是`0`到`lenght-1` ,可以作为循环的条件出现。 + +```java +public static void main(String[] args) { + int[] arr = { 1, 2, 3, 4, 5 }; + for (int i = 0; i < arr.length; i++) { + System.out.println(arr[i]); + } +} +``` + +### 3.4 数组获取最大值元素 + +- **最大值获取:**从数组的所有元素中找出最大值。 +- **实现思路:** + - 定义变量,保存数组0索引上的元素 + - 遍历数组,获取出数组中的每个元素 + - 将遍历到的元素和保存数组0索引上值的变量进行比较 + - 如果数组元素的值大于了变量的值,变量记录住新的值 + - 数组循环遍历结束,变量保存的就是数组中的最大值 + + +![](img/数组最大值.jpg) + +```java +public static void main(String[] args) { + int[] arr = { 5, 15, 2000, 10000, 100, 4000 }; + //定义变量,保存数组中0索引的元素 + int max = arr[0]; + //遍历数组,取出每个元素 + for (int i = 0; i < arr.length; i++) { + //遍历到的元素和变量max比较 + //如果数组元素大于max + if (arr[i] > max) { + //max记录住大值 + max = arr[i]; + } + } + System.out.println("数组最大值是: " + max); +} +``` + +### 3.5 数组反转 + +- **数组的反转:** 数组中的元素颠倒顺序,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1 +- **实现思想:**数组最远端的元素互换位置。 + - 实现反转,就需要将数组最远端元素位置交换 + - 定义两个变量,保存数组的最小索引和最大索引 + - 两个索引上的元素交换位置 + - 最小索引++,最大索引--,再次交换位置 + - 最小索引超过了最大索引,数组反转操作结束 + +![](img/数组反转.jpg) + +```java +public static void main(String[] args) { + int[] arr = { 1, 2, 3, 4, 5 }; + /* + 循环中定义变量min=0最小索引 + max=arr.length-1最大索引 + min++,max-- + */ + for (int min = 0, max = arr.length - 1; min <= max; min++, max--) { + //利用第三方变量完成数组中的元素交换 + int temp = arr[min]; + arr[min] = arr[max]; + arr[max] = temp; + } + // 反转后,遍历数组 + for (int i = 0; i < arr.length; i++) { + System.out.println(arr[i]); + } +} +``` + +## 第四章 数组作为方法参数和返回值 + +### 4.1 数组作为方法参数 + +以前的方法中我们学习了方法的参数和返回值,但是使用的都是基本数据类型。那么作为引用类型的数组能否作为方法的参数进行传递呢,当然是可以的。 + +- **数组作为方法参数传递,传递的参数是数组内存的地址。** + +```java +public static void main(String[] args) { + int[] arr = { 1, 3, 5, 7, 9 }; + //调用方法,传递数组 + printArray(arr); +} +/* + 创建方法,方法接收数组类型的参数 + 进行数组的遍历 +*/ +public static void printArray(int[] arr) { + for (int i = 0; i < arr.length; i++) { + System.out.println(arr[i]); + } +} +``` + +![](img/方法参数是数组.jpg) + +### 4.2 数组作为方法返回值 + +- 数组作为方法的返回值,返回的是数组的内存地址 + +```java +public static void main(String[] args) { + //调用方法,接收数组的返回值 + //接收到的是数组的内存地址 + int[] arr = getArray(); + for (int i = 0; i < arr.length; i++) { + System.out.println(arr[i]); + } +} +/* + 创建方法,返回值是数组类型 + return返回数组的地址 +*/ +public static int[] getArray() { + int[] arr = { 1, 3, 5, 7, 9 }; + //返回数组的地址,返回到调用者 + return arr; +} +``` + +![](img/方法返回值是数组.jpg) + +### 4.3 方法的参数类型区别 + +#### 代码分析 + +**1. 分析下列程序代码,计算输出结果。** + +```java +public static void main(String[] args) { + int a = 1; + int b = 2; + System.out.println(a); + System.out.println(b); + change(a, b); + System.out.println(a); + System.out.println(b); +} + +public static void change(int a, int b) { + a = a + b; + b = b + a; +} +``` + +**2. 分析下列程序代码,计算输出结果。** + +```java +public static void main(String[] args) { + int[] arr = {1,3,5}; + System.out.println(arr[0]); + change(arr); + System.out.println(arr[0]); +} + +public static void change(int[] arr) { + arr[0] = 200; +} +``` + +#### 断点查看 + +**使用IDEA的断点调试功能,查看程序的运行过程** + +1. 在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 + +![](img/debug1.jpg) + +2. 点击Debug运行模式 + + ![](img/debug2.jpg) + +3. 程序停止在断点上不再执行,而IDEA最下方打开了Debug调试窗口 + + ![](img/debug3.jpg) + + ![](img/debug4.jpg) + +4. Debug调试窗口介绍 + + ![](img/debug6.jpg) + +5. 快捷键F8,代码向下执行一行 + +![](img/debug7.jpg) + +6. 快捷键F8执行输出语句,此时到达change方法,快捷键F7,进入方法change + + ![](img/debug8.jpg) + +7. 快捷键F8,程序继续向后执行,数组0索引值被修改成200 + + ![](img/debug9.jpg) + +8. 切换到控制台面板,看看两个方法中是否输出了相同的数组地址 + + ![](img/debug5.jpg) + +9. 程序继续执行,change方法结束,程序回到main中 + + ![](img/debug10.jpg) + +10. 调试结束,点击Console切换到控制台,看输出的结果 + + ![](img/debug11.jpg) + + + diff --git a/javaSE1/day05/img/debug1.jpg b/javaSE1/day05/img/debug1.jpg new file mode 100644 index 0000000..a703450 Binary files /dev/null and b/javaSE1/day05/img/debug1.jpg differ diff --git a/javaSE1/day05/img/debug10.jpg b/javaSE1/day05/img/debug10.jpg new file mode 100644 index 0000000..45d250e Binary files /dev/null and b/javaSE1/day05/img/debug10.jpg differ diff --git a/javaSE1/day05/img/debug11.jpg b/javaSE1/day05/img/debug11.jpg new file mode 100644 index 0000000..cf1832c Binary files /dev/null and b/javaSE1/day05/img/debug11.jpg differ diff --git a/javaSE1/day05/img/debug2.jpg b/javaSE1/day05/img/debug2.jpg new file mode 100644 index 0000000..ee99971 Binary files /dev/null and b/javaSE1/day05/img/debug2.jpg differ diff --git a/javaSE1/day05/img/debug3.jpg b/javaSE1/day05/img/debug3.jpg new file mode 100644 index 0000000..73388be Binary files /dev/null and b/javaSE1/day05/img/debug3.jpg differ diff --git a/javaSE1/day05/img/debug4.jpg b/javaSE1/day05/img/debug4.jpg new file mode 100644 index 0000000..18265a5 Binary files /dev/null and b/javaSE1/day05/img/debug4.jpg differ diff --git a/javaSE1/day05/img/debug5.jpg b/javaSE1/day05/img/debug5.jpg new file mode 100644 index 0000000..5173ff4 Binary files /dev/null and b/javaSE1/day05/img/debug5.jpg differ diff --git a/javaSE1/day05/img/debug6.jpg b/javaSE1/day05/img/debug6.jpg new file mode 100644 index 0000000..52e142a Binary files /dev/null and b/javaSE1/day05/img/debug6.jpg differ diff --git a/javaSE1/day05/img/debug7.jpg b/javaSE1/day05/img/debug7.jpg new file mode 100644 index 0000000..cf91135 Binary files /dev/null and b/javaSE1/day05/img/debug7.jpg differ diff --git a/javaSE1/day05/img/debug8.jpg b/javaSE1/day05/img/debug8.jpg new file mode 100644 index 0000000..4987f66 Binary files /dev/null and b/javaSE1/day05/img/debug8.jpg differ diff --git a/javaSE1/day05/img/debug9.jpg b/javaSE1/day05/img/debug9.jpg new file mode 100644 index 0000000..0c38e81 Binary files /dev/null and b/javaSE1/day05/img/debug9.jpg differ diff --git a/javaSE1/day05/img/数组内存图1.jpg b/javaSE1/day05/img/数组内存图1.jpg new file mode 100644 index 0000000..0187dab Binary files /dev/null and b/javaSE1/day05/img/数组内存图1.jpg differ diff --git a/javaSE1/day05/img/数组内存图2.jpg b/javaSE1/day05/img/数组内存图2.jpg new file mode 100644 index 0000000..3a09f53 Binary files /dev/null and b/javaSE1/day05/img/数组内存图2.jpg differ diff --git a/javaSE1/day05/img/数组内存图3.jpg b/javaSE1/day05/img/数组内存图3.jpg new file mode 100644 index 0000000..aaee474 Binary files /dev/null and b/javaSE1/day05/img/数组内存图3.jpg differ diff --git a/javaSE1/day05/img/数组反转.jpg b/javaSE1/day05/img/数组反转.jpg new file mode 100644 index 0000000..cb79799 Binary files /dev/null and b/javaSE1/day05/img/数组反转.jpg differ diff --git a/javaSE1/day05/img/数组最大值.jpg b/javaSE1/day05/img/数组最大值.jpg new file mode 100644 index 0000000..be9bf5a Binary files /dev/null and b/javaSE1/day05/img/数组最大值.jpg differ diff --git a/javaSE1/day05/img/数组越界异常.jpg b/javaSE1/day05/img/数组越界异常.jpg new file mode 100644 index 0000000..fd5ae93 Binary files /dev/null and b/javaSE1/day05/img/数组越界异常.jpg differ diff --git a/javaSE1/day05/img/方法参数是数组.jpg b/javaSE1/day05/img/方法参数是数组.jpg new file mode 100644 index 0000000..f396132 Binary files /dev/null and b/javaSE1/day05/img/方法参数是数组.jpg differ diff --git a/javaSE1/day05/img/方法返回值是数组.jpg b/javaSE1/day05/img/方法返回值是数组.jpg new file mode 100644 index 0000000..8415917 Binary files /dev/null and b/javaSE1/day05/img/方法返回值是数组.jpg differ diff --git a/javaSE1/day05/img/空指针异常.jpg b/javaSE1/day05/img/空指针异常.jpg new file mode 100644 index 0000000..a0ef096 Binary files /dev/null and b/javaSE1/day05/img/空指针异常.jpg differ diff --git a/javaSE1/day05/img/空指针异常内存图.jpg b/javaSE1/day05/img/空指针异常内存图.jpg new file mode 100644 index 0000000..79f516f Binary files /dev/null and b/javaSE1/day05/img/空指针异常内存图.jpg differ diff --git a/javaSE1/day06/day06【类与对象、封装、构造方法】.md b/javaSE1/day06/day06【类与对象、封装、构造方法】.md new file mode 100644 index 0000000..2c54b45 --- /dev/null +++ b/javaSE1/day06/day06【类与对象、封装、构造方法】.md @@ -0,0 +1,531 @@ +# day06【类与对象、封装、构造方法】 + +### 今日内容 + +- 面向对象 +- 类与对象 +- 三大特征——封装 +- 构造方法 + +### 教学目标 + +- [ ] 能够理解面向对象的思想 +- [ ] 能够明确类与对象关系 +- [ ] 能够根据类的定义,定义学生类 +- [ ] 能够创建对象,并且使用对象访问类中的成员 +- [ ] 能够完成手机类的练习 +- [ ] 能够理解对象的内存图 +- [ ] 能够说出成员变量和局部变量的区别 +- [ ] 能够运用private关键字 +- [ ] 能够说出this关键字可以解决的问题 +- [ ] 能够运用构造方法创建对象 +- [ ] 能够用封装的思想定义一个标准类 + +## 第1章 面向对象思想 + +### 1.1 面向对象思想概述 + +#### 概述 + +Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 +这里的**对象**泛指现实中一切事物,每种事物都具备自己的**属性**和**行为**。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 +它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。 + +#### 举例 + +洗衣服: + +* 面向过程:把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干-->晾起来 +* 面向对象:把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来 + +区别: + +* 面向过程:强调步骤。 + + +* 面向对象:强调对象,这里的对象就是洗衣机。 + +#### 特点 + +面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。 + +### 1.2 类和对象 + +环顾周围,你会发现很多对象,比如桌子,椅子,同学,老师等。桌椅属于办公用品,师生都是人类。那么什么是类呢?什么是对象呢? + +#### 什么是类 + +* **类**:是一组相关**属性**和**行为**的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。 + +现实中,描述一类事物: + +* **属性**:就是该事物的状态信息。 +* **行为**:就是该事物能够做什么。 + +举例:小猫。 + +​ 属性:名字、体重、年龄、颜色。 +​ 行为:走、跑、叫。 + +#### 什么是对象 + +* **对象**:是一类事物的具体体现。对象是类的一个**实例**(对象并不是找个女朋友),必然具备该类事物的属性和行为。 + +现实中,一类事物的一个实例:一只小猫。 + +举例:一只小猫。 + +​ 属性:tom、5kg、2 years、yellow。 +​ 行为:溜墙根走、蹦跶的跑、喵喵叫。 + +#### 类与对象的关系 + +- 类是对一类事物的描述,是**抽象的**。 +- 对象是一类事物的实例,是**具体的**。 +- **类是对象的模板,对象是类的实体**。 + +![](img/1.jpg) + +### 1.3 类的定义 + +#### 事物与类的对比 + +现实世界的一类事物: + +​ **属性**:事物的状态信息。 +​ **行为**:事物能够做什么。 + + Java中用class描述事物也是如此: + +​ **成员变量**:对应事物的**属性** +​ **成员方法**:对应事物的**行为** + +#### 类的定义格式 + +```java +public class ClassName { + //成员变量 + //成员方法 +} +``` + +* **定义类**:就是定义类的成员,包括**成员变量**和**成员方法**。 +* **成员变量**:和以前定义变量几乎是一样的。只不过位置发生了改变。**在类中,方法外**。 +* **成员方法**:和以前定义方法几乎是一样的。只不过**把static去掉**,static的作用在面向对象后面课程中再详细讲解。 + +类的定义格式举例: + +```java +public class Student { + //成员变量 + String name;//姓名 + int age;//年龄 + + //成员方法 + //学习的方法 + publicvoid study() { + System.out.println("好好学习,天天向上"); + } + + //吃饭的方法 + publicvoid eat() { + System.out.println("学习饿了要吃饭"); + } +} +``` + +### 1.4 对象的使用 + +#### 对象的使用格式 + +创建对象: + +```java +类名 对象名 = new 类名(); +``` + +使用对象访问类中的成员: + +```java +对象名.成员变量; +对象名.成员方法(); +``` + +对象的使用格式举例: + +```java +public class Test01_Student { + public static void main(String[] args) { + //创建对象格式:类名 对象名 = new 类名(); + Student s = new Student(); + System.out.println("s:"+s); //cn.inmind.Student@100363 + + //直接输出成员变量值 + System.out.println("姓名:"+s.name); //null + System.out.println("年龄:"+s.age); //0 + System.out.println("----------"); + + //给成员变量赋值 + s.name = "赵丽颖"; + s.age = 18; + + //再次输出成员变量的值 + System.out.println("姓名:"+s.name); //赵丽颖 + System.out.println("年龄:"+s.age); //18 + System.out.println("----------"); + + //调用成员方法 + s.study(); // "好好学习,天天向上" + s.eat(); // "学习饿了要吃饭" + } +} +``` +#### 成员变量的默认值 + +| | 数据类型 | 默认值 | +| ---- | ----------------------- | -------- | +| 基本类型 | 整数(byte,short,int,long) | 0 | +| | 浮点数(float,double) | 0.0 | +| | 字符(char) | '\u0000' | +| | 布尔(boolean) | false | +| 引用类型 | 数组,类,接口 | null | + +### 1.5 类与对象的练习 + +定义手机类: + +```java +public class Phone { + // 成员变量 + String brand; //品牌 + int price; //价格 + String color; //颜色 + + // 成员方法 + //打电话 + public void call(String name) { + System.out.println("给"+name+"打电话"); + } + + //发短信 + public void sendMessage() { + System.out.println("群发短信"); + } +} +``` + +定义测试类: + +```java +public class Test02Phone { + public static void main(String[] args) { + //创建对象 + Phone p = new Phone(); + + //输出成员变量值 + System.out.println("品牌:"+p.brand);//null + System.out.println("价格:"+p.price);//0 + System.out.println("颜色:"+p.color);//null + System.out.println("------------"); + + //给成员变量赋值 + p.brand = "锤子"; + p.price = 2999; + p.color = "棕色"; + + //再次输出成员变量值 + System.out.println("品牌:"+p.brand);//锤子 + System.out.println("价格:"+p.price);//2999 + System.out.println("颜色:"+p.color);//棕色 + System.out.println("------------"); + + //调用成员方法 + p.call("紫霞"); + p.sendMessage(); + } +} +``` + +### 1.6 对象内存图 + +#### 一个对象,调用一个方法内存图 + +![](img/2.jpg) + +> 通过上图,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。 +> +> 但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。那么如何解决这个问题呢?请看如下图解。 + +#### 两个对象,调用同一方法内存图 + +![](img/3.jpg) + +> 对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。 + +#### 一个引用,作为参数传递到方法中内存图 + +![](img/4.jpg) + +> 引用类型作为参数,传递的是地址值。 + +### 1.7 成员变量和局部变量区别 + +变量根据定义**位置的不同**,我们给变量起了不同的名字。如下图所示: + +![](img/5.jpg) + +- 在类中的位置不同 `重点` + + ​ 成员变量:类中,方法外 + ​ 局部变量:方法中或者方法声明上(形式参数) + +- 作用范围不一样 `重点` + + ​ 成员变量:类中 + ​ 局部变量:方法中 + +- 初始化值的不同 `重点` + + ​ 成员变量:有默认值 + ​ 局部变量:没有默认值。必须先定义,赋值,最后使用 + +- 在内存中的位置不同 `了解` + + ​ 成员变量:堆内存 + ​ 局部变量:栈内存 + +- 生命周期不同 `了解` + + ​ 成员变量:随着对象的创建而存在,随着对象的消失而消失 + ​ 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 + +## 第2章 封装 + +### 2.1 封装概述 + +#### 概述 + +面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。 + +#### 原则 + +将**属性隐藏**起来,若需要访问某个属性,**提供公共方法**对其访问。 + +### 2.2 封装的步骤 + +1. 使用 `private` 关键字来修饰成员变量。 +2. 对需要访问的成员变量,提供对应的一对 `getXxx`方法 、`setXxx` 方法。 + +### 2.3 封装的操作——private关键字 + +#### private的含义 + +1. private是一个权限修饰符,代表最小权限。 +2. 可以修饰成员变量和成员方法。 +3. 被private修饰后的成员变量和成员方法,只在本类中才能访问。 + +#### private的使用格式 + +```java +private 数据类型 变量名 ; +``` + +1. 使用 `private` 修饰成员变量,代码如下: + +```java +public class Student { + private String name; + private int age; +} +``` + +2. 提供 `getXxx`方法 / `setXxx` 方法,可以访问成员变量,代码如下: + +```java +public class Student { + private String name; + private int age; + + public void setName(String n) { + name = n; + } + + public String getName() { + return name; + } + + public void setAge(int a) { + age = a; + } + + public int getAge() { + return age; + } +} +``` + +### 2.4 封装优化1——this关键字 + +我们发现 `setXxx` 方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意了呢?代码如下: + +```java +public class Student { + private String name; + private int age; + public void setName(String name) { + name = name; + } + + public void setAge(int age) { + age = age; + } +} +``` +经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了`setXxx()` 的形参变量名后,方法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题。 + +#### this的含义 + +this代表所在类的当前对象的引用(地址值),即对象自己的引用。 + +> 记住 :方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。 + +#### this使用格式 + +```java +this.成员变量名; +``` + +使用 `this` 修饰方法中的变量,解决成员变量被隐藏的问题,代码如下: + +```java +public class Student { + private String name; + private int age; + + public void setName(String name) { + //name = name; + this.name = name; + } + + public String getName() { + return name; + } + + public void setAge(int age) { + //age = age; + this.age = age; + } + + public int getAge() { + return age; + } +} +``` + +> 小贴士:方法中只有一个变量名时,默认也是使用 `this` 修饰,可以省略不写。 +> + +### 2.5 封装优化2——构造方法 + +当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。 + +> 小贴士:无论你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法,一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。 + +#### 构造方法的定义格式 + +```java +修饰符 构造方法名(参数列表){ + // 方法体 +} +``` +构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。使用构造方法后,代码如下: + +```java +public class Student { + private String name; + private int age; + // 无参数构造方法 + public Student() {} + // 有参数构造方法 + public Student(String name,int age) { + this.name = name; + this.age = age; + } +} +``` + +#### 注意事项 + +1. 如果你不提供构造方法,系统会给出无参数构造方法。 +2. 如果你提供了构造方法,系统将不再提供无参数构造方法。 +3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数。 + + +### 2.6 标准代码——JavaBean + +`JavaBean` 是 Java语言编写类的一种标准规范。符合`JavaBean` 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的`set` 和`get` 方法。 + +```java +public class ClassName{ + //成员变量 + //构造方法 + //无参构造方法【必须】 + //有参构造方法【建议】 + //成员方法 + //getXxx() + //setXxx() +} +``` + + 编写符合`JavaBean` 规范的类,以学生类为例,标准代码如下: + +```java +public class Student { + //成员变量 + private String name; + private int age; + + //构造方法 + public Student() {} + + public Student(String name,int age) { + this.name = name; + this.age = age; + } + + //成员方法 + publicvoid setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + publicvoid setAge(int age) { + this.age = age; + } + + publicint getAge() { + return age; + } +} +``` +测试类,代码如下: + +```java +public class TestStudent { + public static void main(String[] args) { + //无参构造使用 + Student s= new Student(); + s.setName("柳岩"); + s.setAge(18); + System.out.println(s.getName()+"---"+s.getAge()); + + //带参构造使用 + Student s2= new Student("赵丽颖",18); + System.out.println(s2.getName()+"---"+s2.getAge()); + } +} +``` + diff --git a/javaSE1/day06/img/1.jpg b/javaSE1/day06/img/1.jpg new file mode 100644 index 0000000..8170a74 Binary files /dev/null and b/javaSE1/day06/img/1.jpg differ diff --git a/javaSE1/day06/img/2.jpg b/javaSE1/day06/img/2.jpg new file mode 100644 index 0000000..4580a1c Binary files /dev/null and b/javaSE1/day06/img/2.jpg differ diff --git a/javaSE1/day06/img/2.jpg.peda b/javaSE1/day06/img/2.jpg.peda new file mode 100644 index 0000000..ee4d6e7 Binary files /dev/null and b/javaSE1/day06/img/2.jpg.peda differ diff --git a/javaSE1/day06/img/3.jpg b/javaSE1/day06/img/3.jpg new file mode 100644 index 0000000..32249b8 Binary files /dev/null and b/javaSE1/day06/img/3.jpg differ diff --git a/javaSE1/day06/img/3.jpg.peda b/javaSE1/day06/img/3.jpg.peda new file mode 100644 index 0000000..7907ab3 Binary files /dev/null and b/javaSE1/day06/img/3.jpg.peda differ diff --git a/javaSE1/day06/img/4.jpg b/javaSE1/day06/img/4.jpg new file mode 100644 index 0000000..3981d05 Binary files /dev/null and b/javaSE1/day06/img/4.jpg differ diff --git a/javaSE1/day06/img/5.jpg b/javaSE1/day06/img/5.jpg new file mode 100644 index 0000000..cacf871 Binary files /dev/null and b/javaSE1/day06/img/5.jpg differ diff --git a/javaSE1/day07/day07【Scanner类、Random类、ArrayList类】.md b/javaSE1/day07/day07【Scanner类、Random类、ArrayList类】.md new file mode 100644 index 0000000..25b4874 --- /dev/null +++ b/javaSE1/day07/day07【Scanner类、Random类、ArrayList类】.md @@ -0,0 +1,714 @@ +# day07【Scanner类、Random类、ArrayList类】 + +### 今日内容 + +* API概述 +* Scanner类 +* Random类 +* ArrayList类 + + +### 教学目标 + +- [ ] 能够明确API的使用步骤 +- [ ] 能够使用Scanner类获得键盘录入数据 +- [ ] 能够使用Random类生成随机数 +- [ ] 能够使用数组存储自定义类型并遍历 +- [ ] 能够使用ArrayList集合的构造方法创建ArrayList集合对象 +- [ ] 能够使用ArrayList集合存储数据 +- [ ] 能够使用ArrayList集合中常用的方法 +- [ ] 能够使用ArrayList集合存储字符串并遍历 +- [ ] 能够使用ArrayList集合存储自定义对象并遍历 +- [ ] 能够使用ArrayList类作为形式参数和返回值类型 + +## 第1章 API + +### 概述 + +API(Application Programming Interface),应用程序编程接口。Java API是一本程序员的`字典` ,是JDK中提供给我们使用的类的说明文档。这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。所以我们可以通过查询API的方式,来学习Java提供的类,并得知如何使用它们。 + +### API使用步骤 + +1. 打开帮助文档。 +2. 点击显示,找到索引,看到输入框。 +3. 你要找谁?在输入框里输入,然后回车。 +4. 看包。java.lang下的类不需要导包,其他需要。 +5. 看类的解释和说明。 +6. 学习构造方法。 +7. 使用成员方法。 + +## 第2章 Scanner类 + +了解了API的使用方式,我们通过Scanner类,熟悉一下查询API,并使用类的步骤。 + +### 2.1 什么是Scanner类 + +一个可以解析基本类型和字符串的简单文本扫描器。 +例如,以下代码使用户能够从 System.in 中读取一个数: + +```java +Scanner sc = new Scanner(System.in); +int i = sc.nextInt(); +``` + +> 备注:System.in 系统输入指的是通过键盘录入数据。 + +### 2.2 引用类型使用步骤 + +#### 导包 + +使用import关键字导包,在类的所有代码之前导包,引入要使用的类型,java.lang包下的所有类无需导入。 +格式: + +```java +import 包名.类名; +``` + +举例: + +```java +java.util.Scanner; +``` + +#### 创建对象 + +使用该类的构造方法,创建一个该类的对象。 +格式: + +```java +数据类型 变量名 = new 数据类型(参数列表); +``` + +举例: + +```java +Scanner sc = new Scanner(System.in); +``` + +#### 调用方法 + +调用该类的成员方法,完成指定功能。 +格式: + +```java +变量名.方法名(); +``` + +举例: + +```java +int i = sc.nextInt(); // 接收一个键盘录入的整数 +``` + +### 2.3 Scanner使用步骤 + +**查看类** + +* `java.util.Scanner` :该类需要import导入后使用。 + +**查看构造方法** + +* `public Scanner(InputStream source)` : 构造一个新的 `Scanner`,它生成的值是从指定的输入流扫描的。 + +**查看成员方法** + +* ` public int nextInt() `:将输入信息的下一个标记扫描为一个 `int` 值。 + +使用Scanner类,完成接收键盘录入数据的操作,代码如下: + +```java +//1. 导包 +import java.util.Scanner; +public class Demo01_Scanner { + public static void main(String[] args) { + //2. 创建键盘录入数据的对象 + Scanner sc = new Scanner(System.in); + + //3. 接收数据 + System.out.println("请录入一个整数:"); + int i = sc.nextInt(); + + //4. 输出数据 + System.out.println("i:"+i); + } +} +``` + +### 2.4 练习 + +#### 求和 + +键盘录入两个数据并求和,代码如下: + +```java +import java.util.Scanner; + +public class Test01Scanner { + public static void main(String[] args) { + // 创建对象 + Scanner sc = new Scanner(System.in); + // 接收数据 + System.out.println("请输入第一个数据:"); + int a = sc.nextInt(); + System.out.println("请输入第二个数据:"); + int b = sc.nextInt(); + // 对数据进行求和 + int sum = a + b; + System.out.println("sum:" + sum); + } +} +``` + +#### 取最值 + +键盘录入三个数据并获取最大值,代码如下: + +```java +import java.util.Scanner; + +public class Test02Scanner { + public static void main(String[] args) { + // 创建对象 + Scanner sc = new Scanner(System.in); + // 接收数据 + System.out.println("请输入第一个数据:"); + int a = sc.nextInt(); + System.out.println("请输入第二个数据:"); + int b = sc.nextInt(); + System.out.println("请输入第三个数据:"); + int c = sc.nextInt(); + + // 如何获取三个数据的最大值 + int temp = (a > b ? a : b); + int max = (temp > c ? temp : c); + + System.out.println("max:" + max); + } +} +``` + +### 2.5 匿名对象【了解】 + +#### 概念 + +创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。虽然是创建对象的简化写法,但是应用场景非常有限。 + +* **匿名对象** :没有变量名的对象。 + +格式: + +```java +new 类名(参数列表); +``` + +举例: + +```java +new Scanner(System.in); +``` + +#### 应用场景 + +1. 创建匿名对象直接调用方法,没有变量名。 + +```java +new Scanner(System.in).nextInt(); +``` + +2. 一旦调用两次方法,就是创建了两个对象,造成浪费,请看如下代码。 + +```java +new Scanner(System.in).nextInt(); +new Scanner(System.in).nextInt(); +``` + +> 小贴士:一个匿名对象,只能使用一次。 + +3. 匿名对象可以作为方法的参数和返回值 + +* 作为参数: + +```java +class Test { + public static void main(String[] args) { + // 普通方式 + Scanner sc = new Scanner(System.in); + input(sc); + + //匿名对象作为方法接收的参数 + input(new Scanner(System.in)); + } + + public static void input(Scanner sc){ + System.out.println(sc); + } +} +``` + +* 作为返回值 + +```java +class Test2 { + public static void main(String[] args) { + // 普通方式 + Scanner sc = getScanner(); + } + + public static Scanner getScanner(){ + //普通方式 + //Scanner sc = new Scanner(System.in); + //return sc; + + //匿名对象作为方法返回值 + return new Scanner(System.in); + } +} +``` + +## 第3章 Random类 + +### 3.1 什么是Random类 + +此类的实例用于生成伪随机数。 + +例如,以下代码使用户能够得到一个随机数: + +```java +Random r = new Random(); +int i = r.nextInt(); +``` + +### 3.2 Random使用步骤 + +**查看类** + +- `java.util.Random` :该类需要 import导入使后使用。 + +**查看构造方法** + +- `public Random()`:创建一个新的随机数生成器。 + +**查看成员方法** + +- ` public int nextInt(int n) `:返回一个伪随机数,范围在 `0` (包括)和`指定值 n` (不包括)之间的 `int` 值。 + +使用Random类,完成生成3个10以内的随机整数的操作,代码如下: + +```java +//1. 导包 +import java.util.Random; + +public class Demo01_Random { + public static void main(String[] args) { + //2. 创建键盘录入数据的对象 + Random r = new Random(); + + for(int i = 0; i < 3; i++){ + //3. 随机生成一个数据 + int number = r.nextInt(10); + //4. 输出数据 + System.out.println("number:"+ number); + } + } +} +``` + +> 备注:创建一个`Random`对象,每次调用`nextInt()`方法,都会生成一个随机数。 + +### 3.3 练习 + +#### 获取随机数 + +获取1-n之间的随机数,包含n,代码如下: + +```java +// 导包 +import java.util.Random; + +public class Test01Random { + public static void main(String[] args) { + int n = 50; + // 创建对象 + Random r = new Random(); + // 获取随机数 + int number = r.nextInt(n) + 1; + // 输出随机数 + System.out.println("number:" + number); + } +} +``` + +#### 猜数字小游戏 + +游戏开始时,会随机生成一个1-100之间的整数`number` 。玩家猜测一个数字`guessNumber` ,会与`number` 作比较,系统提示大了或者小了,直到玩家猜中,游戏结束。 + +> 小贴士:先运行程序代码,理解此题需求,经过分析后,再编写代码 + +```java +// 导包 +import java.util.Random; + +public class Test02Random { + public static void main(String[] args) { + // 系统产生一个随机数1-100之间的。 + Random r = new Random(); + int number = r.nextInt(100) + 1; + while(true){ + // 键盘录入我们要猜的数据 + Scanner sc = new Scanner(System.in); + System.out.println("请输入你要猜的数字(1-100):"); + int guessNumber = sc.nextInt(); + + // 比较这两个数据(用if语句) + if (guessNumber > number) { + System.out.println("你猜的数据" + guessNumber + "大了"); + } else if (guessNumber < number) { + System.out.println("你猜的数据" + guessNumber + "小了"); + } else { + System.out.println("恭喜你,猜中了"); + break; + } + } + } +} +``` + + +## 第4章 ArrayList类 + +### 4.1 引入——对象数组 + +使用学生数组,存储三个学生对象,代码如下: + +```java +public class Student { + private String name; + private int age; + public Student() { + } + public Student(String name, int age) { + this.name = name; + this.age = age; + } + public String getName() { + return name; + } + publicvoid setName(String name) { + this.name = name; + } + publicint getAge() { + return age; + } + publicvoid setAge(int age) { + this.age = age; + } +} +public class Test01StudentArray { + public static void main(String[] args) { + //创建学生数组 + Student[] students = new Student[3]; + + //创建学生对象 + Student s1 = new Student("曹操",40); + Student s2 = new Student("刘备",35); + Student s3 = new Student("孙权",30); + + //把学生对象作为元素赋值给学生数组 + students[0] = s1; + students[1] = s2; + students[2] = s3; + + //遍历学生数组 + for(int x=0; x` :该类需要 import导入使后使用。 + +`` ,表示一种指定的数据类型,叫做泛型。`E` ,取自Element(元素)的首字母。在出现`E` 的地方,我们使用一种引用数据类型将其替换即可,表示我们将存储哪种引用类型的元素。代码如下: + +```java +ArrayList,ArrayList +``` + +**查看构造方法** + +- `public ArrayList() `:构造一个内容为空的集合。 + +基本格式: + +```java +ArrayList list = new ArrayList(); +``` + +在JDK 7后,右侧泛型的尖括号之内可以留空,但是<>仍然要写。简化格式: + +```java +ArrayList list = new ArrayList<>(); +``` + +**查看成员方法** + +- ` public boolean add(E e) `: 将指定的元素添加到此集合的尾部。 + + 参数 `E e `,在构造ArrayList对象时,``指定了什么数据类型,那么`add(E e)`方法中,只能添加什么数据类型的对象。 + +使用ArrayList类,存储三个字符串元素,代码如下: + +```java +public class Test02StudentArrayList { + public static void main(String[] args) { + //创建学生数组 + ArrayList list = new ArrayList<>(); + + //创建学生对象 + String s1 = "曹操"; + String s2 = "刘备"; + String s3 = "孙权"; + + //打印学生ArrayList集合 + System.out.println(list); + + //把学生对象作为元素添加到集合 + list.add(s1); + list.add(s2); + list.add(s3); + + //打印学生ArrayList集合 + System.out.println(list); + } +} +``` + +### 4.4 常用方法和遍历 + +对于元素的操作,基本体现在——增、删、查。常用的方法有: + +* `public boolean add(E e)`:将指定的元素添加到此集合的尾部。 + + +* `public E remove(int index)` :移除此集合中指定位置上的元素。返回被删除的元素。 + + +* ` public E get(int index)` :返回此集合中指定位置上的元素。返回获取的元素。 + + +* `public int size()` :返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界。 + +这些都是最基本的方法,操作非常简单,代码如下: + +```java +public class Demo01ArrayListMethod { + public static void main(String[] args) { + //创建集合对象 + ArrayList list = new ArrayList(); + + //添加元素 + list.add("hello"); + list.add("world"); + list.add("java"); + + //public E get(int index):返回指定索引处的元素 + System.out.println("get:"+list.get(0)); + System.out.println("get:"+list.get(1)); + System.out.println("get:"+list.get(2)); + + //public int size():返回集合中的元素的个数 + System.out.println("size:"+list.size()); + + //public E remove(int index):删除指定索引处的元素,返回被删除的元素 + System.out.println("remove:"+list.remove(0)); + + //遍历输出 + for(int i = 0; i < list.size(); i++){ + System.out.println(list.get(i)); + } + } +} +``` + +### 4.5 如何存储基本数据类型 + +ArrayList对象不能存储基本类型,只能存储引用类型的数据。类似**``不能写**,但是存储基本数据类型对应的包装类型是可以的。所以,想要存储基本类型数据,`<>`中的数据类型,必须转换后才能编写,转换写法如下: + +| 基本类型 | 基本类型包装类 | +| ------- | --------- | +| byte | Byte | +| short | Short | +| int | Integer | +| long | Long | +| float | Float | +| double | Double | +| char | Character | +| boolean | Boolean | + +我们发现,只有`Integer`和`Character`需要特殊记忆,其他基本类型只是首字母大写即可。那么存储基本类型数据,代码如下: + +```java +public class Demo02ArrayListMethod { + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + + System.out.println(list); + } +} +``` + +### 4.6 ArrayList练习 + +#### 数值添加到集合 + +生成6个1~33之间的随机整数,添加到集合,并遍历 + +```java +public class Test01ArrayList { + public static void main(String[] args) { + // 创建Random 对象 + Random random = new Random(); + + // 创建ArrayList 对象 + ArrayList list = new ArrayList<>(); + + // 添加随机数到集合 + for (int i = 0; i < 6; i++) { + int r = random.nextInt(33) + 1; + list.add(r); + } + + // 遍历集合输出 + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } +} +``` + +#### 对象添加到集合 + +自定义4个学生对象,添加到集合,并遍历 + +```java +public class Test02ArrayList { + public static void main(String[] args) { + //创建集合对象 + ArrayList list = new ArrayList(); + + //创建学生对象 + Student s1 = new Student("赵丽颖",18); + Student s2 = new Student("唐嫣",20); + Student s3 = new Student("景甜",25); + Student s4 = new Student("柳岩",19); + + //把学生对象作为元素添加到集合中 + list.add(s1); + list.add(s2); + list.add(s3); + list.add(s4); + + //遍历集合 + for(int x = 0; x < list.size(); x++) { + Student s = list.get(x); + System.out.println(s.getName()+"---"+s.getAge()); + } + } +} +``` + +#### 打印集合方法 + +定义以指定格式打印集合的方法(ArrayList类型作为参数),使用{}扩起集合,使用@分隔每个元素。格式参照 {元素@元素@元素}。 + +```java +public class Test03ArrayList { + public static void main(String[] args) { + // 创建集合对象 + ArrayList list = new ArrayList(); + + // 添加字符串到集合中 + list.add("张三丰"); + list.add("宋远桥"); + list.add("张无忌"); + list.add("殷梨亭"); + + // 调用方法 + printArrayList(list); + } + + public static void printArrayList(ArrayList list) { + // 拼接左括号 + System.out.print("{"); + // 遍历集合 + for (int i = 0; i < list.size(); i++) { + // 获取元素 + String s = list.get(i); + // 拼接@符号 + if (i != list.size() - 1) { + System.out.print(s + "@"); + } else { + // 拼接右括号 + System.out.print(s + "}"); + } + } + } +} +``` + +#### 获取集合方法 + +定义获取所有偶数元素集合的方法(ArrayList类型作为返回值) + +```java +public class Test04ArrayList { + public static void main(String[] args) { + // 创建Random 对象 + Random random = new Random(); + // 创建ArrayList 对象 + ArrayList list = new ArrayList<>(); + + // 添加随机数到集合 + for (int i = 0; i < 20; i++) { + int r = random.nextInt(1000) + 1; + list.add(r); + } + // 调用偶数集合的方法 + ArrayList arrayList = getArrayList(list); + System.out.println(arrayList); + } + + public static ArrayList getArrayList(ArrayList list) { + // 创建小集合,来保存偶数 + ArrayList smallList = new ArrayList<>(); + + // 遍历list + for (int i = 0; i < list.size(); i++) { + // 获取元素 + Integer num = list.get(i); + // 判断为偶数,添加到小集合中 + if (num % 2 == 0){ + smallList.add(num); + } + } + // 返回小集合 + return smallList; + } +} +``` + diff --git a/javaSE1/day08/day08【String类、static、Arrays类、Math类】.md b/javaSE1/day08/day08【String类、static、Arrays类、Math类】.md new file mode 100644 index 0000000..93331cc --- /dev/null +++ b/javaSE1/day08/day08【String类、static、Arrays类、Math类】.md @@ -0,0 +1,622 @@ +# day08【String类、static关键字、Arrays类、Math类】 + +### 今日内容 + +* String类 +* static关键字 + + +* Arrays类 + + +* Math类 + + +### 教学目标 + +- [ ] 能够使用String类的构造方法创建字符串对象 +- [ ] 能够明确String类的构造方法创建对象,和直接赋值创建字符串对象的区别 + +- [ ] 能够使用文档查询String类的判断方法 + +- [ ] 能够使用文档查询String类的获取方法 + +- [ ] 能够使用文档查询String类的转换方法 + +- [ ] 能够理解static关键字 + +- [ ] 能够写出静态代码块的格式 + +- [ ] 能够使用Arrays类操作数组 + +- [ ] 能够使用Math类进行数学运算 + +## 第一章 String类 + +### 1.1 String类概述 + +#### 概述 + +`java.lang.String` 类代表字符串。Java程序中所有的字符串文字(例如`"abc"` )都可以被看作是实现此类的实例。 + +类 `String` 中包括用于检查各个字符串的方法,比如用于**比较**字符串,**搜索**字符串,**提取**子字符串以及创建具有翻译为**大写**或**小写**的所有字符的字符串的副本。 + +#### 特点 + +1. 字符串不变:字符串的值在创建后不能被更改。 + +```java +String s1 = "abc"; +s1 += "d"; +System.out.println(s1); // "abcd" +// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。 +``` + +2. 因为String对象是不可变的,所以它们可以被共享。 + +```java +String s1 = "abc"; +String s2 = "abc"; +// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。 +``` + +3. `"abc"` 等效于 `char[] data={ 'a' , 'b' , 'c' }`。 + +```java +例如: +String str = "abc"; + +相当于: +char data[] = {'a', 'b', 'c'}; +String str = new String(data); +// String底层是靠字符数组实现的。 +``` +### 1.2 使用步骤 + +* 查看类 + + * `java.lang.String` :此类不需要导入。 + +* 查看构造方法 + + * `public String() ` :初始化新创建的 String对象,以使其表示空字符序列。 + * `public String(char[] value) ` :通过当前参数中的字符数组来构造新的String。 + * `public String(byte[] bytes) ` :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。 + * 构造举例,代码如下: + + +```java +// 无参构造 +String str = new String(); + +// 通过字符数组构造 +char chars[] = {'a', 'b', 'c'}; +String str2 = new String(chars); + +// 通过字节数组构造 +byte bytes[] = { 97, 98, 99 }; +String str3 = new String(bytes); +``` + +### 1.3 常用方法 + +#### 判断功能的方法 + +* `public boolean equals (Object anObject) ` :将此字符串与指定对象进行比较。 + +* ` public boolean equalsIgnoreCase (String anotherString) ` :将此字符串与指定对象进行比较,忽略大小写。 + + 方法演示,代码如下: + + ```java + public class String_Demo01 { + public static void main(String[] args) { + // 创建字符串对象 + String s1 = "hello"; + String s2 = "hello"; + String s3 = "HELLO"; + + // boolean equals(Object obj):比较字符串的内容是否相同 + System.out.println(s1.equals(s2)); // true + System.out.println(s1.equals(s3)); // false + System.out.println("-----------"); + + //boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写 + System.out.println(s1.equalsIgnoreCase(s2)); // true + System.out.println(s1.equalsIgnoreCase(s3)); // true + System.out.println("-----------"); + } + } + ``` + +> Object 是” 对象”的意思,也是一种引用类型。作为参数类型,表示任意对象都可以传递到方法中。 + +#### 获取功能的方法 + +- `public int length () ` :返回此字符串的长度。 + +- `public String concat (String str)` :将指定的字符串连接到该字符串的末尾。 + +- ` public char charAt (int index) ` :返回指定索引处的 char值。 + +- `public int indexOf (String str) ` :返回指定子字符串第一次出现在该字符串内的索引。 + +- ` public String substring (int beginIndex) ` :返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。 + +- ` public String substring (int beginIndex, int endIndex) ` :返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。 + + +方法演示,代码如下: + +```java +public class String_Demo02 { + public static void main(String[] args) { + //创建字符串对象 + String s = "helloworld"; + + // int length():获取字符串的长度,其实也就是字符个数 + System.out.println(s.length()); + System.out.println("--------"); + + // String concat (String str):将将指定的字符串连接到该字符串的末尾. + String s = "helloworld"; + String s2 = s.concat("**hello itheima"); + System.out.println(s2);// helloworld**hello itheima + + // char charAt(int index):获取指定索引处的字符 + System.out.println(s.charAt(0)); + System.out.println(s.charAt(1)); + System.out.println("--------"); + + // int indexOf(String str):获取str在字符串对象中第一次出现的索引,没有返回-1 + System.out.println(s.indexOf("l")); + System.out.println(s.indexOf("owo")); + System.out.println(s.indexOf("ak")); + System.out.println("--------"); + + // String substring(int start):从start开始截取字符串到字符串结尾 + System.out.println(s.substring(0)); + System.out.println(s.substring(5)); + System.out.println("--------"); + + // String substring(int start,int end):从start到end截取字符串。含start,不含end。 + System.out.println(s.substring(0, s.length())); + System.out.println(s.substring(3,8)); + } +} +``` + +#### 转换功能的方法 + +- `public char[] toCharArray () ` :将此字符串转换为新的字符数组。 +- ` public byte[] getBytes () ` :使用平台的默认字符集将该 String编码转换为新的字节数组。 +- `public String replace (CharSequence target, CharSequence replacement) ` :将与target匹配的字符串使用replacement字符串替换。 + +方法演示,代码如下: + +```java +public class String_Demo03 { + public static void main(String[] args) { + //创建字符串对象 + String s = "abcde"; + + // char[] toCharArray():把字符串转换为字符数组 + char[] chs = s.toCharArray(); + for(int x = 0; x < chs.length; x++) { + System.out.println(chs[x]); + } + System.out.println("-----------"); + + // byte[] getBytes ():把字符串转换为字节数组 + byte[] bytes = s.getBytes(); + for(int x = 0; x < bytes.length; x++) { + System.out.println(bytes[x]); + } + System.out.println("-----------"); + + // 替换字母it为大写IT + String str = "itcast itheima"; + String replace = str.replace("it", "IT"); + System.out.println(replace); // ITcast ITheima + System.out.println("-----------"); + } +} +``` + +> CharSequence 是一个接口,也是一种引用类型。作为参数类型,可以把String对象传递到方法中。 + +#### 分割功能的方法 + +* `public String[] split(String regex)` :将此字符串按照给定的regex(规则)拆分为字符串数组。 + +方法演示,代码如下: + + ```java +public class String_Demo03 { + public static void main(String[] args) { + //创建字符串对象 + String s = "aa|bb|cc"; + String[] strArray = s.split("|"); // ["aa","bb","cc"] + for(int x = 0; x < strArray.length; x++) { + System.out.println(strArray[x]); // aa bb cc + } + } +} + ``` + +### 1.4 String类的练习 + +#### 拼接字符串 + +定义一个方法,把数组{1,2,3}按照指定个格式拼接成一个字符串。格式参照如下:[word1#word2#word3]。 + +```java +public class StringTest1 { + public static void main(String[] args) { + //定义一个int类型的数组 + int[] arr = {1, 2, 3}; + + //调用方法 + String s = arrayToString(arr); + + //输出结果 + System.out.println("s:" + s); + } + + /* + * 写方法实现把数组中的元素按照指定的格式拼接成一个字符串 + * 两个明确: + * 返回值类型:String + * 参数列表:int[] arr + */ + public static String arrayToString(int[] arr) { + // 创建字符串s + String s = new String("["); + // 遍历数组,并拼接字符串 + for (int x = 0; x < arr.length; x++) { + if (x == arr.length - 1) { + s = s.concat(arr[x] + "]"); + } else { + s = s.concat(arr[x] + "#"); + } + } + return s; + } +} +``` + +#### 统计字符个数 + +键盘录入一个字符,统计字符串中大小写字母及数字字符个数 + +```java +public class StringTest2 { + public static void main(String[] args) { + //键盘录入一个字符串数据 + Scanner sc = new Scanner(System.in); + System.out.println("请输入一个字符串数据:"); + String s = sc.nextLine(); + + //定义三个统计变量,初始化值都是0 + int bigCount = 0; + int smallCount = 0; + int numberCount = 0; + + //遍历字符串,得到每一个字符 + for(int x=0; x='A'&&ch<='Z') { + bigCount++; + }else if(ch>='a'&&ch<='z') { + smallCount++; + }else if(ch>='0'&&ch<='9') { + numberCount++; + }else { + System.out.println("该字符"+ch+"非法"); + } + } + + //输出结果 + System.out.println("大写字符:"+bigCount+"个"); + System.out.println("小写字符:"+smallCount+"个"); + System.out.println("数字字符:"+numberCount+"个"); + } +} +``` + +## 第二章 static关键字 + +### 2.1 概述 + +关于 `static` 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是**属于类**的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。 + +### 2.2 定义和使用格式 + +#### 类变量 + +当 `static` 修饰成员变量时,该变量称为**类变量**。该类的每个对象都**共享**同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。 + +* **类变量**:使用 static关键字修饰的成员变量。 + +定义格式: + +```java +static 数据类型 变量名; +``` + +举例: + +```java +static int numberID; +``` + +比如说,基础班新班开班,学员报到。现在想为每一位新来报到的同学编学号(sid),从第一名同学开始,sid为1,以此类推。学号必须是唯一的,连续的,并且与班级的人数相符,这样以便知道,要分配给下一名新同学的学号是多少。这样我们就需要一个变量,与单独的每一个学生对象无关,而是与整个班级同学数量有关。 + +所以,我们可以这样定义一个静态变量numberOfStudent,代码如下: + +```java +public class Student { + private String name; + private int age; + // 学生的id + private int sid; + // 类变量,记录学生数量,分配学号 + public static int numberOfStudent = 0; + + public Student(String name, int age){ + this.name = name; + this.age = age; + // 通过 numberOfStudent 给学生分配学号 + this.sid = ++numberOfStudent; + } + + // 打印属性值 + public void show() { + System.out.println("Student : name=" + name + ", age=" + age + ", sid=" + sid ); + } +} + +public class StuDemo { + public static void main(String[] args) { + Student s1 = new Student("张三", 23); + Student s2 = new Student("李四", 24); + Student s3 = new Student("王五", 25); + Student s4 = new Student("赵六", 26); + + s1.show(); // Student : name=张三, age=23, sid=1 + s2.show(); // Student : name=李四, age=24, sid=2 + s3.show(); // Student : name=王五, age=25, sid=3 + s4.show(); // Student : name=赵六, age=26, sid=4 + } +} +``` + +#### 静态方法 + +当`static` 修饰成员方法时,该方法称为**类方法** 。静态方法在声明中有`static` ,建议使用类名来调用,而不需要创建类的对象。调用方式非常简单。 + +* **类方法**:使用 static关键字修饰的成员方法,习惯称为**静态方法**。 + +定义格式: + +```java +修饰符 static 返回值类型 方法名 (参数列表){ + // 执行语句 +} +``` + +举例:在Student类中定义静态方法 + +```java +public static void showNum() { + System.out.println("num:" + numberOfStudent); +} +``` + +* **静态方法调用的注意事项:** + * 静态方法可以直接访问类变量和静态方法。 + * 静态方法**不能直接访问**普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法。 + * 静态方法中,不能使用**this**关键字。 + +> 小贴士:静态方法只能访问静态成员。 + +#### 调用格式 + +被static修饰的成员可以并且建议通过**类名直接访问**。虽然也可以通过对象名访问静态成员,原因即多个对象均属于一个类,共享使用同一个静态成员,但是不建议,会出现警告信息。 + +格式: + +```java +// 访问类变量 +类名.类变量名; + +// 调用静态方法 +类名.静态方法名(参数); +``` + +调用演示,代码如下: + +```java +public class StuDemo2 { + public static void main(String[] args) { + // 访问类变量 + System.out.println(Student.numberOfStudent); + // 调用静态方法 + Student.showNum(); + } +} +``` + +### 2.3 静态原理图解 + +`static` 修饰的内容: + +* 是随着类的加载而加载的,且只加载一次。 +* 存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。 +* 它优先于对象存在,所以,可以被所有对象共享。 + +![](img/1.jpg) + +### 2.4 静态代码块 + +* **静态代码块**:定义在成员位置,使用static修饰的代码块{ }。 + * 位置:类中方法外。 + * 执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行。 + +格式: + +```java +public class ClassName{ + static { + // 执行语句 + } +} +``` + +作用:给类变量进行初始化赋值。用法演示,代码如下: + +```java +public class Game { + public static int number; + public static ArrayList list; + + static { + // 给类变量赋值 + number = 2; + list = new ArrayList(); + // 添加元素到集合中 + list.add("张三"); + list.add("李四"); + } +} +``` + +> 小贴士: +> +> static 关键字,可以修饰变量、方法和代码块。在使用的过程中,其主要目的还是想在不创建对象的情况下,去调用方法。下面将介绍两个工具类,来体现static 方法的便利。 + +## 第三章 Arrays类 + +### 3.1 概述 + +`java.util.Arrays` 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单。 + +### 3.2 操作数组的方法 + +* `public static String toString(int[] a) ` :返回指定数组内容的字符串表示形式。 + +```java +public static void main(String[] args) { + // 定义int 数组 + int[] arr = {2,34,35,4,657,8,69,9}; + // 打印数组,输出地址值 + System.out.println(arr); // [I@2ac1fdc4 + + // 数组内容转为字符串 + String s = Arrays.toString(arr); + // 打印字符串,输出内容 + System.out.println(s); // [2, 34, 35, 4, 657, 8, 69, 9] +} +``` + +* `public static void sort(int[] a)` :对指定的 int 型数组按数字升序进行排序。 + +```java +public static void main(String[] args) { + // 定义int 数组 + int[] arr = {24, 7, 5, 48, 4, 46, 35, 11, 6, 2}; + System.out.println("排序前:"+ Arrays.toString(arr)); // 排序前:[24, 7, 5, 48, 4, 46, 35, 11, 6, 2] + // 升序排序 + Arrays.sort(arr); + System.out.println("排序后:"+ Arrays.toString(arr));// 排序后:[2, 4, 5, 6, 7, 11, 24, 35, 46, 48] +} +``` + +### 3.3 练习 + +请使用`Arrays` 相关的API,将一个随机字符串中的所有字符升序排列,并倒序打印。 + +```java +public class ArraysTest { + public static void main(String[] args) { + // 定义随机的字符串 + String line = "ysKUreaytWTRHsgFdSAoidq"; + // 转换为字符数组 + char[] chars = line.toCharArray(); + + // 升序排序 + Arrays.sort(chars); + // 反向遍历打印 + for (int i = chars.length-1; i >= 0 ; i--) { + System.out.print(chars[i]+" "); // y y t s s r q o i g e d d a W U T S R K H F A + } + } +} +``` + + +## 第四章 Math类 + +### 4.1 概述 + +`java.lang.Math` 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。 + +### 4.2 基本运算的方法 + +* `public static double abs(double a) ` :返回 double 值的绝对值。 + +```java +double d1 = Math.abs(-5); //d1的值为5 +double d2 = Math.abs(5); //d2的值为5 +``` + +* `public static double ceil(double a)` :返回大于等于参数的最小的整数。 + +```java +double d1 = Math.ceil(3.3); //d1的值为 4.0 +double d2 = Math.ceil(-3.3); //d2的值为 -3.0 +double d3 = Math.ceil(5.1); //d3的值为 6.0 +``` + +* `public static double floor(double a) ` :返回小于等于参数最大的整数。 + +```java +double d1 = Math.floor(3.3); //d1的值为3.0 +double d2 = Math.floor(-3.3); //d2的值为-4.0 +double d3 = Math.floor(5.1); //d3的值为 5.0 +``` + +* `public static long round(double a)` :返回最接近参数的 long。(相当于四舍五入方法) + +```java +long d1 = Math.round(5.5); //d1的值为6.0 +long d2 = Math.round(5.4); //d2的值为5.0 +``` + +### 4.3 练习 + +请使用`Math` 相关的API,计算在 `-10.8` 到`5.9` 之间,绝对值大于`6` 或者小于`2.1` 的整数有多少个? + +```java +public class MathTest { + public static void main(String[] args) { + // 定义最小值 + double min = -10.8; + // 定义最大值 + double max = 5.9; + // 定义变量计数 + int count = 0; + // 范围内循环 + for (double i = Math.ceil(min); i <= max; i++) { + // 获取绝对值并判断 + if (Math.abs(i) > 6 || Math.abs(i) < 2.1) { + // 计数 + count++; + } + } + System.out.println("个数为: " + count + " 个"); + } +} +``` + diff --git a/javaSE1/day08/img/1.jpg b/javaSE1/day08/img/1.jpg new file mode 100644 index 0000000..2346399 Binary files /dev/null and b/javaSE1/day08/img/1.jpg differ diff --git a/javaSE1/day09/day09【继承、super、this、抽象类】.md b/javaSE1/day09/day09【继承、super、this、抽象类】.md new file mode 100644 index 0000000..f33864c --- /dev/null +++ b/javaSE1/day09/day09【继承、super、this、抽象类】.md @@ -0,0 +1,724 @@ +# day09【继承、super、this、抽象类】 + +### 今日内容 + +- 三大特性——继承 +- 方法重写 +- super关键字 +- this关键字 +- 抽象类 + +### 教学目标 + +- [ ] 能够解释类名作为参数和返回值类型 +- [ ] 能够写出类的继承格式 +- [ ] 能够说出继承的特点 +- [ ] 能够说出子类调用父类的成员特点能 +- [ ] 够说出方法重写的概念 +- [ ] 能够说出this可以解决的问题 +- [ ] 能够说出super可以解决的问题 +- [ ] 描述抽象方法的概念 +- [ ] 写出抽象类的格式 +- [ ] 写出抽象方法的格式 +- [ ] 能够说出父类抽象方法的存在意义 +- [ ] 能够完成发红包案例的代码逻辑 + +## 第一章 继承 + +### 1.1 概述 + +#### 由来 + +多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。如图所示: + +![](img/1.jpg) + +其中,多个类可以称为**子类**,单独那一个类称为**父类**、**超类(superclass)**或者**基类**。 + +继承描述的是事物之间的所属关系,这种关系是:`is-a` 的关系。例如,图中兔子属于食草动物,食草动物属于动物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。 + +#### 定义 + +* **继承**:就是子类继承父类的**属性**和**行为**,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的**非私有**的属性和行为。 + +#### 好处 + +1. 提高**代码的复用性**。 +2. 类与类之间产生了关系,是**多态的前提**。 + +### 1.2 继承的格式 + +通过 `extends` 关键字,可以声明一个子类继承另外一个父类,定义格式如下: + +```java +class 父类 { + ... +} + +class 子类 extends 父类 { + ... +} +``` + +继承演示,代码如下: + +```java +/* + * 定义员工类Employee,做为父类 + */ +class Employee { + String name; // 定义name属性 + // 定义员工的工作方法 + public void work() { + System.out.println("尽心尽力地工作"); + } +} + +/* + * 定义讲师类Teacher 继承 员工类Employee + */ +class Teacher extends Employee { + // 定义一个打印name的方法 + public void printName() { + System.out.println("name=" + name); + } +} + +/* + * 定义测试类 + */ +public class ExtendDemo01 { + public static void main(String[] args) { + // 创建一个讲师类对象 + Teacher t = new Teacher(); + + // 为该员工类的name属性进行赋值 + t.name = "小明"; + + // 调用该员工的printName()方法 + t.printName(); // name = 小明 + + // 调用Teacher类继承来的work()方法 + t.work(); // 尽心尽力地工作 + } +} +``` + +### 1.3 继承后的特点——成员变量 + +当类之间产生了关系后,其中各类中的成员变量,又产生了哪些影响呢? + +#### 成员变量不重名 + +如果子类父类中出现**不重名**的成员变量,这时的访问是**没有影响的**。代码如下: + +```java +class Fu { + // Fu中的成员变量。 + int num = 5; +} +class Zi extends Fu { + // Zi中的成员变量 + int num2 = 6; + + // Zi中的成员方法 + public void show() { + // 访问父类中的num, + System.out.println("Fu num="+num); // 继承而来,所以直接访问。 + // 访问子类中的num2 + System.out.println("Zi num2="+num2); + } +} +class ExtendDemo02 { + public static void main(String[] args) { + // 创建子类对象 + Zi z = new Zi(); + // 调用子类中的show方法 + z.show(); + } +} + +演示结果: +Fu num = 5 +Zi num2 = 6 +``` + +#### 成员变量重名 + +如果子类父类中出现**重名**的成员变量,这时的访问是**有影响的**。代码如下: + +```java +class Fu { + // Fu中的成员变量。 + int num = 5; +} +class Zi extends Fu { + // Zi中的成员变量 + int num = 6; + + public void show() { + // 访问父类中的num + System.out.println("Fu num=" + num); + // 访问子类中的num + System.out.println("Zi num=" + num); + } +} +class ExtendsDemo03 { + public static void main(String[] args) { + // 创建子类对象 + Zi z = new Zi(); + // 调用子类中的show方法 + z.show(); + } +} +演示结果: +Fu num = 6 +Zi num = 6 +``` + +子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用`super` 关键字,修饰父类成员变量,类似于之前学过的 `this` 。 + +使用格式: + +```java +super.父类成员变量名 +``` + +子类方法需要修改,代码如下: + +```java +class Zi extends Fu { + // Zi中的成员变量 + int num = 6; + + public void show() { + //访问父类中的num + System.out.println("Fu num=" + super.num); + //访问子类中的num + System.out.println("Zi num=" + this.num); + } +} +演示结果: +Fu num = 5 +Zi num = 6 +``` + +> 小贴士:Fu 类中的成员变量是非私有的,子类中可以直接访问。若Fu 类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用private修饰成员变量,那么如何访问父类的私有成员变量呢?对!可以在父类中提供公共的getXxx方法和setXxx方法。 + +### 1.4 继承后的特点——成员方法 + +当类之间产生了关系,其中各类中的成员方法,又产生了哪些影响呢? + +#### 成员方法不重名 + +如果子类父类中出现**不重名**的成员方法,这时的调用是**没有影响的**。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。代码如下: + +```java +class Fu{ + public void show(){ + System.out.println("Fu类中的show方法执行"); + } +} +class Zi extends Fu{ + public void show2(){ + System.out.println("Zi类中的show2方法执行"); + } +} +public class ExtendsDemo04{ + public static void main(String[] args) { + Zi z = new Zi(); + //子类中没有show方法,但是可以找到父类方法去执行 + z.show(); + z.show2(); + } +} +``` + +#### 成员方法重名——重写(Override) + +如果子类父类中出现**重名**的成员方法,这时的访问是一种特殊情况,叫做**方法重写** (Override)。 + +* **方法重写** :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。**声明不变,重新实现**。 + +代码如下: + +```java +class Fu { + public void show() { + System.out.println("Fu show"); + } +} +class Zi extends Fu { + //子类重写了父类的show方法 + public void show() { + System.out.println("Zi show"); + } +} +public class ExtendsDemo05{ + public static void main(String[] args) { + Zi z = new Zi(); + // 子类中有show方法,只执行重写后的show方法 + z.show(); // Zi show + } +} +``` + +#### 重写的应用 + +子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。比如新的手机增加来电显示头像的功能,代码如下: + +```java +class Phone { + public void sendMessage(){ + System.out.println("发短信"); + } + public void call(){ + System.out.println("打电话"); + } + public void showNum(){ + System.out.println("来电显示号码"); + } +} + +//智能手机类 +class NewPhone extends Phone { + //重写父类的来电显示号码功能,并增加自己的显示姓名和图片功能 + public void showNum(){ + //调用父类已经存在的功能使用super + super.showNum(); + //增加自己特有显示姓名和图片功能 + System.out.println("显示来电姓名"); + System.out.println("显示头像"); + } +} + +public class ExtendsDemo06 { + public static void main(String[] args) { + // 创建子类对象 + NewPhone np = new NewPhone(); + // 调用父类继承而来的方法 + np.call(); + // 调用子类重写的方法 + np.showNum(); + } +} +``` + +> 小贴士:这里重写时,用到super.父类成员方法,表示调用父类的成员方法。 + +#### 注意事项 + +1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。 +2. 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。 + +### 1.5 继承后的特点——构造方法 + +当类之间产生了关系,其中各类中的构造方法,又产生了哪些影响呢? + +首先我们要回忆两个事情,构造方法的定义格式和作用。 + +1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。 +2. 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个`super()` ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。代码如下: + +```java +class Fu { + private int n; + + Fu(){ + System.out.println("Fu()"); + } +} +class Zi extends Fu { + Zi(){ + // super(),调用父类构造方法 + super(); + System.out.println("Zi()"); + } +} +public class ExtendsDemo07{ + public static void main (String args[]){ + Zi zi = new Zi(); + } +} +输出结果: +Fu() +Zi() +``` + +### 1.6 super和this + +#### 父类空间优先于子类对象产生 + +在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对应的父类空间,便可以包含其父类的成员,如果父类成员非private修饰,则子类可以随意使用父类成员。代码体现在子类的构造方法调用时,一定先调用父类的构造方法。理解图解如下: + +![](img/2.jpg) + +#### super和this的含义 + +* **super** :代表父类的**存储空间标识**(可以理解为父亲的引用)。 + + +* **this** :代表**当前对象的引用**(谁调用就代表谁)。 + +#### super和this的用法 + +1. 访问成员 + +```java +this.成员变量 -- 本类的 +super.成员变量 -- 父类的 + +this.成员方法名() -- 本类的 +super.成员方法名() -- 父类的 +``` + +用法演示,代码如下: + +```java +class Animal { + public void eat() { + System.out.println("animal : eat"); + } +} + +class Cat extends Animal { + public void eat() { + System.out.println("cat : eat"); + } + public void eatTest() { + this.eat(); // this 调用本类的方法 + super.eat(); // super 调用父类的方法 + } +} + +public class ExtendsDemo08 { + public static void main(String[] args) { + Animal a = new Animal(); + a.eat(); + Cat c = new Cat(); + c.eatTest(); + } +} + +输出结果为: +animal : eat +cat : eat +animal : eat +``` + +1. 访问构造方法 + +```java +this(...) -- 本类的构造方法 +super(...) -- 父类的构造方法 +``` + +> 子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。 +> +> super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。 + +### 1.7 继承的特点 + +1. Java只支持单继承,不支持多继承。 + +```java +//一个类只能有一个父类,不可以有多个父类。 +class C extends A{} //ok +class C extends A,B... //error +``` + +1. Java支持多层继承(继承体系)。 + +```java +class A{} +class B extends A{} +class C extends B{} +``` + +> 顶层父类是Object类。所有的类默认继承Object,作为父类。 + +1. 子类和父类是一种相对的概念。 + +## 第二章 抽象类 + +### 2.1 概述 + +#### 由来 + +父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为**抽象方法**。Java语法规定,包含抽象方法的类就是**抽象类**。 + +#### 定义 + +* **抽象方法** : 没有方法体的方法。 +* **抽象类**:包含抽象方法的类。 + +### 2.2 abstract使用格式 + +#### 抽象方法 + +使用`abstract` 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。 + +定义格式: + +```java +修饰符 abstract 返回值类型 方法名 (参数列表); +``` + +代码举例: + +```java +public abstract void run(); +``` + +#### 抽象类 + +如果一个类包含抽象方法,那么该类必须是抽象类。 + +定义格式: + +```java +abstract class 类名字 { + +} +``` + +代码举例: + +```java +public abstract class Animal { + public abstract void run(); +} +``` + +#### 抽象的使用 + +继承抽象类的子类**必须重写父类所有的抽象方法**。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。 + +代码举例: + +```java +public class Cat extends Animal { + public void run (){ + System.out.println("小猫在墙头走~~~"); + } +} + +public class CatTest { + public static void main(String[] args) { + // 创建子类对象 + Cat c = new Cat(); + + // 调用run方法 + c.run(); + } +} +输出结果: +小猫在墙头走~~~ +``` + +此时的方法重写,是子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做**实现方法**。 + +### 2.3 注意事项 + +关于抽象类的使用,以下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背。 + +1. 抽象类**不能创建对象**,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。 + + > 理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。 + +2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。 + + > 理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。 + +3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。 + + > 理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。 + +4. 抽象类的子类,必须重写抽象父类中**所有的**抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。 + + > 理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。 + +## 第三章 继承的综合案例 + +### 3.1 综合案例:群主发普通红包 + +群主发普通红包。某群有多名成员,群主给成员发普通红包。普通红包的规则: + +1. 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取。 +2. 成员领取红包后,保存到成员余额中。 + +请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作。 + +### 3.2 案例分析 + +根据描述分析,得出如下继承体系: + +![](img/3.jpg) + +### 3.3 案例实现 + +定义用户类: + +```java +public class User { + // 成员变量 + private String username; // 用户名 + private double leftMoney; // 余额 + + // 构造方法 + public User() { } + public User(String username, double leftMoney) { + this.username = username; + this.leftMoney = leftMoney; + } + // get/set方法 + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public double getLeftMoney() { + return leftMoney; + } + + public void setLeftMoney(double leftMoney) { + this.leftMoney = leftMoney; + } + // 展示信息的方法 + public void show() { + System.out.println("用户名:"+ username +" , 余额为:" + leftMoney + "元"); + } +} +``` + +定义群主类: + +```java +public class QunZhu extends User { + // 添加构造方法 + public QunZhu() { + } + + public QunZhu(String username, double leftMoney) { + // 通过super 调用父类构造方法 + super(username, leftMoney); + } + /* + 群主发红包,就是把一个整数的金额,分层若干等份。 + 1.获取群主余额,是否够发红包. + 不能则返回null,并提示. + 能则继续. + 2.修改群主余额. + 3.拆分红包. + 3.1.如果能整除,那么就平均分。 + 3.2.如果不能整除,那么就把余数分给最后一份。 + */ + public ArrayList send(int money, int count) { + // 获取群主余额 + double leftMoney = getLeftMoney(); + if(money > leftMoney) { + return null; + } + // 修改群主余额的 + setLeftMoney(leftMoney - money); + + // 创建一个集合,保存等份金额 + ArrayList list = new ArrayList<>(); + + // 扩大100倍,相当于折算成'分'为单位,避免小数运算损失精度的问题 + money = money * 100; + + // 每份的金额 + int m = money / count; + // 不能整除的余数 + int l = money % count; + + // 无论是否整除,n-1份,都是每份的等额金额 + for (int i = 0; i < count - 1; i++) { + // 缩小100倍,折算成 '元' + list.add(m / 100.0); + } + + // 判断是否整除 + if (l == 0) { + // 能整除, 最后一份金额,与之前每份金额一致 + list.add(m / 100.0); + } else { + // 不能整除, 最后一份的金额,是之前每份金额+余数金额 + list.add((m + l) / 100.00); + } + + // 返回集合 + return list; + } +} +``` + +定义成员类: + +```java +public class Member extends User { + public Member() { + } + + public Member(String username, double leftMoney) { + super(username, leftMoney); + } + // 打开红包,就是从集合中,随机取出一份,保存到自己的余额中 + public void openHongbao(ArrayList list) { + // 创建Random对象 + Random r = new Random(); + // 随机生成一个角标 + int index = r.nextInt(list.size()); + // 移除一个金额 + Double money = list.remove(index); + // 直接调用父类方法,设置到余额 + setLeftMoney(leftMoney + money ); + } +} +``` + +定义测试类: + +```java +public class Test { + public static void main(String[] args) { + // 创建一个群主对象 + QunZhu qz = new QunZhu("群主" , 200); + + // 创建一个键盘录入 + Scanner sc = new Scanner(); + System.out.println("请输入金额:"); + int money = sc.nextInt(); + System.out.println("请输入个数:"); + int count = sc.nextInt(); + + // 发送红包 + ArrayList sendList = s.send(money,count); + + // 判断,如果余额不足 + if(sendList == null){ + System.out.println(" 余额不足..."); + return; + } + + // 创建三个成员 + Member m = new Member(); + Member m2 = new Member(); + Member m3 = new Member(); + + // 打开红包 + m.openHongbao(sendList); + m2.openHongbao(sendList); + m3.openHongbao(sendList); + // 展示信息 + qz.show(); + m.show(); + m2.show(); + m3.show(); + } +} +``` diff --git a/javaSE1/day09/img/1.jpg b/javaSE1/day09/img/1.jpg new file mode 100644 index 0000000..acfef02 Binary files /dev/null and b/javaSE1/day09/img/1.jpg differ diff --git a/javaSE1/day09/img/2.jpg b/javaSE1/day09/img/2.jpg new file mode 100644 index 0000000..b8e0774 Binary files /dev/null and b/javaSE1/day09/img/2.jpg differ diff --git a/javaSE1/day09/img/3.jpg b/javaSE1/day09/img/3.jpg new file mode 100644 index 0000000..c6bfc8e Binary files /dev/null and b/javaSE1/day09/img/3.jpg differ diff --git a/javaSE1/day10/day10【接口、多态】.md b/javaSE1/day10/day10【接口、多态】.md new file mode 100644 index 0000000..5523b95 --- /dev/null +++ b/javaSE1/day10/day10【接口、多态】.md @@ -0,0 +1,852 @@ +# day10【接口、多态】 + +### 今日内容 + +- 接口 +- 三大特征——多态 +- 引用类型转换 + +### 教学目标 + +- [ ] 写出定义接口的格式 +- [ ] 写出实现接口的格式 +- [ ] 说出接口中成员的特点 +- [ ] 能够说出使用多态的前提条件 +- [ ] 理解多态的向上转型 +- [ ] 理解多态的向下转型 +- [ ] 能够完成笔记本电脑案例(方法参数为接口) + +## 第一章 接口 + +### 1.1 概述 + +接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是**封装了方法**,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。 + +接口的定义,它与定义类方式相似,但是使用 `interface` 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。 + +> 引用数据类型:数组,类,接口。 + +接口的使用,它不能创建对象,但是可以被实现(`implements` ,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。 + +### 1.2 定义格式 + +```java +public interface 接口名称 { + // 抽象方法 + // 默认方法 + // 静态方法 + // 私有方法 +} +``` + +#### 含有抽象方法 + +抽象方法:使用`abstract` 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。 + +代码如下: + +```java +public interface InterFaceName { + public abstract void method(); +} +``` + +#### 含有默认方法和静态方法 + +默认方法:使用 `default` 修饰,不可省略,供子类调用或者子类重写。 + +静态方法:使用 `static` 修饰,供接口直接调用。 + +代码如下: + +```java +public interface InterFaceName { + public default void method() { + // 执行语句 + } + public static void method2() { + // 执行语句 + } +} +``` + +#### 含有私有方法和私有静态方法 + +私有方法:使用 `private` 修饰,供接口中的默认方法或者静态方法调用。 + +代码如下: + +```java +public interface InterFaceName { + private void method() { + // 执行语句 + } +} +``` + +### 1.3 基本的实现 + +#### 实现的概述 + +类与接口的关系为实现关系,即**类实现接口**,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承,格式相仿,只是关键字不同,实现使用 ` implements`关键字。 + +非抽象子类实现接口: + +1. 必须重写接口中所有抽象方法。 +2. 继承了接口的默认方法,即可以直接调用,也可以重写。 + +实现格式: + +```java +class 类名 implements 接口名 { + // 重写接口中抽象方法【必须】 + // 重写接口中默认方法【可选】 +} +``` + +#### 抽象方法的使用 + +必须全部实现,代码如下: + +定义接口: + +```java +public interface LiveAble { + // 定义抽象方法 + public abstract void eat(); + public abstract void sleep(); +} +``` + +定义实现类: + +```java +public class Animal implements LiveAble { + @Override + public void eat() { + System.out.println("吃东西"); + } + + @Override + public void sleep() { + System.out.println("晚上睡"); + } +} +``` + +定义测试类: + +```java +public class InterfaceDemo { + public static void main(String[] args) { + // 创建子类对象 + Animal a = new Animal(); + // 调用实现后的方法 + a.eat(); + a.sleep(); + } +} +输出结果: +吃东西 +晚上睡 +``` + +#### 默认方法的使用 + +可以继承,可以重写,二选一,但是只能通过实现类的对象来调用。 + +1. 继承默认方法,代码如下: + +定义接口: + +```java +public interface LiveAble { + public default void fly(){ + System.out.println("天上飞"); + } +} +``` + +定义实现类: + +```java +public class Animal implements LiveAble { + // 继承,什么都不用写,直接调用 +} +``` + +定义测试类: + +```java +public class InterfaceDemo { + public static void main(String[] args) { + // 创建子类对象 + Animal a = new Animal(); + // 调用默认方法 + a.fly(); + } +} +输出结果: +天上飞 +``` + +2. 重写默认方法,代码如下: + +定义接口: + +```java +public interface LiveAble { + public default void fly(){ + System.out.println("天上飞"); + } +} +``` + +定义实现类: + +```java +public class Animal implements LiveAble { + @Override + public void fly() { + System.out.println("自由自在的飞"); + } +} +``` + +定义测试类: + +```java +public class InterfaceDemo { + public static void main(String[] args) { + // 创建子类对象 + Animal a = new Animal(); + // 调用重写方法 + a.fly(); + } +} +输出结果: +自由自在的飞 +``` + +#### 静态方法的使用 + +静态与.class 文件相关,只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用,代码如下: + +定义接口: + +```java +public interface LiveAble { + public static void run(){ + System.out.println("跑起来~~~"); + } +} +``` + +定义实现类: + +```java +public class Animal implements LiveAble { + // 无法重写静态方法 +} +``` + +定义测试类: + +```java +public class InterfaceDemo { + public static void main(String[] args) { + // Animal.run(); // 【错误】无法继承方法,也无法调用 + LiveAble.run(); // + } +} +输出结果: +跑起来~~~ +``` + +#### 私有方法的使用 + +* 私有方法:只有默认方法可以调用。 +* 私有静态方法:默认方法和静态方法可以调用。 + +如果一个接口中有多个默认方法,并且方法中有重复的内容,那么可以抽取出来,封装到私有方法中,供默认方法去调用。从设计的角度讲,私有的方法是对默认方法和静态方法的辅助。同学们在已学技术的基础上,可以自行测试。 + +### 1.4 接口的多实现 + +之前学过,在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的**多实现**。并且,一个类能继承一个父类,同时实现多个接口。 + +实现格式: + +```java +class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... { + // 重写接口中抽象方法【必须】 + // 重写接口中默认方法【不重名时可选】 +} +``` + +> [ ]: 表示可选操作。 + +#### 抽象方法 + +接口中,有多个抽象方法时,实现类必须重写所有抽象方法**。如果抽象方法有重名的,只需要重写一次。**代码如下: + +定义多个接口: + +```java +interface A { + public abstract void showA(); + public abstract void show(); +} + +interface B { + public abstract void showB(); + public abstract void show(); +} +``` + +定义实现类: + +```java +public class C implements A,B{ + @Override + public void showA() { + System.out.println("showA"); + } + + @Override + public void showB() { + System.out.println("showB"); + } + + @Override + public void show() { + System.out.println("show"); + } +} +``` + +#### 默认方法 + +接口中,有多个默认方法时,实现类都可继承使用。**如果默认方法有重名的,必须重写一次。**代码如下: + +定义多个接口: + +```java +interface A { + public default void methodA(){} + public default void method(){} +} + +interface B { + public default void methodB(){} + public default void method(){} +} +``` + +定义实现类: + +```java +public class C implements A,B{ + @Override + public void method() { + System.out.println("method"); + } +} +``` + +#### 静态方法 + +接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。 + +#### 优先级的问题 + +当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。代码如下: + +定义接口: + +```java +interface A { + public default void methodA(){ + System.out.println("AAAAAAAAAAAA"); + } +} +``` + +定义父类: + +```java +class D { + public void methodA(){ + System.out.println("DDDDDDDDDDDD"); + } +} +``` + +定义子类: + +```java +class C extends D implements A { + // 未重写methodA方法 +} +``` + +定义测试类: + +```java +public class Test { + public static void main(String[] args) { + C c = new C(); + c.methodA(); + } +} +输出结果: +DDDDDDDDDDDD +``` + + + +### 1.5 接口的多继承【了解】 + +一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。接口的继承使用 `extends` 关键字,子接口继承父接口的方法。**如果父接口中的默认方法有重名的,那么子接口需要重写一次。**代码如下: + +定义父接口: + +```java +interface A { + public default void method(){ + System.out.println("AAAAAAAAAAAAAAAAAAA"); + } +} + +interface B { + public default void method(){ + System.out.println("BBBBBBBBBBBBBBBBBBB"); + } +} +``` + +定义子接口: + +```java +interface D extends A,B{ + @Override + public default void method() { + System.out.println("DDDDDDDDDDDDDD"); + } +} +``` + +> 小贴士: +> +> 子接口重写默认方法时,default关键字可以保留。 +> +> 子类重写默认方法时,default关键字不可以保留。 + +### 1.6 其他成员特点 + +- 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。 + +- 接口中,没有构造方法,不能创建对象。 + +- 接口中,没有静态代码块。 + + + +## 第二章 多态 + +### 2.1 概述 + +#### 引入 + +多态是继封装、继承之后,面向对象的第三大特性。 + +生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。 + +#### 定义 + +* **多态**: 是指同一行为,具有多个不同表现形式。 + +#### 前提【重点】 + +1. 继承或者实现【二选一】 +2. 方法的重写【意义体现:不重写,无意义】 +3. 父类引用指向子类对象【格式体现】 + +### 2.2 多态的体现 + +多态体现的格式: + +```java +父类类型 变量名 = new 子类对象; +变量名.方法名(); +``` + +> 父类类型:指子类对象继承的父类类型,或者实现的父接口类型。 + +代码如下: + +```java +Fu f = new Zi(); +f.method(); +``` + +**当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。** + +代码如下: + +定义父类: + +```java +public abstract class Animal { + public abstract void eat(); +} +``` + +定义子类: + +```java +class Cat extends Animal { + public void eat() { + System.out.println("吃鱼"); + } +} + +class Dog extends Animal { + public void eat() { + System.out.println("吃骨头"); + } +} +``` + +定义测试类: + +```java +public class Test { + public static void main(String[] args) { + // 多态形式,创建对象 + Animal a1 = new Cat(); + // 调用的是 Cat 的 eat + a1.eat(); + + // 多态形式,创建对象 + Animal a2 = new Dog(); + // 调用的是 Dog 的 eat + a2.eat(); + } +} +``` + +### 2.3 多态的好处 + +实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。代码如下: + +定义父类: + +```java +public abstract class Animal { + public abstract void eat(); +} +``` + +定义子类: + +```java +class Cat extends Animal { + public void eat() { + System.out.println("吃鱼"); + } +} + +class Dog extends Animal { + public void eat() { + System.out.println("吃骨头"); + } +} +``` + +定义测试类: + +```java +public class Test { + public static void main(String[] args) { + // 多态形式,创建对象 + Cat c = new Cat(); + Dog d = new Dog(); + + // 调用showCatEat + showCatEat(c); + // 调用showDogEat + showDogEat(d); + + /* + 以上两个方法, 均可以被showAnimalEat(Animal a)方法所替代 + 而执行效果一致 + */ + showAnimalEat(c); + showAnimalEat(d); + } + + public static void showCatEat (Cat c){ + c.eat(); + } + + public static void showDogEat (Dog d){ + d.eat(); + } + + public static void showAnimalEat (Animal a){ + a.eat(); + } +} +``` + +由于多态特性的支持,showAnimalEat方法的Animal类型,是Cat和Dog的父类类型,父类类型接收子类对象,当然可以把Cat对象和Dog对象,传递给方法。 + +当eat方法执行时,多态规定,执行的是子类重写的方法,那么效果自然与showCatEat、showDogEat方法一致,所以showAnimalEat完全可以替代以上两方法。 + +不仅仅是替代,在扩展性方面,无论之后再多的子类出现,我们都不需要编写showXxxEat方法了,直接使用showAnimalEat都可以完成。 + +所以,多态的好处,体现在,可以使程序编写的更简单,并有良好的扩展。 + +### 2.4 引用类型转换 + +多态的转型分为向上转型与向下转型两种: + +#### 向上转型 + +* **向上转型**:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。 + +当父类引用指向一个子类对象时,便是向上转型。 + +使用格式: + +```java +父类类型 变量名 = new 子类类型(); +如:Animal a = new Cat(); +``` + +#### 向下转型 + +* **向下转型**:父类类型向子类类型向下转换的过程,这个过程是强制的。 + +一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。 + +使用格式: + +```java +子类类型 变量名 = (子类类型) 父类变量名; +如:Cat c =(Cat) a; +``` + +#### 为什么要转型 + +当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,**不能调用**子类拥有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有的方法,必须做向下转型。 + +转型演示,代码如下: + +定义类: + +```java +abstract class Animal { + abstract void eat(); +} + +class Cat extends Animal { + public void eat() { + System.out.println("吃鱼"); + } + public void catchMouse() { + System.out.println("抓老鼠"); + } +} + +class Dog extends Animal { + public void eat() { + System.out.println("吃骨头"); + } + public void watchHouse() { + System.out.println("看家"); + } +} +``` + +定义测试类: + +```java +public class Test { + public static void main(String[] args) { + // 向上转型 + Animal a = new Cat(); + a.eat(); // 调用的是 Cat 的 eat + + // 向下转型 + Cat c = (Cat)a; + c.catchMouse(); // 调用的是 Cat 的 catchMouse + } +} +``` + +#### 转型的异常 + +转型的过程中,一不小心就会遇到这样的问题,请看如下代码: + +```java +public class Test { + public static void main(String[] args) { + // 向上转型 + Animal a = new Cat(); + a.eat(); // 调用的是 Cat 的 eat + + // 向下转型 + Dog d = (Dog)a; + d.watchHouse(); // 调用的是 Dog 的 watchHouse 【运行报错】 + } +} +``` + +这段代码可以通过编译,但是运行时,却报出了 `ClassCastException` ,类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。这两个类型并没有任何继承关系,不符合类型转换的定义。 + +为了避免ClassCastException的发生,Java提供了 `instanceof` 关键字,给引用变量做类型的校验,格式如下: + +```java +变量名 instanceof 数据类型 +如果变量属于该数据类型,返回true。 +如果变量不属于该数据类型,返回false。 +``` + +所以,转换前,我们最好先做一个判断,代码如下: + +```java +public class Test { + public static void main(String[] args) { + // 向上转型 + Animal a = new Cat(); + a.eat(); // 调用的是 Cat 的 eat + + // 向下转型 + if (a instanceof Cat){ + Cat c = (Cat)a; + c.catchMouse(); // 调用的是 Cat 的 catchMouse + } else if (a instanceof Dog){ + Dog d = (Dog)a; + d.watchHouse(); // 调用的是 Dog 的 watchHouse + } + } +} +``` + +## 第三章 接口多态的综合案例 + +### 3.1 笔记本电脑 + +笔记本电脑(laptop)通常具备使用USB设备的功能。在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体是什么USB设备,笔记本厂商并不关心,只要符合USB规格的设备都可以。 + +定义USB接口,具备最基本的开启功能和关闭功能。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,实现USB接口,否则鼠标和键盘的生产出来也无法使用。 + +### 3.2 案例分析 + +进行描述笔记本类,实现笔记本使用USB鼠标、USB键盘 + +* USB接口,包含开启功能、关闭功能 +* 笔记本类,包含运行功能、关机功能、使用USB设备功能 +* 鼠标类,要实现USB接口,并具备点击的方法 +* 键盘类,要实现USB接口,具备敲击的方法 + +### 3.3 案例实现 + +定义USB接口: + +```java +interface USB { + void open();// 开启功能 + void close();// 关闭功能 +} +``` +定义鼠标类: + +```java +class Mouse implements USB { + public void open() { + System.out.println("鼠标开启,红灯闪一闪"); + } + public void close() { + System.out.println("鼠标关闭,红灯熄灭"); + } + public void click(){ + System.out.println("鼠标单击"); + } +} +``` + +定义键盘类: + +```java +class KeyBoard implements USB { + public void open() { + System.out.println("键盘开启,绿灯闪一闪"); + } + public void close() { + System.out.println("键盘关闭,绿灯熄灭"); + } + public void type(){ + System.out.println("键盘打字"); + } +} +``` + +定义笔记本类: + +```java +class Laptop { + // 笔记本开启运行功能 + public void run() { + System.out.println("笔记本运行"); + } + + // 笔记本使用usb设备,这时当笔记本对象调用这个功能时,必须给其传递一个符合USB规则的USB设备 + public void useUSB(USB usb) { + // 判断是否有USB设备 + if (usb != null) { + usb.open(); + // 类型转换,调用特有方法 + if(usb instanceof Mouse){ + Mouse m = (Mouse)usb; + m.click(); + }else if (usb instanceof KeyBoard){ + KeyBoard kb = (KeyBoard)usb; + kb.type(); + } + usb.close(); + } + } + + public void shutDown() { + System.out.println("笔记本关闭"); + } +} +``` +测试类,代码如下: + +```java +public class Test { + public static void main(String[] args) { + // 创建笔记本实体对象 + Laptop lt = new Laptop(); + // 笔记本开启 + lt.run(); + + // 创建鼠标实体对象 + Usb u = new Mouse(); + // 笔记本使用鼠标 + lt.useUSB(u); + + // 创建键盘实体对象 + KeyBoard kb = new KeyBoard(); + // 笔记本使用键盘 + lt.useUSB(kb); + + // 笔记本关闭 + lt.shutDown(); + } +} +``` + diff --git a/javaSE1/day11/day11【final、权限、内部类】.md b/javaSE1/day11/day11【final、权限、内部类】.md new file mode 100644 index 0000000..32b92fc --- /dev/null +++ b/javaSE1/day11/day11【final、权限、内部类】.md @@ -0,0 +1,618 @@ +# day11【final、权限、内部类、引用类型】 + +### 今日内容 + +- final关键字 +- 权限 +- 内部类 +- 引用类型 + +### 教学目标 + +- [ ] 描述final修饰的类的特点 +- [ ] 描述final修饰的方法的特点 +- [ ] 能够说出权限修饰符作用范围 +- [ ] 说出内部类的概念 +- [ ] 能够理解引用类型作为成员变量 +- [ ] 能够理解引用类型作为方法参数 +- [ ] 能够理解引用类型作为方法返回值类型 + +## 第一章 final关键字 + +### 1.1 概述 + +学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java提供了`final` 关键字,用于修饰**不可改变**内容。 + +* **final**: 不可改变。可以用于修饰类、方法和变量。 + * 类:被修饰的类,不能被继承。 + * 方法:被修饰的方法,不能被重写。 + * 变量:被修饰的变量,不能被重新赋值。 + +### 1.2 使用方式 + +#### 修饰类 + +格式如下: + +```java +final class 类名 { + +} +``` + +查询API发现像 `public final class String` 、`public final class Math` 、`public final class Scanner` 等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。 + +#### 修饰方法 + +格式如下: + +```java +修饰符 final 返回值类型 方法名(参数列表){ + //方法体 +} +``` +重写被 `final`修饰的方法,编译时就会报错。 + +#### 修饰变量 + +1. **局部变量——基本类型** + +基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下: + +```java +public class FinalDemo1 { + public static void main(String[] args) { + // 声明变量,使用final修饰 + final int a; + // 第一次赋值 + a = 10; + // 第二次赋值 + a = 20; // 报错,不可重新赋值 + + // 声明变量,直接赋值,使用final修饰 + final int b = 10; + // 第二次赋值 + b = 20; // 报错,不可重新赋值 + } +} +``` + +思考,如下两种写法,哪种可以通过编译? + +写法1: + +```java +final int c = 0; +for (int i = 0; i < 10; i++) { + c = i; + System.out.println(c); +} +``` + +写法2: + +```java +for (int i = 0; i < 10; i++) { + final int c = i; + System.out.println(c); +} +``` + +根据 `final` 的定义,写法1报错!写法2,为什么通过编译呢?因为每次循环,都是一次新的变量c。这也是大家需要注意的地方。 + +2. **局部变量——引用类型** + +引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改,代码如下: + +```java +public class FinalDemo2 { + public static void main(String[] args) { + // 创建 User 对象 + final User u = new User(); + // 创建 另一个 User对象 + u = new User(); // 报错,指向了新的对象,地址值改变。 + + // 调用setName方法 + u.setName("张三"); // 可以修改 + } +} +``` + +3. **成员变量** + +成员变量涉及到初始化的问题,初始化方式有两种,只能二选一: + +- 显示初始化; + +```java +public class User { + final String USERNAME = "张三"; + private int age; +} +``` + +- 构造方法初始化。 + +```java +public class User { + final String USERNAME ; + private int age; + public User(String username, int age) { + this.USERNAME = username; + this.age = age; + } +} +``` + +> 被final修饰的常量名称,一般都有书写规范,所有字母都**大写**。 + +## 第二章 权限修饰符 + +### 2.1 概述 + +在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限, + +* public:公共的。 +* protected:受保护的 +* default:默认的 +* private:私有的 + +### 2.2 不同权限的访问能力 + +| | public | protected | default(空的) | private | +| ------------ | ------ | --------- | ----------- | ------- | +| 同一类中 | √ | √ | √ | √ | +| 同一包中(子类与无关类) | √ | √ | √ | | +| 不同包的子类 | √ | √ | | | +| 不同包中的无关类 | √ | | | | + +可见,public具有最大权限。private则是最小权限。 + +编写代码时,如果没有特殊的考虑,建议这样使用权限: + +- 成员变量使用`private` ,隐藏细节。 +- 构造方法使用` public` ,方便创建对象。 +- 成员方法使用`public` ,方便调用方法。 + +> 小贴士:不加权限修饰符,其访问能力与default修饰符相同 + +## 第三章 内部类 + +### 1.1 概述 + +#### 什么是内部类 + +将一个类A定义在另一个类B里面,里面的那个类A就称为**内部类**,B则称为**外部类**。 + +#### 成员内部类 + +* **成员内部类** :定义在**类中方法外**的类。 + +定义格式: + +```java +class 外部类 { + class 内部类{ + + } +} +``` + +在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类`Car` 中包含发动机类`Engine` ,这时,`Engine `就可以使用内部类来描述,定义在成员位置。 + +代码举例: + +```java +class Car { //外部类 + class Engine { //内部类 + + } +} +``` + +#### 访问特点 + +- 内部类可以直接访问外部类的成员,包括私有成员。 +- 外部类要访问内部类的成员,必须要建立内部类的对象。 + +创建内部类对象格式: + +```java +外部类名.内部类名 对象名 = new 外部类型().new 内部类型(); +``` + +访问演示,代码如下: + +定义类: + +```java +public class Person { + private boolean live = true; + + class Heart { + public void jump() { + // 直接访问外部类成员 + if (live) { + System.out.println("心脏在跳动"); + } else { + System.out.println("心脏不跳了"); + } + } + } + + public boolean isLive() { + return live; + } + + public void setLive(boolean live) { + this.live = live; + } +} +``` + +定义测试类: + +```java +public class InnerDemo { + public static void main(String[] args) { + // 创建外部类对象 + Person p = new Person(); + // 创建内部类对象 + Heart heart = p.new Heart(); + + // 调用内部类方法 + heart.jump(); + // 调用外部类方法 + p.setLive(false); + // 调用内部类方法 + heart.jump(); + } +} +输出结果: +心脏在跳动 +心脏不跳了 +``` + +> 内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。 +> +> 比如,Person$Heart.class + +### 1.2 匿名内部类【重点】 + +* **匿名内部类** :是内部类的简化写法。它的本质是一个`带具体实现的` `父类或者父接口的` `匿名的` **子类对象**。 + +开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作, + +1. 定义子类 +2. 重写接口中的方法 +3. 创建子类对象 +4. 调用重写后的方法 + +我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快捷方式。 + +#### 前提 + +匿名内部类必须**继承一个父类**或者**实现一个父接口**。 + +#### 格式 + +```java +new 父类名或者接口名(){ + // 方法重写 + @Override + public void method() { + // 执行语句 + } +}; +``` + +#### 使用方式 + +以接口为例,匿名内部类的使用,代码如下: + +定义接口: + +```java +public abstract class FlyAble{ + public abstract void fly(); +} +``` + +创建匿名内部类,并调用: + +```java +public class InnerDemo { + public static void main(String[] args) { + /* + 1.等号右边:是匿名内部类,定义并创建该接口的子类对象 + 2.等号左边:是多态赋值,接口类型引用指向子类对象 + */ + FlyAble f = new FlyAble(){ + public void fly() { + System.out.println("我飞了~~~"); + } + }; + + //调用 fly方法,执行重写后的方法 + f.fly(); + } +} +``` + +通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。代码如下: + +```java +public class InnerDemo2 { + public static void main(String[] args) { + /* + 1.等号右边:定义并创建该接口的子类对象 + 2.等号左边:是多态,接口类型引用指向子类对象 + */ + FlyAble f = new FlyAble(){ + public void fly() { + System.out.println("我飞了~~~"); + } + }; + // 将f传递给showFly方法中 + showFly(f); + } + public static void showFly(FlyAble f) { + f.fly(); + } +} +``` + +以上两步,也可以简化为一步,代码如下: + +```java +public class InnerDemo3 { + public static void main(String[] args) { + /* + 创建匿名内部类,直接传递给showFly(FlyAble f) + */ + showFly( new FlyAble(){ + public void fly() { + System.out.println("我飞了~~~"); + } + }); + } + + public static void showFly(FlyAble f) { + f.fly(); + } +} +``` + +## 第四章 引用类型用法总结 + +实际的开发中,引用类型的使用非常重要,也是非常普遍的。我们可以在理解基本类型的使用方式基础上,进一步去掌握引用类型的使用方式。基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的。 + +### 4.1 class作为成员变量 + +在定义一个类Role(游戏角色)时,代码如下: + +```java +class Role { + int id; // 角色id + int blood; // 生命值 + String name; // 角色名称 +} +``` + +使用`int` 类型表示 角色id和生命值,使用`String` 类型表示姓名。此时,`String`本身就是引用类型,由于使用的方式类似常量,所以往往忽略了它是引用类型的存在。如果我们继续丰富这个类的定义,给`Role` 增加武器,穿戴装备等属性,我们将如何编写呢? + +定义武器类,将增加攻击能力: + +```java +class Weapon { + String name; // 武器名称 + int hurt; // 伤害值 +} +``` + +定义穿戴盔甲类,将增加防御能力,也就是提升生命值: + +```java +class Armour { + String name;// 装备名称 + int protect;// 防御值 +} +``` + +定义角色类: + +```java +class Role { + int id; + int blood; + String name; + // 添加武器属性 + Weapon wp; + // 添加盔甲属性 + Armour ar; + + // 提供get/set方法 + public Weapon getWp() { + return wp; + } + public void setWeapon(Weapon wp) { + this.wp = wp; + } + public Armour getArmour() { + return ar; + } + public void setArmour(Armour ar) { + this.ar = ar; + } + + // 攻击方法 + public void attack(){ + System.out.println("使用"+ wp.getName() +", 造成"+wp.getHurt()+"点伤害"); + } + + // 穿戴盔甲 + public void wear(){ + // 增加防御,就是增加blood值 + this.blood += ar.getProtect(); + System.out.println("穿上"+ar.getName()+", 生命值增加"+ar.getProtect()); + } +} +``` + +测试类: + +```java +public class Test { + public static void main(String[] args) { + // 创建Weapon 对象 + Weapon wp = new Weapon("屠龙刀" , 999999); + // 创建Armour 对象 + Armour ar = new Armour("麒麟甲",10000); + // 创建Role 对象 + Role r = new Role(); + + // 设置武器属性 + r.setWeapon(wp); + // 设置盔甲属性 + r.setArmour(ar); + + // 攻击 + r.attack(); + // 穿戴盔甲 + r.wear(); + } +} +输出结果: +使用屠龙刀,造成999999点伤害 +穿上麒麟甲 ,生命值增加10000 +``` + +> 类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象。 +> + +### 4.2 interface作为成员变量 + +接口是对方法的封装,对应游戏当中,可以看作是扩展游戏角色的技能。所以,如果想扩展更强大技能,我们在`Role`中,可以增加接口作为成员变量,来设置不同的技能。 + +定义接口: + +```java +// 法术攻击 +public interface FaShuSkill { + public abstract void faShuAttack(); +} +``` + +定义角色类: + +```java +public class Role { + FaShuSkill fs; + + public void setFaShuSkill(FaShuSkill fs) { + this.fs = fs; + } + // 法术攻击 + public void faShuSkillAttack(){ + System.out.print("发动法术攻击:"); + fs.faShuAttack(); + System.out.println("攻击完毕"); + } +} +``` + +定义测试类: + +```java +public class Test { + public static void main(String[] args) { + // 创建游戏角色 + Role role = new Role(); + // 设置角色法术技能 + role.setFaShuSkill(new FaShuSkill() { + @Override + public void faShuAttack() { + System.out.println("纵横天下"); + } + }); + + // 发动法术攻击 + role.faShuSkillAttack(); + + // 更换技能 + role.setFaShuSkill(new FaShuSkill() { + @Override + public void faShuAttack() { + System.out.println("逆转乾坤"); + } + }); + // 发动法术攻击 + role.faShuSkillAttack(); + } +} +输出结果: +发动法术攻击:纵横天下 +攻击完毕 + +发动法术攻击:逆转乾坤 +攻击完毕 +``` + +> 我们使用一个接口,作为成员变量,以便随时更换技能,这样的设计更为灵活,增强了程序的扩展性。 +> +> 接口作为成员变量时,对它进行赋值的操作,实际上,是赋给它该接口的一个子类对象。 + +### 4.3 interface作为方法参数和返回值类型 + +当接口作为方法的参数时,需要传递什么呢?当接口作为方法的返回值类型时,需要返回什么呢?对,其实都是它的子类对象。 +`ArrayList`类我们并不陌生,查看API我们发现,实际上,它是 `java.util.List` 接口的实现类。所以,当我们看见`List` 接口作为参数或者返回值类型时,当然可以将`ArrayList`的对象进行传递或返回。 + +请观察如下方法:**获取某集合中所有的偶数**。 + +定义方法: + +```java +public static List getEvenNum(List list) { + // 创建保存偶数的集合 + ArrayList evenList = new ArrayList<>(); + // 遍历集合list,判断元素为偶数,就添加到evenList中 + for (int i = 0; i < list.size(); i++) { + Integer integer = list.get(i); + if (integer % 2 == 0) { + evenList.add(integer); + } + } + /* + 返回偶数集合 + 因为getEvenNum方法的返回值类型是List,而ArrayList是List的子类, + 所以evenList可以返回 + */ + return evenList; +} +``` + +调用方法: + +```java +public class Test { + public static void main(String[] args) { + // 创建ArrayList集合,并添加数字 + ArrayList srcList = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + srcList.add(i); + } + + /* + 获取偶数集合 + 因为getEvenNum方法的参数是List,而ArrayList是List的子类, + 所以srcList可以传递 + */ + List list = getEvenNum(srcList); + System.out.println(list); + } +} +``` + +> 接口作为参数时,传递它的子类对象。 +> +> 接口作为返回值类型时,返回它的子类对象。 \ No newline at end of file diff --git a/javaSE1/day11/img/1_input.jpg b/javaSE1/day11/img/1_input.jpg new file mode 100644 index 0000000..0c039c4 Binary files /dev/null and b/javaSE1/day11/img/1_input.jpg differ diff --git a/javaSE1/day11/img/2_open.jpg b/javaSE1/day11/img/2_open.jpg new file mode 100644 index 0000000..9ad116f Binary files /dev/null and b/javaSE1/day11/img/2_open.jpg differ diff --git a/javaSE1/day11/img/3_setName.jpg b/javaSE1/day11/img/3_setName.jpg new file mode 100644 index 0000000..1890f87 Binary files /dev/null and b/javaSE1/day11/img/3_setName.jpg differ diff --git a/javaSE1/day11/img/4_setMode.jpg b/javaSE1/day11/img/4_setMode.jpg new file mode 100644 index 0000000..9454b1c Binary files /dev/null and b/javaSE1/day11/img/4_setMode.jpg differ diff --git a/javaSE2/day01/day01【Object类、常用API】.md b/javaSE2/day01/day01【Object类、常用API】.md new file mode 100644 index 0000000..3c41fe3 --- /dev/null +++ b/javaSE2/day01/day01【Object类、常用API】.md @@ -0,0 +1,612 @@ +# day01【Object类、常用API】 + +### 主要内容 + +* Object类 +* Date类 +* DateFormat类 +* Calendar类 +* System类 +* StringBuilder类 +* 包装类 + +### 教学目标 + +-[ ] 能够说出Object类的特点 +-[ ] 能够重写Object类的toString方法 +-[ ] 能够重写Object类的equals方法 +-[ ] 能够使用日期类输出当前日期 +-[ ] 能够使用将日期格式化为字符串的方法 +-[ ] 能够使用将字符串转换成日期的方法 +-[ ] 能够使用System类的数组复制方法 +-[ ] 能够使用System类获取当前毫秒时刻值 +-[ ] 能够说出使用StringBuilder类可以解决的问题 +-[ ] 能够使用StringBuilder进行字符串拼接操作 +-[ ] 能够说出8种基本类型对应的包装类名称 +-[ ] 能够说出自动装箱、自动拆箱的概念 +-[ ] 能够将字符串转换为对应的基本类型 +-[ ] 能够将基本类型转换为对应的字符串 + +## 第一章 Object类 + +### 1.1 概述 + +`java.lang.Object`类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。 + +如果一个类没有特别指定父类,那么默认则继承自Object类。例如: + +```java +public class MyClass /*extends Object*/ { + // ... +} +``` + +根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。今天我们主要学习其中的2个: + +* `public String toString()`:返回该对象的字符串表示。 +* `public boolean equals(Object obj)`:指示其他某个对象是否与此对象“相等”。 + +### 1.2 toString方法 + +#### 方法摘要 + +* `public String toString()`:返回该对象的字符串表示。 + +toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。 + +由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。 + +#### 覆盖重写 + +如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。例如自定义的Person类: + +```java +public class Person { + private String name; + private int age; + + @Override + public String toString() { + return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; + } + + // 省略构造器与Getter Setter +} +``` + +在IntelliJ IDEA中,可以点击`Code`菜单中的`Generate...`,也可以使用快捷键`alt+insert`,点击`toString()`选项。选择需要包含的成员变量并确定。如下图所示: + +![toString方法的自动重写](img\toString方法的自动重写.bmp) + +> 小贴士: 在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法。 +> + +### 1.3 equals方法 + +#### 方法摘要 + +* `public boolean equals(Object obj)`:指示其他某个对象是否与此对象“相等”。 + +调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。 + +#### 默认地址比较 + +如果没有覆盖重写equals方法,那么Object类中默认进行`==`运算符的对象地址比较,只要不是同一个对象,结果必然为false。 + +#### 对象内容比较 + +如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。例如: + +```java +import java.util.Objects; + +public class Person { + private String name; + private int age; + + @Override + public boolean equals(Object o) { + // 如果对象地址一样,则认为相同 + if (this == o) + return true; + // 如果参数为空,或者类型信息不一样,则认为不同 + if (o == null || getClass() != o.getClass()) + return false; + // 转换为当前类型 + Person person = (Person) o; + // 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果 + return age == person.age && Objects.equals(name, person.name); + } +} +``` + +这段代码充分考虑了对象为空、类型一致等问题,但方法内容并不唯一。大多数IDE都可以自动生成equals方法的代码内容。在IntelliJ IDEA中,可以使用`Code`菜单中的`Generate…`选项,也可以使用快捷键`alt+insert`,并选择`equals() and hashCode()`进行自动代码生成。如下图所示: + +![](img\equals方法1.png) + +![](img\equals方法2.png) + +![](img\equals方法3.png) + +> tips:Object类当中的hashCode等其他方法,今后学习。 + +### 1.4 Objects类 + +在刚才IDEA自动重写equals代码中,使用到了`java.util.Objects`类,那么这个类是什么呢? + +在**JDK7**添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。 + +在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下: + +* `public static boolean equals(Object a, Object b)`:判断两个对象是否相等。 + +我们可以查看一下源码,学习一下: + +~~~java +public static boolean equals(Object a, Object b) { + return (a == b) || (a != null && a.equals(b)); +} +~~~ + +## 第二章 日期时间类 + +### 2.1 Date类 + +#### 概述 + +` java.util.Date`类 表示特定的瞬间,精确到毫秒。 + +继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。 + +- `public Date()`:分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。 +- `public Date(long date)`:分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。 + +> tips: 由于我们处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒。 + +简单来说:使用无参构造,可以自动设置当前系统时间的毫秒时刻;指定long类型的构造参数,可以自定义毫秒时刻。例如: + +```java +import java.util.Date; + +public class Demo01Date { + public static void main(String[] args) { + // 创建日期对象,把当前的时间 + System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2018 + // 创建日期对象,把当前的毫秒值转成日期对象 + System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970 + } +} +``` + +> tips:在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。 +> + +#### 常用方法 + +Date类中的多数方法已经过时,常用的方法有: + +* `public long getTime()` 把日期对象转换成对应的时间毫秒值。 + +### 2.2 DateFormat类 + +`java.text.DateFormat` 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。 + +* **格式化**:按照指定的格式,从Date对象转换为String对象。 +* **解析**:按照指定的格式,从String对象转换为Date对象。 + +#### 构造方法 + +由于DateFormat为抽象类,不能直接使用,所以需要常用的子类`java.text.SimpleDateFormat`。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为: + +* `public SimpleDateFormat(String pattern)`:用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。 + +参数pattern是一个字符串,代表日期时间的自定义格式。 + +#### 格式规则 + +常用的格式规则为: + +| 标识字母(区分大小写) | 含义 | +| ----------- | ---- | +| y | 年 | +| M | 月 | +| d | 日 | +| H | 时 | +| m | 分 | +| s | 秒 | + +> 备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。 + +创建SimpleDateFormat对象的代码如: + +```java +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +public class Demo02SimpleDateFormat { + public static void main(String[] args) { + // 对应的日期格式如:2018-01-16 15:06:38 + DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } +} +``` + +#### 常用方法 + +DateFormat类的常用方法有: + +- `public String format(Date date)`:将Date对象格式化为字符串。 +- `public Date parse(String source)`:将字符串解析为Date对象。 + +##### format方法 + +使用format方法的代码为: + +```java +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +/* + 把Date对象转换成String +*/ +public class Demo03DateFormatMethod { + public static void main(String[] args) { + Date date = new Date(); + // 创建日期格式化对象,在获取格式化对象时可以指定风格 + DateFormat df = new SimpleDateFormat("yyyy年MM月dd日"); + String str = df.format(date); + System.out.println(str); // 2008年1月23日 + } +} +``` + +##### parse方法 + +使用parse方法的代码为: + +```java +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +/* + 把String转换成Date对象 +*/ +public class Demo04DateFormatMethod { + public static void main(String[] args) throws ParseException { + DateFormat df = new SimpleDateFormat("yyyy年MM月dd日"); + String str = "2018年12月11日"; + Date date = df.parse(str); + System.out.println(date); // Tue Dec 11 00:00:00 CST 2018 + } +} +``` + +### 2.3 练习 + +请使用日期时间相关的API,计算出一个人已经出生了多少天。 + +**思路:** + +1.获取当前时间对应的毫秒值 + +2.获取自己出生日期对应的毫秒值 + +3.两个时间相减(当前时间– 出生日期) + +**代码实现:** + +```java +public static void function() throws Exception { + System.out.println("请输入出生日期 格式 YYYY-MM-dd"); + // 获取出生日期,键盘输入 + String birthdayString = new Scanner(System.in).next(); + // 将字符串日期,转成Date对象 + // 创建SimpleDateFormat对象,写日期模式 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 调用方法parse,字符串转成日期对象 + Date birthdayDate = sdf.parse(birthdayString); + // 获取今天的日期对象 + Date todayDate = new Date(); + // 将两个日期转成毫秒值,Date类的方法getTime + long birthdaySecond = birthdayDate.getTime(); + long todaySecond = todayDate.getTime(); + long secone = todaySecond-birthdaySecond; + if (secone < 0){ + System.out.println("还没出生呢"); + } else { + System.out.println(secone/1000/60/60/24); + } +} +``` + +### 2.4 Calendar类 + +#### 概念 + +日历我们都见过 + +![](img\日历.jpg) + +`java.util.Calendar`是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。 + +#### 获取方式 + +Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下: + +Calendar静态方法 + +* `public static Calendar getInstance()`:使用默认时区和语言环境获得一个日历 + +例如: + +```java +import java.util.Calendar; + +public class Demo06CalendarInit { + public static void main(String[] args) { + Calendar cal = Calendar.getInstance(); + } +} +``` + +#### 常用方法 + +根据Calendar类的API文档,常用方法有: + +- `public abstract void add(int field, int amount)`:根据日历的规则,为给定的日历字段添加或减去指定的时间量。 +- `public void set(int field, int value)`:将给定的日历字段设置为给定值。 +- `public int get(int field)`:返回给定日历字段的值。 +- `public Date getTime()`:返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。 + +Calendar类中提供很多成员常量,代表给定的日历字段: + +| 字段值 | 含义 | +| ------------ | -------------------- | +| YEAR | 年 | +| MONTH | 月(从0开始,可以+1使用) | +| DAY_OF_MONTH | 月中的天(几号) | +| HOUR | 时(12小时制) | +| HOUR_OF_DAY | 时(24小时制) | +| MINUTE | 分 | +| SECOND | 秒 | +| DAY_OF_WEEK | 周中的天(周几,周日为1,可以-1使用) | + +##### get/set方法 + +get方法用来获取指定字段的值,set方法用来设置指定字段的值,代码使用演示: + +```java +import java.util.Calendar; + +public class CalendarUtil { + public static void main(String[] args) { + // 创建Calendar对象 + Calendar cal = Calendar.getInstance(); + // 设置年 + int year = cal.get(Calendar.YEAR); + // 设置月 + int month = cal.get(Calendar.MONTH) + 1; + // 设置日 + int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); + System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); + } +} +``` + +```java +import java.util.Calendar; + +public class Demo07CalendarMethod { + public static void main(String[] args) { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, 2020); + System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2020年1月17日 + } +} +``` + +##### add方法 + +add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量。代码如: + +```java +import java.util.Calendar; + +public class Demo08CalendarMethod { + public static void main(String[] args) { + Calendar cal = Calendar.getInstance(); + System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2018年1月17日 + // 使用add方法 + cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天 + cal.add(Calendar.YEAR, -3); // 减3年 + System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2015年1月18日; + } +} +``` + +##### getTime方法 + +Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。 + +```java +import java.util.Calendar; +import java.util.Date; + +public class Demo09CalendarMethod { + public static void main(String[] args) { + Calendar cal = Calendar.getInstance(); + Date date = cal.getTime(); + System.out.println(date); // Tue Jan 16 16:03:09 CST 2018 + } +} +``` + +> 小贴士: +> +> ​ 西方星期的开始为周日,中国为周一。 +> +> ​ 在Calendar类中,月份的表示是以0-11代表1-12月。 +> +> ​ 日期是有大小关系的,时间靠后,时间越大。 +> + +## 第三章 System类 + +`java.lang.System`类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作,在System类的API文档中,常用的方法有: + +- `public static long currentTimeMillis()`:返回以毫秒为单位的当前时间。 +- `public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)`:将数组中指定的数据拷贝到另一个数组中。 + +### 3.1 currentTimeMillis方法 + +实际上,currentTimeMillis方法就是 获取当前系统时间与1970年01月01日00:00点之间的毫秒差值 + +```java +import java.util.Date; + +public class SystemDemo { + public static void main(String[] args) { + //获取当前时间毫秒值 + System.out.println(System.currentTimeMillis()); // 1516090531144 + } +} +``` + +#### 练习 + +验证for循环打印数字1-9999所需要使用的时间(毫秒) + +~~~java +public class SystemTest1 { + public static void main(String[] args) { + long start = System.currentTimeMillis(); + for (int i = 0; i < 10000; i++) { + System.out.println(i); + } + long end = System.currentTimeMillis(); + System.out.println("共耗时毫秒:" + (end - start)); + } +} +~~~ + +### 3.2 arraycopy方法 + +* `public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)`:将数组中指定的数据拷贝到另一个数组中。 + +数组的拷贝动作是系统级的,性能很高。System.arraycopy方法具有5个参数,含义分别为: + +| 参数序号 | 参数名称 | 参数类型 | 参数含义 | +| ---- | ------- | ------ | ---------- | +| 1 | src | Object | 源数组 | +| 2 | srcPos | int | 源数组索引起始位置 | +| 3 | dest | Object | 目标数组 | +| 4 | destPos | int | 目标数组索引起始位置 | +| 5 | length | int | 复制元素个数 | + +#### 练习 + +将src数组中前3个元素,复制到dest数组的前3个位置上复制元素前:src数组元素[1,2,3,4,5],dest数组元素[6,7,8,9,10]复制元素后:src数组元素[1,2,3,4,5],dest数组元素[1,2,3,9,10] + +```java +import java.util.Arrays; + +public class Demo11SystemArrayCopy { + public static void main(String[] args) { + int[] src = new int[]{1,2,3,4,5}; + int[] dest = new int[]{6,7,8,9,10}; + System.arraycopy( src, 0, dest, 0, 3); + /*代码运行后:两个数组中的元素发生了变化 + src数组元素[1,2,3,4,5] + dest数组元素[1,2,3,9,10] + */ + } +} +``` + + + +## 第四章 包装类 + +### 4.1 概述 + +Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下: + +| 基本类型 | 对应的包装类(位于java.lang包中) | +| ------- | --------------------- | +| byte | Byte | +| short | Short | +| int | **Integer** | +| long | Long | +| float | Float | +| double | Double | +| char | **Character** | +| boolean | Boolean | + +### 4.2 装箱与拆箱 + +基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“: + +* **装箱**:从基本类型转换为对应的包装类对象。 + +* **拆箱**:从包装类对象转换为对应的基本类型。 + +用Integer与 int为例:(看懂代码即可) + +基本数值---->包装对象 + +~~~java +Integer i = new Integer(4);//使用构造函数函数 +Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法 +~~~ + +包装对象---->基本数值 + +~~~java +int num = i.intValue(); +~~~ +### 4.3自动装箱与自动拆箱 + +由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如: + +```java +Integer i = 4;//自动装箱。相当于Integer i = Integer.valueOf(4); +i = i + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5; +//加法运算完成后,再次装箱,把基本数值转成对象。 +``` + +### 4.4 基本类型与字符串之间的转换 + +#### 基本类型转换为String + + 基本类型转换String总共有三种方式,查看课后资料可以得知,这里只讲最简单的一种方式: + +~~~ +基本类型直接与””相连接即可;如:34+"" +~~~ + +String转换成对应的基本类型 + +除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型: + +- `public static byte parseByte(String s)`:将字符串参数转换为对应的byte基本类型。 +- `public static short parseShort(String s)`:将字符串参数转换为对应的short基本类型。 +- `public static int parseInt(String s)`:将字符串参数转换为对应的int基本类型。 +- `public static long parseLong(String s)`:将字符串参数转换为对应的long基本类型。 +- `public static float parseFloat(String s)`:将字符串参数转换为对应的float基本类型。 +- `public static double parseDouble(String s)`:将字符串参数转换为对应的double基本类型。 +- `public static boolean parseBoolean(String s)`:将字符串参数转换为对应的boolean基本类型。 + +代码使用(仅以Integer类的静态方法parseXxx为例)如: + +```java +public class Demo18WrapperParse { + public static void main(String[] args) { + int num = Integer.parseInt("100"); + } +} +``` + +> 注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出`java.lang.NumberFormatException`异常。 +> + diff --git a/javaSE2/day01/img/06-StringBuilder的原理.png b/javaSE2/day01/img/06-StringBuilder的原理.png new file mode 100644 index 0000000..5fdbadb Binary files /dev/null and b/javaSE2/day01/img/06-StringBuilder的原理.png differ diff --git a/javaSE2/day01/img/44.png b/javaSE2/day01/img/44.png new file mode 100644 index 0000000..40f7a3b Binary files /dev/null and b/javaSE2/day01/img/44.png differ diff --git a/javaSE2/day01/img/String拼接问题.bmp b/javaSE2/day01/img/String拼接问题.bmp new file mode 100644 index 0000000..c80bc27 Binary files /dev/null and b/javaSE2/day01/img/String拼接问题.bmp differ diff --git a/javaSE2/day01/img/equals方法1.png b/javaSE2/day01/img/equals方法1.png new file mode 100644 index 0000000..b6211ae Binary files /dev/null and b/javaSE2/day01/img/equals方法1.png differ diff --git a/javaSE2/day01/img/equals方法2.png b/javaSE2/day01/img/equals方法2.png new file mode 100644 index 0000000..792de22 Binary files /dev/null and b/javaSE2/day01/img/equals方法2.png differ diff --git a/javaSE2/day01/img/equals方法3.png b/javaSE2/day01/img/equals方法3.png new file mode 100644 index 0000000..3dfa5f0 Binary files /dev/null and b/javaSE2/day01/img/equals方法3.png differ diff --git a/javaSE2/day01/img/system两个方法.bmp b/javaSE2/day01/img/system两个方法.bmp new file mode 100644 index 0000000..7545a31 Binary files /dev/null and b/javaSE2/day01/img/system两个方法.bmp differ diff --git a/javaSE2/day01/img/toString方法的自动重写.bmp b/javaSE2/day01/img/toString方法的自动重写.bmp new file mode 100644 index 0000000..0f9b05c Binary files /dev/null and b/javaSE2/day01/img/toString方法的自动重写.bmp differ diff --git a/javaSE2/day01/img/日历.jpg b/javaSE2/day01/img/日历.jpg new file mode 100644 index 0000000..c10f92b Binary files /dev/null and b/javaSE2/day01/img/日历.jpg differ diff --git a/javaSE2/day02/day02【Collection、泛型】.md b/javaSE2/day02/day02【Collection、泛型】.md new file mode 100644 index 0000000..3ce0188 --- /dev/null +++ b/javaSE2/day02/day02【Collection、泛型】.md @@ -0,0 +1,664 @@ +# day02【Collection、泛型】 + +### 主要内容 + +- Collection集合 +- 迭代器 +- 增强for +- 泛型 + +### 教学目标 + +- [ ] 能够说出集合与数组的区别 +- [ ] 说出Collection集合的常用功能 +- [ ] 能够使用迭代器对集合进行取元素 +- [ ] 能够说出集合的使用细节 +- [ ] 能够使用集合存储自定义类型 +- [ ] 能够使用foreach循环遍历集合 +- [ ] 能够使用泛型定义集合对象 +- [ ] 能够理解泛型上下限 +- [ ] 能够阐述泛型通配符的作用 + + + +## 第一章 Collection集合 + +### 1.1 集合概述 + +在前面基础班我们已经学习过并使用过集合ArrayList\ ,那么集合到底是什么呢? + +* **集合**:集合是java中提供的一种容器,可以用来存储多个数据。 + +集合和数组既然都是容器,它们有啥区别呢? + +* 数组的长度是固定的。集合的长度是可变的。 +* 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。 + +### 1.2 集合框架 + +JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。 + +集合按照其存储结构可以分为两大类,分别是单列集合`java.util.Collection`和双列集合`java.util.Map`,今天我们主要学习`Collection`集合,在day04时讲解`Map`集合。 + +* **Collection**:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是`java.util.List`和`java.util.Set`。其中,`List`的特点是元素有序、元素可重复。`Set`的特点是元素无序,而且不可重复。`List`接口的主要实现类有`java.util.ArrayList`和`java.util.LinkedList`,`Set`接口的主要实现类有`java.util.HashSet`和`java.util.TreeSet`。 + +从上面的描述可以看出JDK中提供了丰富的集合类库,为了便于初学者进行系统地学习,接下来通过一张图来描述整个集合类的继承体系。 + +![](img\Collection集合体系图.png) + +其中,橙色框里填写的都是接口类型,而蓝色框里填写的都是具体的实现类。这几天将针对图中所列举的集合类进行逐一地讲解。 + +集合本身是一个工具,它存放在java.util包中。在`Collection`接口定义着单列集合框架中最最共性的内容。 + +### 1.3 Collection 常用功能 + +Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下: + +* `public boolean add(E e)`: 把给定的对象添加到当前集合中 。 +* `public void clear()` :清空集合中所有的元素。 +* `public boolean remove(E e)`: 把给定的对象在当前集合中删除。 +* `public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。 +* `public boolean isEmpty()`: 判断当前集合是否为空。 +* `public int size()`: 返回集合中元素的个数。 +* `public Object[] toArray()`: 把集合中的元素,存储到数组中。 + +方法演示: + +~~~java +import java.util.ArrayList; +import java.util.Collection; + +public class Demo1Collection { + public static void main(String[] args) { + // 创建集合对象 + // 使用多态形式 + Collection coll = new ArrayList(); + // 使用方法 + // 添加功能 boolean add(String s) + coll.add("小李广"); + coll.add("扫地僧"); + coll.add("石破天"); + System.out.println(coll); + + // boolean contains(E e) 判断o是否在集合中存在 + System.out.println("判断 扫地僧 是否在集合中"+coll.contains("扫地僧")); + + //boolean remove(E e) 删除在集合中的o元素 + System.out.println("删除石破天:"+coll.remove("石破天")); + System.out.println("操作之后集合中元素:"+coll); + + // size() 集合中有几个元素 + System.out.println("集合中有"+coll.size()+"个元素"); + + // Object[] toArray()转换成一个Object数组 + Object[] objects = coll.toArray(); + // 遍历数组 + for (int i = 0; i < objects.length; i++) { + System.out.println(objects[i]); + } + + // void clear() 清空集合 + coll.clear(); + System.out.println("集合中内容为:"+coll); + // boolean isEmpty() 判断是否为空 + System.out.println(coll.isEmpty()); + } +} +~~~ + +> tips: 有关Collection中的方法可不止上面这些,其他方法可以自行查看API学习。 + +## 第二章 Iterator迭代器 + +### 2.1 Iterator接口 + +在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口`java.util.Iterator`。`Iterator`接口也是Java集合中的一员,但它与`Collection`、`Map`接口有所不同,`Collection`接口与`Map`接口主要用于存储元素,而`Iterator`主要用于迭代访问(即遍历)`Collection`中的元素,因此`Iterator`对象也被称为迭代器。 + +想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法: + +* `public Iterator iterator()`: 获取集合对应的迭代器,用来遍历集合中的元素的。 + +下面介绍一下迭代的概念: + +* **迭代**:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。 + +Iterator接口的常用方法如下: + +* `public E next()`:返回迭代的下一个元素。 +* `public boolean hasNext()`:如果仍有元素可以迭代,则返回 true。 + +接下来我们通过案例学习如何使用Iterator迭代集合中元素: + +~~~java +public class IteratorDemo { + public static void main(String[] args) { + // 使用多态方式 创建对象 + Collection coll = new ArrayList(); + + // 添加元素到集合 + coll.add("串串星人"); + coll.add("吐槽星人"); + coll.add("汪星人"); + //遍历 + //使用迭代器 遍历 每个集合对象都有自己的迭代器 + Iterator it = coll.iterator(); + // 泛型指的是 迭代出 元素的数据类型 + while(it.hasNext()){ //判断是否有迭代元素 + String s = it.next();//获取迭代出的元素 + System.out.println(s); + } + } +} +~~~ + +> tips::在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。 + +### 2.2 迭代器的实现原理 + +我们在之前案例已经完成了Iterator遍历集合的整个过程。当遍历集合时,首先通过调用t集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。 + +Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程: + +![](img\迭代器原理图.bmp) + +在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。 + +### 2.3 增强for + +增强for循环(也称for each循环)是**JDK1.5**以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。 + +格式: + +~~~java +for(元素的数据类型 变量 : Collection集合or数组){ + //写操作代码 +} +~~~ + +它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。 + +##### 练习1:遍历数组 + +~~~java +public class NBForDemo1 { + public static void main(String[] args) { + int[] arr = {3,5,6,87}; + //使用增强for遍历数组 + for(int a : arr){//a代表数组中的每个元素 + System.out.println(a); + } + + Collection coll = new ArrayList(); + coll.add("小河神"); + coll.add("老河神"); + coll.add("神婆"); + + for(String s :coll){ + System.out.println(s); + } + } +} +~~~ + +##### 练习2:遍历集合 + +~~~java +public class NBFor { + public static void main(String[] args) { + Collection coll = new ArrayList(); + coll.add("小河神"); + coll.add("老河神"); + coll.add("神婆"); + //使用增强for遍历 + for(String s :coll){//接收变量s代表 代表被遍历到的集合元素 + System.out.println(s); + } + } +} +~~~ + +> tips: 新for循环必须有被遍历的目标。目标只能是Collection或者是数组。新式for仅仅作为遍历操作出现。 + +## 第三章 泛型 + +### 3.1 泛型概述 + +在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。 + +大家观察下面代码: + +~~~java +public class GenericDemo { + public static void main(String[] args) { + Collection coll = new ArrayList(); + coll.add("abc"); + coll.add("itcast"); + coll.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放 + Iterator it = coll.iterator(); + while(it.hasNext()){ + //需要打印每个字符串的长度,就要把迭代出来的对象转成String类型 + String str = (String) it.next(); + System.out.println(str.length()); + } + } +} +~~~ + +程序在运行时发生了问题**java.lang.ClassCastException**。为什么会发生类型转换异常呢? 我们来分析下:由于集合中什么类型的元素都可以存储。导致取出时强转引发运行时 ClassCastException。 怎么来解决这个问题呢? Collection虽然可以存储各种对象,但实际上通常Collection只存储同一类型对象。例如都是存储字符串对象。因此在JDK5之后,新增了**泛型**(**Generic**)语法,让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。 + +* **泛型**:可以在类或方法中预支地使用未知的类型。 + +> tips:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。 + +### 3.2 使用泛型的好处 + +上一节只是讲解了泛型的引入,那么泛型带来了哪些好处呢? + +* 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。 +* 避免了类型强转的麻烦。 + +通过我们如下代码体验一下: + +~~~java +public class GenericDemo2 { + public static void main(String[] args) { + Collection list = new ArrayList(); + list.add("abc"); + list.add("itcast"); + // list.add(5);//当集合明确类型后,存放类型不一致就会编译报错 + // 集合已经明确具体存放的元素类型,那么在使用迭代器的时候,迭代器也同样会知道具体遍历元素类型 + Iterator it = list.iterator(); + while(it.hasNext()){ + String str = it.next(); + //当使用Iterator控制元素类型后,就不需要强转了。获取到的元素直接就是String类型 + System.out.println(str.length()); + } + } +} +~~~ + +> tips:泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。 + +### 3.3 泛型的定义与使用 + +我们在集合中会大量使用到泛型,这里来完整地学习泛型知识。 + +泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。 + +#### 定义和使用含有泛型的类 + +定义格式: + +~~~ +修饰符 class 类名\<代表泛型的变量> { } +~~~ + +例如,API中的ArrayList集合: + +~~~java +class ArrayList{ + public boolean add(E e){ } + + public E get(int index){ } + .... +} +~~~ + +使用泛型: 即什么时候确定泛型。 + +**在创建对象的时候确定泛型** + + 例如,`ArrayList list = new ArrayList();` + +此时,变量E的值就是String类型,那么我们的类型就可以理解为: + +~~~java +class ArrayList{ + public boolean add(String e){ } + + public String get(int index){ } + ... +} +~~~ + +再例如,`ArrayList list = new ArrayList();` + +此时,变量E的值就是Integer类型,那么我们的类型就可以理解为: + +~~~java +class ArrayList { + public boolean add(Integer e) { } + + public Integer get(int index) { } + ... +} +~~~ + +举例自定义泛型类 + +~~~java +public class MyGenericClass { + //没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型 + private MVP mvp; + + public void setMVP(MVP mvp) { + this.mvp = mvp; + } + + public MVP getMVP() { + return mvp; + } +} +~~~ + +使用: + +~~~java +public class GenericClassDemo { + public static void main(String[] args) { + // 创建一个泛型为String的类 + MyGenericClass my = new MyGenericClass(); + // 调用setMVP + my.setMVP("大胡子登登"); + // 调用getMVP + String mvp = my.getMVP(); + System.out.println(mvp); + //创建一个泛型为Integer的类 + MyGenericClass my2 = new MyGenericClass(); + my2.setMVP(123); + Integer mvp2 = my2.getMVP(); + } +} +~~~ + +#### 含有泛型的方法 + +定义格式: + +~~~ +修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ } +~~~ + +例如, + +~~~java +public class MyGenericMethod { + public void show(MVP mvp) { + System.out.println(mvp.getClass()); + } + + public MVP show2(MVP mvp) { + return mvp; + } +} +~~~ + +使用格式:**调用方法时,确定泛型的类型** + +~~~java +public class GenericMethodDemo { + public static void main(String[] args) { + // 创建对象 + MyGenericMethod mm = new MyGenericMethod(); + // 演示看方法提示 + mm.show("aaa"); + mm.show(123); + mm.show(12.45); + } +} +~~~ + +#### 含有泛型的接口 + +定义格式: + +~~~ +修饰符 interface接口名<代表泛型的变量> { } +~~~ + +例如, + +~~~java +public interface MyGenericInterface{ + public abstract void add(E e); + + public abstract E getE(); +} +~~~ + +使用格式: + +**1、定义类时确定泛型的类型** + +例如 + +~~~java +public class MyImp1 implements MyGenericInterface { + @Override + public void add(String e) { + // 省略... + } + + @Override + public String getE() { + return null; + } +} +~~~ + +此时,泛型E的值就是String类型。 + + **2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型** + + 例如 + +~~~java +public class MyImp2 implements MyGenericInterface { + @Override + public void add(E e) { + // 省略... + } + + @Override + public E getE() { + return null; + } +} +~~~ + +确定泛型: + +~~~java +/* + * 使用 + */ +public class GenericInterface { + public static void main(String[] args) { + MyImp2 my = new MyImp2(); + my.add("aa"); + } +} +~~~ + +### 3.4 泛型通配符 + +当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符\表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。 + +##### 通配符基本使用 + +泛型的通配符:**不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。** + +此时只能接受数据,不能往该集合中存储数据。 + +举个例子大家理解使用即可: + +~~~java +public static void main(String[] args) { + Collection list1 = new ArrayList(); + getElement(list1); + Collection list2 = new ArrayList(); + getElement(list2); +} +public static void getElement(Collection coll){} +//?代表可以接收任意类型 +~~~ + +> tips:泛型不存在继承关系 Collection\ list = new ArrayList\();这种是错误的。 + +##### 通配符高级使用----受限泛型 + +之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的**上限**和**下限**。 + +**泛型的上限**: + +* **格式**: `类型名称 对象名称` +* **意义**: `只能接收该类型及其子类` + +**泛型的下限**: + +- **格式**: `类型名称 对象名称` +- **意义**: `只能接收该类型及其父类型` + +比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类 + +~~~java +public static void main(String[] args) { + Collection list1 = new ArrayList(); + Collection list2 = new ArrayList(); + Collection list3 = new ArrayList(); + Collection list4 = new ArrayList(); + + getElement(list1); + getElement(list2);//报错 + getElement(list3); + getElement(list4);//报错 + + getElement2(list1);//报错 + getElement2(list2);//报错 + getElement2(list3); + getElement2(list4); + +} +// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类 +public static void getElement1(Collection coll){} +// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类 +public static void getElement2(Collection coll){} +~~~ + +## 第四章 集合综合案例 + +### 4.1 案例介绍 + +按照斗地主的规则,完成洗牌发牌的动作。 +具体规则: + +使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。 + +### 4.2 案例分析 + +* 准备牌: + + 牌可以设计为一个ArrayList\,每个字符串为一张牌。 + 每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。 + 牌由Collections类的shuffle方法进行随机排序。 + +* 发牌 + + 将每个人以及底牌设计为ArrayList\,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。 + + +* 看牌 + + 直接打印每个集合。 + +### 4.3 代码实现 + +~~~java +import java.util.ArrayList; +import java.util.Collections; + +public class Poker { + public static void main(String[] args) { + /* + * 1: 准备牌操作 + */ + //1.1 创建牌盒 将来存储牌面的 + ArrayList pokerBox = new ArrayList(); + //1.2 创建花色集合 + ArrayList colors = new ArrayList(); + + //1.3 创建数字集合 + ArrayList numbers = new ArrayList(); + + //1.4 分别给花色 以及 数字集合添加元素 + colors.add("♥"); + colors.add("♦"); + colors.add("♠"); + colors.add("♣"); + + for(int i = 2;i<=10;i++){ + numbers.add(i+""); + } + numbers.add("J"); + numbers.add("Q"); + numbers.add("K"); + numbers.add("A"); + //1.5 创造牌 拼接牌操作 + // 拿出每一个花色 然后跟每一个数字 进行结合 存储到牌盒中 + for (String color : colors) { + //color每一个花色 + //遍历数字集合 + for(String number : numbers){ + //结合 + String card = color+number; + //存储到牌盒中 + pokerBox.add(card); + } + } + //1.6大王小王 + pokerBox.add("小☺"); + pokerBox.add("大☠"); + // System.out.println(pokerBox); + //洗牌 是不是就是将 牌盒中 牌的索引打乱 + // Collections类 工具类 都是 静态方法 + // shuffer方法 + /* + * static void shuffle(List list) + * 使用默认随机源对指定列表进行置换。 + */ + //2:洗牌 + Collections.shuffle(pokerBox); + //3 发牌 + //3.1 创建 三个 玩家集合 创建一个底牌集合 + ArrayList player1 = new ArrayList(); + ArrayList player2 = new ArrayList(); + ArrayList player3 = new ArrayList(); + ArrayList dipai = new ArrayList(); + + //遍历 牌盒 必须知道索引 + for(int i = 0;i=51){//存到底牌集合中 + dipai.add(card); + } else { + //玩家1 %3 ==0 + if(i%3==0){ + player1.add(card); + }else if(i%3==1){//玩家2 + player2.add(card); + }else{//玩家3 + player3.add(card); + } + } + } + //看看 + System.out.println("令狐冲:"+player1); + System.out.println("田伯光:"+player2); + System.out.println("绿竹翁:"+player3); + System.out.println("底牌:"+dipai); + } +} +~~~ + diff --git a/javaSE2/day02/img/Collection集合体系图.png b/javaSE2/day02/img/Collection集合体系图.png new file mode 100644 index 0000000..83650e2 Binary files /dev/null and b/javaSE2/day02/img/Collection集合体系图.png differ diff --git a/javaSE2/day02/img/双向链表(1).png b/javaSE2/day02/img/双向链表(1).png new file mode 100644 index 0000000..74dd944 Binary files /dev/null and b/javaSE2/day02/img/双向链表(1).png differ diff --git a/javaSE2/day02/img/迭代器原理图.bmp b/javaSE2/day02/img/迭代器原理图.bmp new file mode 100644 index 0000000..5525c69 Binary files /dev/null and b/javaSE2/day02/img/迭代器原理图.bmp differ diff --git a/javaSE2/day03/day03【List、Set】.md b/javaSE2/day03/day03【List、Set】.md new file mode 100644 index 0000000..4188349 --- /dev/null +++ b/javaSE2/day03/day03【List、Set】.md @@ -0,0 +1,712 @@ +# day03 【List、Set、数据结构、Collections】 + +### 主要内容 + +- List集合 +- Set集合 +- 数据结构 + +### 教学目标 + +- [ ] 能够说出List集合特点 +- [ ] 能够说出常见的数据结构 +- [ ] 能够说出数组结构特点 +- [ ] 能够说出栈结构特点 +- [ ] 能够说出队列结构特点 +- [ ] 能够说出单向链表结构特点 +- [ ] 能够说出Set集合的特点 +- [ ] 能够说出哈希表的特点 +- [ ] 使用HashSet集合存储自定义元素 +- [ ] 能够说出可变参数的格式 +- [ ] 能够使用集合工具类 +- [ ] 能够使用Comparator比较器进行排序 + +## 第一章 List集合 + +我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢? + +接下来,我们一起学习Collection中的常用几个子类(`java.util.List`集合、`java.util.Set`集合)。 + +### 1.1 List接口介绍 + +`java.util.List`接口继承自`Collection`接口,是单列集合的一个重要分支,习惯性地会将实现了`List`接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。 + +看完API,我们总结一下: + +List接口特点: + +1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。 +2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。 +3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。 + +> tips:我们在基础班的时候已经学习过List接口的子类java.util.ArrayList类,该类中的方法都是来自List中定义。 + +### 1.2 List接口中常用方法 + +List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下: + +* `public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。 +* `public E get(int index)`:返回集合中指定位置的元素。 +* `public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。 +* `public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。 + +List集合特有的方法都是跟索引相关,我们在基础班都学习过,那么我们再来复习一遍吧: + +~~~java +public class ListDemo { + public static void main(String[] args) { + // 创建List集合对象 + List list = new ArrayList(); + + // 往 尾部添加 指定元素 + list.add("图图"); + list.add("小美"); + list.add("不高兴"); + + System.out.println(list); + // add(int index,String s) 往指定位置添加 + list.add(1,"没头脑"); + + System.out.println(list); + // String remove(int index) 删除指定位置元素 返回被删除元素 + // 删除索引位置为2的元素 + System.out.println("删除索引位置为2的元素"); + System.out.println(list.remove(2)); + + System.out.println(list); + + // String set(int index,String s) + // 在指定位置 进行 元素替代(改) + // 修改指定位置元素 + list.set(0, "三毛"); + System.out.println(list); + + // String get(int index) 获取指定位置元素 + + // 跟size() 方法一起用 来 遍历的 + for(int i = 0;i tips:我们之前学习Colletion体系的时候,发现List集合下有很多集合,它们的存储结构不同,这样就导致了这些集合它们有各自的特点,供我们在不同的环境下使用,那么常见的数据结构有哪些呢?在下一章我们来介绍: + +## 第二章 数据结构 + +### 2.1 数据结构有什么用? + +当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。 + +现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。 + +我们java是面向对象的语言,就好似自动档轿车,C语言好似手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A点 开到 B点,而且未必就比懂得的人慢。写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。当然了,数据结构内容比较多,细细的学起来也是相对费功夫的,不可能达到一蹴而就。我们将常见的数据结构:堆栈、队列、数组、链表和红黑树 这几种给大家介绍一下,作为数据结构的入门,了解一下它们的特点即可。 + +![](img\数据结构比喻.png) + +### 2.2 常见的数据结构 + +数据存储的常用结构有:栈、队列、数组、链表和红黑树。我们分别来了解一下: + +##### 栈 + +* **栈**:**stack**,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 + +简单的说:采用该结构的集合,对元素的存取有如下的特点 + +* 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。 + +* 栈的入口、出口的都是栈的顶端位置。 + + ![](img\堆栈.png) + +这里两个名词需要注意: + +* **压栈**:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。 +* **弹栈**:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。 + + +##### 队列 + +* **队列**:**queue**,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。 + +简单的说,采用该结构的集合,对元素的存取有如下的特点: + +* 先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,小火车过山洞,车头先进去,车尾后进去;车头先出来,车尾后出来。 +* 队列的入口、出口各占一侧。例如,下图中的左侧为入口,右侧为出口。 + +![](img\队列图.bmp) + +##### 数组 + +* **数组**:**Array**,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。 + +简单的说,采用该结构的集合,对元素的存取有如下的特点: + +* 查找元素快:通过索引,可以快速访问指定位置的元素 + + ![](img/数组查询快.png) + +* 增删元素慢 + * **指定索引位置增加元素**:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。如下图![](img/数组添加.png) + * **指定索引位置删除元素:**需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。如下图![](img/数组删除.png) + + + +##### 链表 + +* **链表**:**linked list**,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。我们常说的链表结构有单向链表与双向链表,那么这里给大家介绍的是**单向链表**。 + + ![](img\单链表结构特点.png) + +简单的说,采用该结构的集合,对元素的存取有如下的特点: + +* 多个结点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了。 + + ![](img\单链表结构.png) + +* 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素 + +* 增删元素快: + + * 增加元素:只需要修改连接下个元素的地址即可。 + + ![](img\增加结点.png) + + * 删除元素:只需要修改连接下个元素的地址即可。 + + ![](img\删除结点.bmp) + +##### 红黑树 + +* **二叉树**:**binary tree** ,是每个结点不超过2的有序**树(tree)** 。 + +简单的理解,就是一种类似于我们生活中树的结构,只不过每个结点上都最多只能有两个子结点。 + +二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。 + +如图: + +![](img\二叉树.bmp) + +我们要说的是二叉树的一种比较有意思的叫做**红黑树**,红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。 + +## 第三章 List的子类 + +### 3.1 ArrayList集合 + +`java.util.ArrayList`集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以`ArrayList`是最常用的集合。 + +许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。 + +### 3.2 LinkedList集合 + +`java.util.LinkedList`集合数据存储的结构是链表结构。方便元素添加、删除的集合。 + +> LinkedList是一个双向链表,那么双向链表是什么样子的呢,我们用个图了解下 + +![](img\双向链表.png) + +实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方法我们作为了解即可: + +* `public void addFirst(E e)`:将指定元素插入此列表的开头。 +* `public void addLast(E e)`:将指定元素添加到此列表的结尾。 +* `public E getFirst()`:返回此列表的第一个元素。 +* `public E getLast()`:返回此列表的最后一个元素。 +* `public E removeFirst()`:移除并返回此列表的第一个元素。 +* `public E removeLast()`:移除并返回此列表的最后一个元素。 +* `public E pop()`:从此列表所表示的堆栈处弹出一个元素。 +* `public void push(E e)`:将元素推入此列表所表示的堆栈。 +* `public boolean isEmpty()`:如果列表不包含元素,则返回true。 + +LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可) + +方法演示: + +~~~java +public class LinkedListDemo { + public static void main(String[] args) { + LinkedList link = new LinkedList(); + //添加元素 + link.addFirst("abc1"); + link.addFirst("abc2"); + link.addFirst("abc3"); + System.out.println(link); + // 获取元素 + System.out.println(link.getFirst()); + System.out.println(link.getLast()); + // 删除元素 + System.out.println(link.removeFirst()); + System.out.println(link.removeLast()); + + while (!link.isEmpty()) { //判断集合是否为空 + System.out.println(link.pop()); //弹出集合中的栈顶元素 + } + + System.out.println(link); + } +} +~~~ + +## 第四章 Set接口 + +`java.util.Set`接口和`java.util.List`接口一样,同样继承自`Collection`接口,它与`Collection`接口中的方法基本一致,并没有对`Collection`接口进行功能上的扩充,只是比`Collection`接口更加严格了。与`List`接口不同的是,`Set`接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。 + +`Set`集合有多个子类,这里我们介绍其中的`java.util.HashSet`、`java.util.LinkedHashSet`这两个集合。 + +> tips:Set集合取出元素的方式可以采用:迭代器、增强for。 + +### 4.1 HashSet集合介绍 + +`java.util.HashSet`是`Set`接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。`java.util.HashSet`底层的实现其实是一个`java.util.HashMap`支持,由于我们暂时还未学习,先做了解。 + +`HashSet`是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:`hashCode`与`equals`方法。 + +我们先来使用一下Set集合存储,看下现象,再进行原理的讲解: + +~~~java +public class HashSetDemo { + public static void main(String[] args) { + //创建 Set集合 + HashSet set = new HashSet(); + + //添加元素 + set.add(new String("cba")); + set.add("abc"); + set.add("bac"); + set.add("cba"); + //遍历 + for (String name : set) { + System.out.println(name); + } + } +} +~~~ + +输出结果如下,说明集合中不能存储重复元素: + +~~~ +cba +abc +bac +~~~ + +> tips:根据结果我们发现字符串"cba"只存储了一个,也就是说重复的元素set集合不存储。 + +### 4.2 HashSet集合存储数据的结构(哈希表) + +什么是哈希表呢? + +在**JDK1.8**之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。 + +简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。![](img\哈希表.png) + +看到这张图就有人要问了,这个是怎么存储的呢? + +为了方便大家的理解我们结合一个存储流程图来说明一下: + +![](img\哈希流程图.png) + +总而言之,**JDK1.8**引入红黑树大程度优化了HashMap的性能,那么对于我们来讲保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。 + +### 4.3 HashSet存储自定义类型元素 + +给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一 + +创建自定义Student类 + +~~~java +public class Student { + private String name; + private int age; + + public Student() { + } + + public Student(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Student student = (Student) o; + return age == student.age && + Objects.equals(name, student.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, age); + } +} +~~~ + +~~~java +public class HashSetDemo2 { + public static void main(String[] args) { + //创建集合对象 该集合中存储 Student类型对象 + HashSet stuSet = new HashSet(); + //存储 + Student stu = new Student("于谦", 43); + stuSet.add(stu); + stuSet.add(new Student("郭德纲", 44)); + stuSet.add(new Student("于谦", 43)); + stuSet.add(new Student("郭麒麟", 23)); + stuSet.add(stu); + + for (Student stu2 : stuSet) { + System.out.println(stu2); + } + } +} +执行结果: +Student [name=郭德纲, age=44] +Student [name=于谦, age=43] +Student [name=郭麒麟, age=23] +~~~ + +### 4.4 LinkedHashSet + +我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢? + +在HashSet下面有一个子类`java.util.LinkedHashSet`,它是链表和哈希表组合的一个数据存储结构。 + +演示代码如下: + +~~~java +public class LinkedHashSetDemo { + public static void main(String[] args) { + Set set = new LinkedHashSet(); + set.add("bbb"); + set.add("aaa"); + set.add("abc"); + set.add("bbc"); + Iterator it = set.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } +} +结果: + bbb + aaa + abc + bbc +~~~ + +### 4.5 可变参数 + +在**JDK1.5**之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式: + +``` +修饰符 返回值类型 方法名(参数类型... 形参名){ } +``` + +其实这个书写完全等价与 + +``` +修饰符 返回值类型 方法名(参数类型[] 形参名){ } +``` + +只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。 + +**JDK1.5**以后。出现了简化操作。**...** 用在参数上,称之为可变参数。 + +同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组(这就是简单之处),直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动作都在编译.class文件时,自动完成了。 + +代码演示: + +```java +public class ChangeArgs { + public static void main(String[] args) { + int[] arr = { 1, 4, 62, 431, 2 }; + int sum = getSum(arr); + System.out.println(sum); + // 6 7 2 12 2121 + // 求 这几个元素和 6 7 2 12 2121 + int sum2 = getSum(6, 7, 2, 12, 2121); + System.out.println(sum2); + } + + /* + * 完成数组 所有元素的求和 原始写法 + + public static int getSum(int[] arr){ + int sum = 0; + for(int a : arr){ + sum += a; + } + + return sum; + } + */ + //可变参数写法 + public static int getSum(int... arr) { + int sum = 0; + for (int a : arr) { + sum += a; + } + return sum; + } +} +``` + +> tips: 上述add方法在同一个类中,只能存在一个。因为会发生调用的不确定性 +> +> 注意:如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置。 + + + +## 第五章 Collections + +### 5.1 常用功能 + +* `java.utils.Collections`是集合工具类,用来对集合进行操作。部分方法如下: + +- `public static boolean addAll(Collection c, T... elements) `:往集合中添加一些元素。 +- `public static void shuffle(List list) 打乱顺序`:打乱集合顺序。 +- `public static void sort(List list)`:将集合中元素按照默认规则排序。 +- `public static void sort(List list,Comparator )`:将集合中元素按照指定规则排序。 + +代码演示: + +```java +public class CollectionsDemo { + public static void main(String[] args) { + ArrayList list = new ArrayList(); + //原来写法 + //list.add(12); + //list.add(14); + //list.add(15); + //list.add(1000); + //采用工具类 完成 往集合中添加元素 + Collections.addAll(list, 5, 222, 1,2); + System.out.println(list); + //排序方法 + Collections.sort(list); + System.out.println(list); + } +} +结果: +[5, 222, 1, 2] +[1, 2, 5, 222] +``` + +代码演示之后 ,发现我们的集合按照顺序进行了排列,可是这样的顺序是采用默认的顺序,如果想要指定顺序那该怎么办呢? + +我们发现还有个方法没有讲,`public static void sort(List list,Comparator )`:将集合中元素按照指定规则排序。接下来讲解一下指定规则的排列。 + +### 5.2 Comparator比较器 + +我们还是先研究这个方法 + +`public static void sort(List list)`:将集合中元素按照默认规则排序。 + +不过这次存储的是字符串类型。 + +```java +public class CollectionsDemo2 { + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add("cba"); + list.add("aba"); + list.add("sba"); + list.add("nba"); + //排序方法 + Collections.sort(list); + System.out.println(list); + } +} +``` + +结果: + +``` +[aba, cba, nba, sba] +``` + +我们使用的是默认的规则完成字符串的排序,那么默认规则是怎么定义出来的呢? + +说到排序了,简单的说就是两个对象之间比较大小,那么在JAVA中提供了两种比较实现的方式,一种是比较死板的采用`java.lang.Comparable`接口去实现,一种是灵活的当我需要做排序的时候在去选择的`java.util.Comparator`接口完成。 + +那么我们采用的`public static void sort(List list)`这个方法完成的排序,实际上要求了被排序的类型需要实现Comparable接口完成比较的功能,在String类型上如下: + +```java +public final class String implements java.io.Serializable, Comparable, CharSequence { +``` + +String类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我想要字符串按照第一个字符降序排列,那么这样就要修改String的源代码,这是不可能的了,那么这个时候我们可以使用 + +`public static void sort(List list,Comparator )`方法灵活的完成,这个里面就涉及到了Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,比较器具有可比性!顾名思义就是做排序的,通俗地讲需要比较两个对象谁排在前谁排在后,那么比较的方法就是: + +* ` public int compare(String o1, String o2)`:比较其两个参数的顺序。 + + > 两个对象比较的结果有三种:大于,等于,小于。 + > + > 如果要按照升序排序, + > 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数) + > 如果要按照降序排序 + > 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数) + +操作如下: + +```java +public class CollectionsDemo3 { + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add("cba"); + list.add("aba"); + list.add("sba"); + list.add("nba"); + //排序方法 按照第一个单词的降序 + Collections.sort(list, new Comparator() { + @Override + public int compare(String o1, String o2) { + return o2.charAt(0) - o1.charAt(0); + } + }); + System.out.println(list); + } +} +``` + +结果如下: + +``` +[sba, nba, cba, aba] +``` + +### 5.3 简述Comparable和Comparator两个接口的区别。 + +**Comparable**:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。 + +**Comparator**强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。 + +### 5.4 练习 + +创建一个学生类,存储到ArrayList集合中完成指定排序操作。 + +Student 初始类 + +~~~java +public class Student{ + private String name; + private int age; + + public Student() { + } + + public Student(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return "Student{" + + "name='" + name + '\'' + + ", age=" + age + + '}'; + } +} +~~~ + +测试类: + +~~~java +public class Demo { + + public static void main(String[] args) { + // 创建四个学生对象 存储到集合中 + ArrayList list = new ArrayList(); + + list.add(new Student("rose",18)); + list.add(new Student("jack",16)); + list.add(new Student("abc",16)); + list.add(new Student("ace",17)); + list.add(new Student("mark",16)); + + + /* + 让学生 按照年龄排序 升序 + */ +// Collections.sort(list);//要求 该list中元素类型 必须实现比较器Comparable接口 + + + for (Student student : list) { + System.out.println(student); + } + + + } +} +~~~ + +发现,当我们调用Collections.sort()方法的时候 程序报错了。 + +原因:如果想要集合中的元素完成排序,那么必须要实现比较器Comparable接口。 + +于是我们就完成了Student类的一个实现,如下: + +~~~java +public class Student implements Comparable{ + .... + @Override + public int compareTo(Student o) { + return this.age-o.age;//升序 + } +} +~~~ + +再次测试,代码就OK 了效果如下: + +~~~java +Student{name='jack', age=16} +Student{name='abc', age=16} +Student{name='mark', age=16} +Student{name='ace', age=17} +Student{name='rose', age=18} +~~~ + diff --git a/javaSE2/day03/img/mx5发动机.jpg b/javaSE2/day03/img/mx5发动机.jpg new file mode 100644 index 0000000..25e2319 Binary files /dev/null and b/javaSE2/day03/img/mx5发动机.jpg differ diff --git a/javaSE2/day03/img/二叉树.bmp b/javaSE2/day03/img/二叉树.bmp new file mode 100644 index 0000000..9adcd64 Binary files /dev/null and b/javaSE2/day03/img/二叉树.bmp differ diff --git a/javaSE2/day03/img/删除结点.bmp b/javaSE2/day03/img/删除结点.bmp new file mode 100644 index 0000000..524e15e Binary files /dev/null and b/javaSE2/day03/img/删除结点.bmp differ diff --git a/javaSE2/day03/img/单链表结构.png b/javaSE2/day03/img/单链表结构.png new file mode 100644 index 0000000..da203fa Binary files /dev/null and b/javaSE2/day03/img/单链表结构.png differ diff --git a/javaSE2/day03/img/单链表结构特点.png b/javaSE2/day03/img/单链表结构特点.png new file mode 100644 index 0000000..b5ae09b Binary files /dev/null and b/javaSE2/day03/img/单链表结构特点.png differ diff --git a/javaSE2/day03/img/双向链表.png b/javaSE2/day03/img/双向链表.png new file mode 100644 index 0000000..74dd944 Binary files /dev/null and b/javaSE2/day03/img/双向链表.png differ diff --git a/javaSE2/day03/img/哈希流程图.png b/javaSE2/day03/img/哈希流程图.png new file mode 100644 index 0000000..5d3f607 Binary files /dev/null and b/javaSE2/day03/img/哈希流程图.png differ diff --git a/javaSE2/day03/img/哈希表.png b/javaSE2/day03/img/哈希表.png new file mode 100644 index 0000000..a903782 Binary files /dev/null and b/javaSE2/day03/img/哈希表.png differ diff --git a/javaSE2/day03/img/堆栈.png b/javaSE2/day03/img/堆栈.png new file mode 100644 index 0000000..2600982 Binary files /dev/null and b/javaSE2/day03/img/堆栈.png differ diff --git a/javaSE2/day03/img/增加结点.png b/javaSE2/day03/img/增加结点.png new file mode 100644 index 0000000..547db9c Binary files /dev/null and b/javaSE2/day03/img/增加结点.png differ diff --git a/javaSE2/day03/img/数据结构比喻.png b/javaSE2/day03/img/数据结构比喻.png new file mode 100644 index 0000000..677e1f6 Binary files /dev/null and b/javaSE2/day03/img/数据结构比喻.png differ diff --git a/javaSE2/day03/img/数组.png b/javaSE2/day03/img/数组.png new file mode 100644 index 0000000..f639ffc Binary files /dev/null and b/javaSE2/day03/img/数组.png differ diff --git a/javaSE2/day03/img/数组删除.png b/javaSE2/day03/img/数组删除.png new file mode 100644 index 0000000..effa3f2 Binary files /dev/null and b/javaSE2/day03/img/数组删除.png differ diff --git a/javaSE2/day03/img/数组查询快.png b/javaSE2/day03/img/数组查询快.png new file mode 100644 index 0000000..a90b8b6 Binary files /dev/null and b/javaSE2/day03/img/数组查询快.png differ diff --git a/javaSE2/day03/img/数组添加.png b/javaSE2/day03/img/数组添加.png new file mode 100644 index 0000000..0e4a0fe Binary files /dev/null and b/javaSE2/day03/img/数组添加.png differ diff --git a/javaSE2/day03/img/队列.bmp b/javaSE2/day03/img/队列.bmp new file mode 100644 index 0000000..399c6c2 Binary files /dev/null and b/javaSE2/day03/img/队列.bmp differ diff --git a/javaSE2/day03/img/队列图.bmp b/javaSE2/day03/img/队列图.bmp new file mode 100644 index 0000000..3e80de3 Binary files /dev/null and b/javaSE2/day03/img/队列图.bmp differ diff --git a/javaSE2/day03/img/马自达mx5.jpg b/javaSE2/day03/img/马自达mx5.jpg new file mode 100644 index 0000000..d376114 Binary files /dev/null and b/javaSE2/day03/img/马自达mx5.jpg differ diff --git a/javaSE2/day04/day04【Map、补充知识点】.md b/javaSE2/day04/day04【Map、补充知识点】.md new file mode 100644 index 0000000..5b6dda2 --- /dev/null +++ b/javaSE2/day04/day04【Map、补充知识点】.md @@ -0,0 +1,606 @@ +# day04 【Map、补充知识点】 + +### 主要内容 + +- Map集合 +- 补充知识点 + +### 教学目标 + +- [ ] 能够说出Map集合特点 +- [ ] 使用Map集合添加方法保存数据 +- [ ] 使用”键找值”的方式遍历Map集合 +- [ ] 使用”键值对”的方式遍历Map集合 +- [ ] 能够使用HashMap存储自定义键值对的数据 +- [ ] 能够使用可变参数 +- [ ] 能够使用debug调试程序 +- [ ] 能够理解冒泡排序的原理 +- [ ] 能够使用Arrays数组工具类的常用方法 +- [ ] 能够使用HashMap编写斗地主洗牌发牌案例 + +## 第一章 Map集合 + +### 1.1 概述 + +现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即`java.util.Map`接口。 + +我们通过查看`Map`接口描述,发现`Map`接口下的集合与`Collection`接口下的集合,它们存储数据的形式不同,如下图。 + +![](img\Collection与Map.bmp) + +* `Collection`中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 +* `Map`中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。 +* `Collection`中的集合称为单列集合,`Map`中的集合称为双列集合。 +* 需要注意的是,`Map`中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 + +### 1.2 Map的常用子类 + +通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。 + +* **HashMap\**:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 +* **LinkedHashMap\**:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 + +> tips:Map接口中的集合都有两个泛型变量\,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量\的数据类型可以相同,也可以不同。 +> + +### 1.3 Map的常用方法 + +Map接口中定义了很多方法,常用的如下: + +* `public V put(K key, V value)`: 把指定的键与指定的值添加到Map集合中。 +* `public V remove(Object key)`: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 +* `public V get(Object key)` 根据指定的键,在Map集合中获取对应的值。 +* `public Set keySet()`: 获取Map集合中所有的键,存储到Set集合中。 +* `public Set> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)。 +* `public boolean containKey(Object key)`:判断该集合中是否有此键。 + +Map接口的方法演示 + +~~~java +public class MapDemo { + public static void main(String[] args) { + //创建 map对象 + HashMap map = new HashMap(); + + //添加元素到集合 + map.put("黄晓明", "杨颖"); + map.put("文章", "马伊琍"); + map.put("邓超", "孙俪"); + System.out.println(map); + + //String remove(String key) + System.out.println(map.remove("邓超")); + System.out.println(map); + + // 想要查看 黄晓明的媳妇 是谁 + System.out.println(map.get("黄晓明")); + System.out.println(map.get("邓超")); + } +} +~~~ + +> tips: +> +> 使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中; +> +> 若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。 + +### 1.4 Map的遍历 + +#### 方式1:键找值方式 + +通过元素中的键,获取键所对应的值 + +分析步骤: + +1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示:`keyset()` +2. 遍历键的Set集合,得到每一个键。 +3. 根据键,获取键所对应的值。方法提示:`get(K key)` + +遍历图解: + +![](img\Map集合遍历方式一.bmp) + +* + +#### 方式2:键值对方式 + +即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。 + +**Entry键值对对象:** + +我们已经知道,`Map`中存放的是两种对象,一种称为**key**(键),一种称为**value**(值),它们在在`Map`中是一一对应关系,这一对对象又称做`Map`中的一个`Entry(项)`。`Entry`将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历`Map`集合时,就可以从每一个键值对(`Entry`)对象中获取对应的键与对应的值。 + +在Map集合中也提供了获取所有Entry对象的方法: + +- `public Set> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)。 + + 获取了Entry对象 , 表示获取了一对键和值,那么同样Entry中 , 分别提供了获取键和获取值的方法: + +- `public K getKey()`:获取Entry对象中的键。 +- `public V getValue()`:获取Entry对象中的值。 + +操作步骤与图解: + +1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:`entrySet()`。 + +2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。 +3. 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:`getkey() getValue()` + +遍历图解: + +![](img\Map集合遍历方式二.bmp) + +> tips:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。 +> + +### 1.5 HashMap存储自定义类型 + +练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。 + +> 注意,学生姓名相同并且年龄相同视为同一名学生。 +> + +编写学生类: + +~~~java +public class Student { + private String name; + private int age; + + //构造方法 + //get/set + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Student student = (Student) o; + return age == student.age && Objects.equals(name, student.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, age); + } +} +~~~ + +编写测试类: + +~~~java +public class HashMapTest { + public static void main(String[] args) { + //1,创建Hashmap集合对象。 + Map map = new HashMap(); + //2,添加元素。 + map.put(new Student("lisi",28), "上海"); + map.put(new Student("wangwu",22), "北京"); + map.put(new Student("wangwu",22), "南京"); + + //3,取出元素。键找值方式 + Set keySet = map.keySet(); + for(Student key: keySet){ + String value = map.get(key); + System.out.println(key.toString()+"....."+value); + } + } +} +~~~ + +* 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。 +* 如果要保证map中存放的key和取出的顺序一致,可以使用`java.util.LinkedHashMap`集合来存放。 + +### 1.6 LinkedHashMap介绍 + +我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢? + +在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。 + +~~~java +public class LinkedHashMapDemo { + public static void main(String[] args) { + LinkedHashMap map = new LinkedHashMap(); + map.put("邓超", "孙俪"); + map.put("李晨", "范冰冰"); + map.put("刘德华", "朱丽倩"); + Set> entrySet = map.entrySet(); + for (Entry entry : entrySet) { + System.out.println(entry.getKey() + " " + entry.getValue()); + } + } +} +~~~ + +结果: + +~~~ +邓超 孙俪 +李晨 范冰冰 +刘德华 朱丽倩 +~~~ + +### 1.7 Map集合练习 + +**需求:** + +计算一个字符串中每个字符出现次数。 + +**分析:** + +1. 获取一个字符串对象 +2. 创建一个Map集合,键代表字符,值代表次数。 +3. 遍历字符串得到每个字符。 +4. 判断Map中是否有该键。 +5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。 +6. 打印最终结果 + +**方法介绍** + +`public boolean containKey(Object key)`:判断该集合中是否有此键。 + +**代码:** + +~~~java +public class MapTest { +public static void main(String[] args) { + //友情提示 + System.out.println("请录入一个字符串:"); + String line = new Scanner(System.in).nextLine(); + // 定义 每个字符出现次数的方法 + findChar(line); + } + private static void findChar(String line) { + //1:创建一个集合 存储 字符 以及其出现的次数 + HashMap map = new HashMap(); + //2:遍历字符串 + for (int i = 0; i < line.length(); i++) { + char c = line.charAt(i); + //判断 该字符 是否在键集中 + if (!map.containsKey(c)) {//说明这个字符没有出现过 + //那就是第一次 + map.put(c, 1); + } else { + //先获取之前的次数 + Integer count = map.get(c); + //count++; + //再次存入 更新 + map.put(c, ++count); + } + } + System.out.println(map); + } +} +~~~ + +## 第二章 补充知识点 + +### 2.1 可变参数 + +在**JDK1.5**之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化. + +**格式:** + +``` +修饰符 返回值类型 方法名(参数类型... 形参名){ } +``` + +**代码演示:** + +```java + public class ChangeArgs { + public static void main(String[] args) { + int sum = getSum(6, 7, 2, 12, 2121); + System.out.println(sum); + } + public static int getSum(int... arr) { + int sum = 0; + for (int a : arr) { + sum += a; + } + return sum; + } +} +``` +**注意:** + +​ 1.一个方法只能有一个可变参数 + +​ 2.如果方法中有多个参数,可变参数要放到最后。 + +**应用场景: Collections** + +​ 在Collections中也提供了添加一些元素方法: + +​ `public static boolean addAll(Collection c, T... elements) `:往集合中添加一些元素。 + +**代码演示:** + +```java +public class CollectionsDemo { + public static void main(String[] args) { + ArrayList list = new ArrayList(); + //原来写法 + //list.add(12); + //list.add(14); + //list.add(15); + //list.add(1000); + //采用工具类 完成 往集合中添加元素 + Collections.addAll(list, 5, 222, 1,2); + System.out.println(list); +} +``` +### 2.2 Debug追踪 + +**使用IDEA的断点调试功能,查看程序的运行过程** Debug调试窗口介绍 + +![](img\debug5.png) + +### 2.3 数组排序 + +#### 冒泡排序 + +##### 冒泡排序概述 + +- 一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序 +- 如果有n个数据进行排序,总共需要比较n-1次 +- 每一次比较完毕,下一次的比较就会少一个数据参与 + +##### 冒泡排序图解 + +![5](img/5.png) + +##### 冒泡排序代码实现 + +```java +/* + 冒泡排序: + 一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面, + 依次对所有的数据进行操作,直至所有数据按要求完成排序 + */ +public class ArrayDemo { + public static void main(String[] args) { + //定义一个数组 + int[] arr = {7, 6, 5, 4, 3}; + System.out.println("排序前:" + arrayToString(arr)); + + // 这里减1,是控制每轮比较的次数 + for (int x = 0; x < arr.length - 1; x++) { + // -1是为了避免索引越界,-x是为了调高比较效率 + for (int i = 0; i < arr.length - 1 - x; i++) { + if (arr[i] > arr[i + 1]) { + int temp = arr[i]; + arr[i] = arr[i + 1]; + arr[i + 1] = temp; + } + } + } + System.out.println("排序后:" + arrayToString(arr)); + + } + + //把数组中的元素按照指定的规则组成一个字符串:[元素1, 元素2, ...] + public static String arrayToString(int[] arr) { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < arr.length; i++) { + if (i == arr.length - 1) { + sb.append(arr[i]); + } else { + sb.append(arr[i]).append(", "); + } + } + sb.append("]"); + String s = sb.toString(); + return s; + } +} +``` + +### 2.4 Arrays类 + +#### 概述 + +`java.util.Arrays` 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单。 + +#### 操作数组的方法 + +- `public static String toString(int[] a) ` :返回指定数组内容的字符串表示形式。 + +```java +public static void main(String[] args) { + // 定义int 数组 + int[] arr = {7, 6, 5, 4, 3}; + // 打印数组,输出地址值 + System.out.println(arr); // [I@2ac1fdc4 + + // 数组内容转为字符串 + String s = Arrays.toString(arr); + // 打印字符串,输出内容 + System.out.println(s); // [7, 6, 5, 4, 3] +} +``` + +- `public static void sort(int[] a)` :对指定的 int 型数组按数字升序进行排序。 + +```java +public static void main(String[] args) { + // 定义int 数组 + int[] arr = {7, 6, 5, 4, 3}; + System.out.println("排序前:"+ Arrays.toString(arr)); // 排序前:[7, 6, 5, 4, 3] + // 升序排序 + Arrays.sort(arr); + System.out.println("排序后:"+ Arrays.toString(arr));// 排序后:[3, 4, 5, 6, 7] +} +``` + + + +## 第三章 模拟斗地主洗牌发牌 + +### 3.1 案例介绍 + +按照斗地主的规则,完成洗牌发牌的动作。 + +![](img\斗地主.png) + +具体规则: + +1. 组装54张扑克牌将 +2. 54张牌顺序打乱 +3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。 +4. 查看三人各自手中的牌(按照牌的大小排序)、底牌 + +> 规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3 +> + +### 3.2 案例需求分析 + +1. 准备牌: + + +完成数字与纸牌的映射关系: + +使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。 + +2. 洗牌: + +通过数字完成洗牌发牌 + +3. 发牌: + +将每个人以及底牌设计为ArrayList\,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。 + +存放的过程中要求数字大小与斗地主规则的大小对应。 + +将代表不同纸牌的数字分配给不同的玩家与底牌。 + +4. 看牌: + +通过Map集合找到对应字符展示。 + +通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。 + +![](img\斗地主分析.png) + +### 3.3 实现代码步骤 + +~~~java +package com.inmind04; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; + +/* + * 组合牌 + * 定义一个Map集合用来存储牌号 和 牌 + * 定义一个List集合用来存储牌号 + * 花色:♥-♠-♦-♣ + * 数字:2-A-K-Q-J-10-9-8-7-6-5-4-3 + * 洗牌 + * Collections.shuffle(牌号集合) + * 发牌 + * 三个玩家三个集合 + * 发牌号 + * 排序 + * 看牌 + */ +public class Pooker { + + public static void main(String[] args) { + // 定义一个Map集合用来存储牌号 和 牌 + HashMap pookerMap = new HashMap(); + //定义一个List集合用来存储牌号 + ArrayList pookerList = new ArrayList(); + + String[] colors = "♥-♠-♦-♣".split("-"); + String[] nums = "2-A-K-Q-J-10-9-8-7-6-5-4-3".split("-"); + + + int index = 2; + for(String num : nums){ + for(String color : colors){ + String thisPooker = color+num; +// System.out.println(thisPooker); + //将扑克牌放入Map集合 + pookerMap.put(index, thisPooker); + //将牌号放入到pookerList集合中 + pookerList.add(index); + index++; + } + } + + + //将大王小王添加到集合 + pookerMap.put(0, "大王"); + pookerMap.put(1, "小王"); + pookerList.add(0); + pookerList.add(1); + +// System.out.println(pookerMap); +// System.out.println(pookerList); + + //洗牌 + Collections.shuffle(pookerList); + + //发牌 + ArrayList player1 = new ArrayList(); + ArrayList player2 = new ArrayList(); + ArrayList player3 = new ArrayList(); + ArrayList diPai = new ArrayList(); + + //遍历牌号的集合 判断索引发牌号 + for(int i = 0 ;i < pookerList.size() ;i++){ + Integer pookerNum = pookerList.get(i); + + if(i>=51) + diPai.add(pookerNum); + }else if(i % 3 == 0){ + player1.add(pookerNum); + }else if(i % 3 == 1){ + player2.add(pookerNum); + }else if(i % 3 == 2){ + player3.add(pookerNum); + } + } + + +// 排序 + + Collections.sort(player1); + Collections.sort(player2); + Collections.sort(player3); + Collections.sort(diPai); +// System.out.println(player1); +// System.out.println(player2); +// System.out.println(player3); +// System.out.println(diPai); + + show("柳岩",player1,pookerMap); + show("唐嫣",player2,pookerMap); + show("金莲",player3,pookerMap); + show("底牌",diPai,pookerMap); + + } + //定义方法 看牌 + public static void show(String name,ArrayList player,HashMap pookerMap ){ + System.out.print(name+":"); + for(Integer pookerNum : player){ + String thisPooker = pookerMap.get(pookerNum); + System.out.print(thisPooker+" "); + } + System.out.println(); + } +} + +~~~ + + + + + + + + \ No newline at end of file diff --git a/javaSE2/day04/img/5.png b/javaSE2/day04/img/5.png new file mode 100644 index 0000000..554af91 Binary files /dev/null and b/javaSE2/day04/img/5.png differ diff --git a/javaSE2/day04/img/Collection与Map.bmp b/javaSE2/day04/img/Collection与Map.bmp new file mode 100644 index 0000000..e36e3ac Binary files /dev/null and b/javaSE2/day04/img/Collection与Map.bmp differ diff --git a/javaSE2/day04/img/Map集合遍历方式一.bmp b/javaSE2/day04/img/Map集合遍历方式一.bmp new file mode 100644 index 0000000..6e1bc8b Binary files /dev/null and b/javaSE2/day04/img/Map集合遍历方式一.bmp differ diff --git a/javaSE2/day04/img/Map集合遍历方式二.bmp b/javaSE2/day04/img/Map集合遍历方式二.bmp new file mode 100644 index 0000000..0fd4d55 Binary files /dev/null and b/javaSE2/day04/img/Map集合遍历方式二.bmp differ diff --git a/javaSE2/day04/img/debug0.png b/javaSE2/day04/img/debug0.png new file mode 100644 index 0000000..cde00e5 Binary files /dev/null and b/javaSE2/day04/img/debug0.png differ diff --git a/javaSE2/day04/img/debug1.png b/javaSE2/day04/img/debug1.png new file mode 100644 index 0000000..73de329 Binary files /dev/null and b/javaSE2/day04/img/debug1.png differ diff --git a/javaSE2/day04/img/debug10.png b/javaSE2/day04/img/debug10.png new file mode 100644 index 0000000..3b4cd7b Binary files /dev/null and b/javaSE2/day04/img/debug10.png differ diff --git a/javaSE2/day04/img/debug11.png b/javaSE2/day04/img/debug11.png new file mode 100644 index 0000000..c782a51 Binary files /dev/null and b/javaSE2/day04/img/debug11.png differ diff --git a/javaSE2/day04/img/debug12.png b/javaSE2/day04/img/debug12.png new file mode 100644 index 0000000..2951b66 Binary files /dev/null and b/javaSE2/day04/img/debug12.png differ diff --git a/javaSE2/day04/img/debug13.png b/javaSE2/day04/img/debug13.png new file mode 100644 index 0000000..22690cd Binary files /dev/null and b/javaSE2/day04/img/debug13.png differ diff --git a/javaSE2/day04/img/debug14.png b/javaSE2/day04/img/debug14.png new file mode 100644 index 0000000..5e03df2 Binary files /dev/null and b/javaSE2/day04/img/debug14.png differ diff --git a/javaSE2/day04/img/debug15.png b/javaSE2/day04/img/debug15.png new file mode 100644 index 0000000..66c0eaf Binary files /dev/null and b/javaSE2/day04/img/debug15.png differ diff --git a/javaSE2/day04/img/debug16.png b/javaSE2/day04/img/debug16.png new file mode 100644 index 0000000..86b25e2 Binary files /dev/null and b/javaSE2/day04/img/debug16.png differ diff --git a/javaSE2/day04/img/debug17.png b/javaSE2/day04/img/debug17.png new file mode 100644 index 0000000..1321baf Binary files /dev/null and b/javaSE2/day04/img/debug17.png differ diff --git a/javaSE2/day04/img/debug2.png b/javaSE2/day04/img/debug2.png new file mode 100644 index 0000000..8ba2906 Binary files /dev/null and b/javaSE2/day04/img/debug2.png differ diff --git a/javaSE2/day04/img/debug3.png b/javaSE2/day04/img/debug3.png new file mode 100644 index 0000000..c20b608 Binary files /dev/null and b/javaSE2/day04/img/debug3.png differ diff --git a/javaSE2/day04/img/debug4.png b/javaSE2/day04/img/debug4.png new file mode 100644 index 0000000..be5f430 Binary files /dev/null and b/javaSE2/day04/img/debug4.png differ diff --git a/javaSE2/day04/img/debug5.png b/javaSE2/day04/img/debug5.png new file mode 100644 index 0000000..a704e71 Binary files /dev/null and b/javaSE2/day04/img/debug5.png differ diff --git a/javaSE2/day04/img/debug6.png b/javaSE2/day04/img/debug6.png new file mode 100644 index 0000000..a56d225 Binary files /dev/null and b/javaSE2/day04/img/debug6.png differ diff --git a/javaSE2/day04/img/debug7.png b/javaSE2/day04/img/debug7.png new file mode 100644 index 0000000..4ddba75 Binary files /dev/null and b/javaSE2/day04/img/debug7.png differ diff --git a/javaSE2/day04/img/debug8.png b/javaSE2/day04/img/debug8.png new file mode 100644 index 0000000..7ef6015 Binary files /dev/null and b/javaSE2/day04/img/debug8.png differ diff --git a/javaSE2/day04/img/debug9.png b/javaSE2/day04/img/debug9.png new file mode 100644 index 0000000..6744981 Binary files /dev/null and b/javaSE2/day04/img/debug9.png differ diff --git a/javaSE2/day04/img/斗地主.png b/javaSE2/day04/img/斗地主.png new file mode 100644 index 0000000..ffc0a85 Binary files /dev/null and b/javaSE2/day04/img/斗地主.png differ diff --git a/javaSE2/day04/img/斗地主分析.png b/javaSE2/day04/img/斗地主分析.png new file mode 100644 index 0000000..759bc6f Binary files /dev/null and b/javaSE2/day04/img/斗地主分析.png differ diff --git a/javaSE2/day05/day05【异常、线程】.md b/javaSE2/day05/day05【异常、线程】.md new file mode 100644 index 0000000..f7e4c39 --- /dev/null +++ b/javaSE2/day05/day05【异常、线程】.md @@ -0,0 +1,563 @@ +# day05 【异常、线程】 + +### 主要内容 + +- 异常、线程 + +### 教学目标 + +- [ ] 能够辨别程序中异常和错误的区别 +- [ ] 说出异常的分类 +- [ ] 说出虚拟机处理异常的方式 +- [ ] 列举出常见的三个运行期异常 +- [ ] 能够使用try...catch关键字处理异常 +- [ ] 能够使用throws关键字处理异常 +- [ ] 能够自定义异常类 +- [ ] 能够处理自定义异常类 +- [ ] 说出进程的概念 +- [ ] 说出线程的概念 +- [ ] 能够理解并发与并行的区别 +- [ ] 能够开启新线程 + +## 第一章 异常 + +### 1.1 异常概念 + +异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: + +* **异常** :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 + +在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。 + +> 异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行. + +### 1.2 异常体系 + +异常机制其实是帮助我们**找到**程序中的问题,异常的根类是`java.lang.Throwable`,其下有两个子类:`java.lang.Error`与`java.lang.Exception`,平常所说的异常指`java.lang.Exception`。 + +![](img\异常体系.png) + +**Throwable体系:** + +* **Error**:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。 +* **Exception**:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好比感冒、阑尾炎。 + +**Throwable中的常用方法:** + +* `public void printStackTrace()`:打印异常的详细信息。 + + *包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。* + +* `public String getMessage()`:获取发生异常的原因。 + + *提示给用户的时候,就提示错误原因。* + +* `public String toString()`:获取异常的类型和异常描述信息(不用)。 + +***出现异常,不要紧张,把异常的简单类名,拷贝到API中去查。*** + +![](img\简单的异常查看.bmp) + +### 1.3 异常分类 + +我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序。 + +**异常(Exception)的分类**:根据在编译时期还是运行时期去检查异常? + +* **编译时期异常**:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常) +* **运行时期异常**:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常) + +​ ![](img\异常的分类.png) + +### 1.4 异常的产生过程解析 + +先运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException。我们通过图解来解析下异常产生的过程。 + + 工具类 + +~~~java +public class ArrayTools { + // 对给定的数组通过给定的角标获取元素。 + public static int getElement(int[] arr, int index) { + int element = arr[index]; + return element; + } +} +~~~ + + 测试类 + +~~~java +public class ExceptionDemo { + public static void main(String[] args) { + int[] arr = { 34, 12, 67 }; + intnum = ArrayTools.getElement(arr, 4) + System.out.println("num=" + num); + System.out.println("over"); + } +} +~~~ + +上述程序执行过程图解: + + ![](img\异常产生过程.png) + +## 第二章 异常的处理 + +Java异常处理的五个关键字:**try、catch、finally、throw、throws** + +### 2.1 抛出异常throw + +在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。 + +在java中,提供了一个**throw**关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢? + +1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。 + +2. 需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象。 + + throw**用在方法内**,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。 + +**使用格式:** + +~~~ +throw new 异常类名(参数); +~~~ + + 例如: + +~~~java +throw new NullPointerException("要访问的arr数组不存在"); + +throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围"); +~~~ + +学习完抛出异常的格式后,我们通过下面程序演示下throw的使用。 + +~~~java +public class ThrowDemo { + public static void main(String[] args) { + //创建一个数组 + int[] arr = {2,4,52,2}; + //根据索引找对应的元素 + int index = 4; + int element = getElement(arr, index); + + System.out.println(element); + System.out.println("over"); + } + /* + * 根据 索引找到数组中对应的元素 + */ + public static int getElement(int[] arr,int index){ + //判断 索引是否越界 + if(index<0 || index>arr.length-1){ + /* + 判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。 + 这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。 + */ + throw new ArrayIndexOutOfBoundsException("哥们,角标越界了~~~"); + } + int element = arr[index]; + return element; + } +} +~~~ + +> 注意:如果产生了问题,我们就会throw将问题描述类即异常进行抛出,也就是将问题返回给该方法的调用者。 +> +> 那么对于调用者来说,该怎么处理呢?一种是进行捕获处理,另一种就是继续讲问题声明出去,使用throws声明处理。 + +### 2.2 Objects非空判断 + +还记得我们学习过一个类Objects吗,曾经提到过它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),那么在它的源码中,对对象为null的值进行了抛出异常操作。 + +* `public static T requireNonNull(T obj)`:查看指定引用对象不是null。 + +查看源码发现这里对为null的进行了抛出异常操作: + +~~~java +public static T requireNonNull(T obj) { + if (obj == null) + throw new NullPointerException(); + return obj; +} +~~~ + +### 2.3 声明异常throws + +**声明异常**:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。 + +关键字**throws**运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常). + +**声明异常格式:** + +~~~ +修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ } +~~~ + +声明异常的代码演示: + +~~~java +public class ThrowsDemo { + public static void main(String[] args) throws FileNotFoundException { + read("a.txt"); + } + + // 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明 + public static void read(String path) throws FileNotFoundException { + if (!path.equals("a.txt")) {//如果不是 a.txt这个文件 + // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw + throw new FileNotFoundException("文件不存在"); + } + } +} +~~~ + +throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。 + +~~~java +public class ThrowsDemo2 { + public static void main(String[] args) throws IOException { + read("a.txt"); + } + + public static void read(String path)throws FileNotFoundException, IOException { + if (!path.equals("a.txt")) {//如果不是 a.txt这个文件 + // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw + throw new FileNotFoundException("文件不存在"); + } + if (!path.equals("b.txt")) { + throw new IOException(); + } + } +} +~~~ + +### 2.4 捕获异常try…catch + +如果异常出现的话,会立刻终止程序,所以我们得处理异常: + +1. 该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。 +2. 在方法中使用try-catch的语句块来处理异常。 + +**try-catch**的方式就是捕获异常。 + +* **捕获异常**:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。 + +捕获异常语法如下: + +~~~java +try{ + 编写可能会出现异常的代码 +}catch(异常类型 e){ + 处理异常的代码 + //记录日志/打印异常信息/继续抛出异常 +} +~~~ + +**try:**该代码块中编写可能产生异常的代码。 + +**catch:**用来进行某种异常的捕获,实现对捕获到的异常进行处理。 + +> 注意:try和catch都不能单独使用,必须连用。 + +演示如下: + +~~~java +public class TryCatchDemo { + public static void main(String[] args) { + try {// 当产生异常时,必须有处理方式。要么捕获,要么声明。 + read("b.txt"); + } catch (FileNotFoundException e) {// 括号中需要定义什么呢? + //try中抛出的是什么异常,在括号中就定义什么异常类型 + System.out.println(e); + } + System.out.println("over"); + } + /* + * + * 我们 当前的这个方法中 有异常 有编译期异常 + */ + public static void read(String path) throws FileNotFoundException { + if (!path.equals("a.txt")) {//如果不是 a.txt这个文件 + // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw + throw new FileNotFoundException("文件不存在"); + } + } +} +~~~ + +如何获取异常信息: + +Throwable类中定义了一些查看方法: + +* `public String getMessage()`:获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。 + + +* `public String toString()`:获取异常的类型和异常描述信息(不用)。 +* `public void printStackTrace()`:打印异常的跟踪栈信息并输出到控制台。 + +​ *包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。* + +在开发中呢也可以在catch将编译期异常转换成运行期异常处理。 + +多个异常使用捕获又该如何处理呢? + +1. 多个异常分别处理。 +2. 多个异常一次捕获,多次处理。 +3. 多个异常一次捕获一次处理。 + +一般我们是使用一次捕获多次处理方式,格式如下: + +~~~java +try{ + 编写可能会出现异常的代码 +}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获. + 处理异常的代码 + //记录日志/打印异常信息/继续抛出异常 +}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获. + 处理异常的代码 + //记录日志/打印异常信息/继续抛出异常 +} +~~~ + +> 注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。 + +### 2.4 finally 代码块 + +**finally**:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。 + +什么时候的代码必须最终执行? + +当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,最终关闭打开的资源。 + +finally的语法: + + try...catch....finally:自身需要处理异常,最终还得关闭资源。 + +> 注意:finally不能单独使用。 + +比如在我们之后学习的IO流中,当打开了一个关联文件的资源,最后程序不管结果如何,都需要把这个资源关闭掉。 + +finally代码参考如下: + +~~~java +public class TryCatchDemo4 { + public static void main(String[] args) { + try { + read("a.txt"); + } catch (FileNotFoundException e) { + //抓取到的是编译期异常 抛出去的是运行期 + throw new RuntimeException(e); + } finally { + System.out.println("不管程序怎样,这里都将会被执行。"); + } + System.out.println("over"); + } + /* + * + * 我们 当前的这个方法中 有异常 有编译期异常 + */ + public static void read(String path) throws FileNotFoundException { + if (!path.equals("a.txt")) {//如果不是 a.txt这个文件 + // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw + throw new FileNotFoundException("文件不存在"); + } + } +} +~~~ + +> 当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行。 + +![](img\死了都要try.bmp) + +### 2.5 异常注意事项 + +* 运行时异常被抛出可以不处理。即不捕获也不声明抛出。 +* 如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。 +* 父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出 +* 当多异常处理时,捕获处理,前边的类不能是后边类的父类 +* 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。 +* 如果finally有return语句,永远返回finally中的结果,避免该情况. + +## 第三章 自定义异常 + +### 3.1 概述 + +**为什么需要自定义异常类:** + +我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己业务的异常情况来定义异常类。,例如年龄负数问题,考试成绩负数问题。 + +在上述代码中,发现这些异常都是JDK内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中没有定义过,例如年龄负数问题,考试成绩负数问题.那么能不能自己定义异常呢? + +**什么是自定义异常类:** + +在开发中根据自己业务的异常情况来定义异常类. + +自定义一个业务逻辑异常: **LoginException**。一个登陆异常类。 + +**异常类如何定义:** + +1. 自定义一个编译期异常: 自定义类 并继承于`java.lang.Exception`。 +2. 自定义一个运行时期的异常类:自定义类 并继承于`java.lang.RuntimeException`。 + +### 3.2 自定义异常的练习 + +要求:我们模拟登陆操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。 + +首先定义一个登陆异常类LoginException: + +~~~java +// 业务逻辑异常 +public class LoginException extends Exception { + /** + * 空参构造 + */ + public LoginException() { + } + + /** + * + * @param message 表示异常提示 + */ + public LoginException(String message) { + super(message); + } +} +~~~ + +模拟登陆操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否存在方法用于判断。 + +~~~java +public class Demo { + // 模拟数据库中已存在账号 + private static String[] names = {"bill","hill","jill"}; + + public static void main(String[] args) { + //调用方法 + try{ + // 可能出现异常的代码 + checkUsername("nill"); + System.out.println("注册成功");//如果没有异常就是注册成功 + }catch(LoginException e){ + //处理异常 + e.printStackTrace(); + } + } + + //判断当前注册账号是否存在 + //因为是编译期异常,又想调用者去处理 所以声明该异常 + public static boolean checkUsername(String uname) throws LoginException{ + for (String name : names) { + if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常 + throw new LoginException("亲"+name+"已经被注册了!"); + } + } + return true; + } +} +~~~ + +## 第四章 多线程 + +我们在之前,学习的程序在没有跳转语句的前提下,都是由上至下依次执行,那现在想要设计一个程序,边打游戏边听歌,怎么设计? + +要解决上述问题,咱们得使用多进程或者多线程来解决. + +### 4.1 并发与并行 + +* **并行**:指两个或多个事件在**同一时刻**发生(同时发生)。 +* **并发**:指两个或多个事件在**同一个时间段内**发生。 + +![](img\并行与并发.bmp) + +在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。 + +而在多个 CPU 系统中,则这些可以并发执行的程序便可以分配到多个处理器上(CPU),实现多任务并行执行,即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。目前电脑市场上说的多核 CPU,便是多核处理器,核 越多,并行处理的程序越多,能大大的提高电脑运行的效率。 + +> 注意:单核处理器的计算机肯定是不能并行的处理多个任务的,只能是多个任务在单个CPU上并发运行。同理,线程也是一样的,从宏观角度上理解线程是并行运行的,但是从微观角度上分析却是串行运行的,即一个线程一个线程的去运行,当系统只有一个CPU时,线程会以某种顺序执行多个线程,我们把这种情况称之为线程调度。 + +### 4.2 线程与进程 + +* **进程**:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。 +* **线程**:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。 + +我们可以再电脑底部任务栏,右键----->打开任务管理器,可以查看当前任务的进程和线程: + +**进程** + +![](img\进程概念.png) + +**线程** + +![](img\线程概念.png) + +**进程与线程的区别** + +* 进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。 +* 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小的多。 + + **注意:** + +1. 因为一个进程中的多个线程是并发运行的,那么从微观角度看也是有先后顺序的,哪个线程执行完全取决于 CPU 的调度,程序员是干涉不了的。而这也就造成的多线程的随机性。 +2. Java 程序的进程里面至少包含两个线程,主进程也就是 main()方法线程,另外一个是垃圾回收机制线程。每当使用 java 命令执行一个类时,实际上都会启动一个 JVM,每一个 JVM 实际上就是在操作系统中启动了一个线程,java 本身具备了垃圾的收集机制,所以在 Java 运行时至少会启动两个线程。 +3. 由于创建一个线程的开销比创建一个进程的开销小的多,那么我们在开发多任务运行的时候,通常考虑创建多线程,而不是创建多进程。 + +**线程调度:** + +计算机通常只有一个CPU时,在任意时刻只能执行一条计算机指令,每一个进程只有获得CPU的使用权才能执行指令。所谓多进程并发运行,从宏观上看,其实是各个进程轮流获得CPU的使用权,分别执行各自的任务。那么,在可运行池中,会有多个线程处于就绪状态等到CPU,JVM就负责了线程的调度。JVM采用的是**抢占式调度**,没有采用分时调度,因此可以能造成多线程执行结果的的随机性。 + +### 4.3 创建线程类 + +Java使用`java.lang.Thread`类代表**线程**,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java使用线程执行体来代表这段程序流。Java中通过继承Thread类来**创建**并**启动多线程**的步骤如下: + +1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。 +2. 创建Thread子类的实例,即创建了线程对象 +3. 调用线程对象的start()方法来启动该线程 + +代码如下: + +测试类: + +~~~java +public class Demo01 { + public static void main(String[] args) { + //创建自定义线程对象 + MyThread mt = new MyThread("新的线程!"); + //开启新线程 + mt.start(); + //在主方法中执行for循环 + for (int i = 0; i < 10; i++) { + System.out.println("main线程!"+i); + } + } +} +~~~ + +自定义线程类: + +~~~java +public class MyThread extends Thread { + //定义指定线程名称的构造方法 + public MyThread(String name) { + //调用父类的String参数的构造方法,指定线程的名称 + super(name); + } + /** + * 重写run方法,完成该线程执行的逻辑 + */ + @Override + public void run() { + for (int i = 0; i < 10; i++) { + System.out.println(getName()+":正在执行!"+i); + } + } +} +~~~ + +OK 相信我们都看到多线程的现象了,那么接下来几天我们就进入多线程的世界! + +那么现在有个小问题,请问植物大战僵尸游戏中,是用了多进程设计程序呢,还是多线程? + +![](img\植物大战僵尸.bmp) \ No newline at end of file diff --git a/javaSE2/day05/img/上市.bmp b/javaSE2/day05/img/上市.bmp new file mode 100644 index 0000000..07db458 Binary files /dev/null and b/javaSE2/day05/img/上市.bmp differ diff --git a/javaSE2/day05/img/并行与并发.bmp b/javaSE2/day05/img/并行与并发.bmp new file mode 100644 index 0000000..ce0c187 Binary files /dev/null and b/javaSE2/day05/img/并行与并发.bmp differ diff --git a/javaSE2/day05/img/异常产生过程.png b/javaSE2/day05/img/异常产生过程.png new file mode 100644 index 0000000..39afbed Binary files /dev/null and b/javaSE2/day05/img/异常产生过程.png differ diff --git a/javaSE2/day05/img/异常体系.png b/javaSE2/day05/img/异常体系.png new file mode 100644 index 0000000..8fbbd86 Binary files /dev/null and b/javaSE2/day05/img/异常体系.png differ diff --git a/javaSE2/day05/img/异常的分类.png b/javaSE2/day05/img/异常的分类.png new file mode 100644 index 0000000..5724410 Binary files /dev/null and b/javaSE2/day05/img/异常的分类.png differ diff --git a/javaSE2/day05/img/植物大战僵尸.bmp b/javaSE2/day05/img/植物大战僵尸.bmp new file mode 100644 index 0000000..2b38365 Binary files /dev/null and b/javaSE2/day05/img/植物大战僵尸.bmp differ diff --git a/javaSE2/day05/img/死了都要try.bmp b/javaSE2/day05/img/死了都要try.bmp new file mode 100644 index 0000000..dddbb14 Binary files /dev/null and b/javaSE2/day05/img/死了都要try.bmp differ diff --git a/javaSE2/day05/img/简单的异常查看.bmp b/javaSE2/day05/img/简单的异常查看.bmp new file mode 100644 index 0000000..b160209 Binary files /dev/null and b/javaSE2/day05/img/简单的异常查看.bmp differ diff --git a/javaSE2/day05/img/线程概念.png b/javaSE2/day05/img/线程概念.png new file mode 100644 index 0000000..2dc1ea5 Binary files /dev/null and b/javaSE2/day05/img/线程概念.png differ diff --git a/javaSE2/day05/img/进程概念.png b/javaSE2/day05/img/进程概念.png new file mode 100644 index 0000000..2e373d4 Binary files /dev/null and b/javaSE2/day05/img/进程概念.png differ diff --git a/javaSE2/day06/day06【线程、同步】.md b/javaSE2/day06/day06【线程、同步】.md new file mode 100644 index 0000000..c18693e --- /dev/null +++ b/javaSE2/day06/day06【线程、同步】.md @@ -0,0 +1,763 @@ +# day06 【线程、同步】 + +### 主要内容 + +- 线程 +- 同步 +- 线程状态 + +### 教学目标 + +- [ ] 能够描述Java中多线程运行原理 +- [ ] 能够使用继承类的方式创建多线程 +- [ ] 能够使用实现接口的方式创建多线程 +- [ ] 能够说出实现接口方式的好处 +- [ ] 能够解释安全问题的出现的原因 +- [ ] 能够使用同步代码块解决线程安全问题 +- [ ] 能够使用同步方法解决线程安全问题 +- [ ] 能够理解线程通信概念 +- [ ] 能够理解等待唤醒机制 +- [ ] 能够说出线程6个状态的名称 + +## 第一章 线程 + +### 1.1 多线程原理 + +昨天的时候我们已经写过一版多线程的代码,很多同学对原理不是很清楚,那么我们今天先画个多线程执行时序图来体现一下多线程程序的执行流程。 + +代码如下: + +自定义线程类: + +~~~javascript +public class MyThread extends Thread{ + /* + * 利用继承中的特点 + * 将线程名称传递 进行设置 + */ + public MyThread(String name){ + super(name); + } + /* + * 重写run方法 + * 定义线程要执行的代码 + */ + public void run(){ + for (int i = 0; i < 20; i++) { + //getName()方法 来自父亲 + System.out.println(getName()+i); + } + } +} +~~~ + +测试类: + +~~~java +public class Demo { + public static void main(String[] args) { + System.out.println("这里是main线程"); + MyThread mt = new MyThread("小强"); + mt.start();//开启了一个新的线程 + for (int i = 0; i < 20; i++) { + System.out.println("旺财:"+i); + } + } +} +~~~ + +流程图: + +![](img\线程流程图.png) + +程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用mt的对象的start方法,另外一个新的线程也启动了,这样,整个应用就在多线程下运行。 + +通过这张图我们可以很清晰的看到多线程的执行流程,那么为什么可以完成并发执行呢?我们再来讲一讲原理。 + +多线程执行时,到底在内存中是如何运行的呢?以上个程序为例,进行图解说明: + +多线程执行时,在栈内存中,其实**每一个执行线程都有一片自己所属的栈内存空间**。进行方法的压栈和弹栈。 + +![](img\栈内存原理图.bmp) + +当执行线程的任务结束了,线程自动在栈内存中释放了。但是当所有的执行线程都结束了,那么进程就结束了。 + +### 1.2 Thread类 + +在上一天内容中我们已经可以完成最基本的线程开启,那么在我们完成操作过程中用到了`java.lang.Thread`类,API中该类中定义了有关线程的一些方法,具体如下: + +**构造方法:** + +* `public Thread()`:分配一个新的线程对象。 +* `public Thread(String name)`:分配一个指定名字的新的线程对象。 +* `public Thread(Runnable target)`:分配一个带有指定目标新的线程对象。 +* `public Thread(Runnable target,String name)`:分配一个带有指定目标新的线程对象并指定名字。 + +**常用方法:** + +* `public String getName()`:获取当前线程名称。 +* `public void start()`:导致此线程开始执行; Java虚拟机调用此线程的run方法。 +* `public void run()`:此线程要执行的任务在此处定义代码。 +* `public static void sleep(long millis)`:使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。 +* `public static Thread currentThread() `:返回对当前正在执行的线程对象的引用。 + +翻阅API后得知创建线程的方式总共有两种,一种是继承Thread类方式,一种是实现Runnable接口方式,方式一我们上一天已经完成,接下来讲解方式二实现的方式。 + +### 1.3 创建线程方式二 + +采用`java.lang.Runnable`也是非常常见的一种,我们只需要重写run方法即可。 + +步骤如下: + +1. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。 +2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。 +3. 调用线程对象的start()方法来启动线程。 + +代码如下: + +~~~java +public class MyRunnable implements Runnable{ + @Override + public void run() { + for (int i = 0; i < 20; i++) { + System.out.println(Thread.currentThread().getName()+" "+i); + } + } +} +~~~ + +~~~java +public class Demo { + public static void main(String[] args) { + //创建自定义类对象 线程任务对象 + MyRunnable mr = new MyRunnable(); + //创建线程对象 + Thread t = new Thread(mr, "小强"); + t.start(); + for (int i = 0; i < 20; i++) { + System.out.println("旺财 " + i); + } + } +} +~~~ + +通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个执行目标。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。 + +在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。 + +实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是继承Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。 + +> tips:Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run()方法仅作为线程执行体。而实际的线程对象依然是Thread实例,只是该Thread线程负责执行其target的run()方法。 + +### 1.4 Thread和Runnable的区别 + +**A:避免了Java单继承的局限性;** + +​ 说明:如果使用方式一,那么在Java中一个类只能有一个直接父类,如果一个类已经继承其他的父类,那么当前这个类中假如有需要多线程操作的代码,这时这个类是无法再继承Thread类的。这样就会导致当前这个类中的某些需要多线程执行的任务代码就无法被线程去执行。 + +**B:把线程代码和任务的代码分离,解耦合(解除线程代码和任务的代码模块之间的依赖关系)。代码的扩展性非常好;** + +​ 说明:Thread类是专门负责描述线程本身的。Thread类可以对线程进行各种各样的操作。如果使用第一种方式,那么把线程要执行的任务也交给了Thread类。这样就会导致操作线程本身的功能和线程要执行的任务功能严重的耦合在一起。 + +​ 但是方式二,自定义一个类来实现Runnable接口,这样就把任务抽取到Runnable接口中,在这个接口中定义线程需要执行的任务的规则。当需要明确线程的任务时,我们就让这个类实现Runnable接口,只要实现Runnable接口的类,就相当于明确了线程需要执行的任务。 + +​ 当一个类实现Runnable接口,就相当于有了线程的任务,可是还没有线程本身这个对象。这时我们就可以直接使用Thread这个类创建出线程,然后把任务交给线程。这样就达到任务和线程的分离以及结合。 + +### 1.5 匿名内部类方式实现线程的创建 + +使用线程的内匿名内部类方式,可以方便的实现每个线程执行不同的线程任务操作。 + +使用匿名内部类的方式实现Runnable接口,重新Runnable接口中的run方法: + +~~~java +public class NoNameInnerClassThread { + public static void main(String[] args) { +// new Runnable(){ +// public void run(){ +// for (int i = 0; i < 20; i++) { +// System.out.println("张宇:"+i); +// } +// } +// }; //---这个整体 相当于new MyRunnable() + Runnable r = new Runnable(){ + public void run(){ + for (int i = 0; i < 20; i++) { + System.out.println("张宇:"+i); + } + } + }; + new Thread(r).start(); + + for (int i = 0; i < 20; i++) { + System.out.println("费玉清:"+i); + } + } +} +~~~ + +## 第二章 线程安全 + +### 2.1 线程安全 + +如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 + +我们通过一个案例,演示线程的安全问题: + +电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “葫芦娃大战奥特曼”,本次电影的座位共100个(本场电影只能卖100张票)。 + +我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这100张票) + +需要窗口,采用线程对象来模拟;需要票,Runnable接口子类来模拟 + +模拟票: + +~~~java +public class Ticket implements Runnable { + private int ticket = 100; + /* + * 执行卖票操作 + */ + @Override + public void run() { + //每个窗口卖票的操作 + //窗口 永远开启 + while (true) { + if (ticket > 0) {//有票 可以卖 + //出票操作 + //使用sleep模拟一下出票时间 + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //获取当前线程对象的名字 + String name = Thread.currentThread().getName(); + System.out.println(name + "正在卖:" + ticket--); + } + } + } +} +~~~ + +测试类: + +~~~java +public class Demo { + public static void main(String[] args) { + //创建线程任务对象 + Ticket ticket = new Ticket(); + //创建三个窗口对象 + Thread t1 = new Thread(ticket, "窗口1"); + Thread t2 = new Thread(ticket, "窗口2"); + Thread t3 = new Thread(ticket, "窗口3"); + + //同时卖票 + t1.start(); + t2.start(); + t3.start(); + } +} +~~~ + +结果中有一部分这样现象: + +![](img\线程安全问题.png) + +发现程序出现了两个问题: + +1. 相同的票数,比如5这张票被卖了两回。 +2. 不存在的票,比如0票与-1票,是不存在的。 + +这种问题,几个窗口(线程)票数不同步了,这种问题称为线程不安全。 + +> 线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。 + +### 2.2 线程同步 + +当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题。 + +要解决上述多线程并发访问一个资源的安全性问题:也就是解决重复票与不存在票问题,Java中提供了同步机制(**synchronized**)来解决。 + +根据案例简述: + +~~~ +窗口1线程进入操作的时候,窗口2和窗口3线程只能在外等着,窗口1操作结束,窗口1和窗口2和窗口3才有机会进入代码去执行。也就是说在某个线程修改共享资源的时候,其他线程不能修改该资源,等待修改完毕同步之后,才能去抢夺CPU资源,完成对应的操作,保证了数据的同步性,解决了线程不安全的现象。 +~~~ + +为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制。 + +那么怎么去使用呢?有三种方式完成同步操作: + +1. 同步代码块。 +2. 同步方法。 +3. 锁机制。 + +### 2.3 同步代码块 + +* **同步代码块**:`synchronized`关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。 + +格式: + +~~~java +synchronized(同步锁){ + 需要同步操作的代码 +} +~~~ + +**同步锁**: + +对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁. + +1. 锁对象 可以是任意类型。 + +2. 多个线程对象 要使用同一把锁。 + + +> 注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着(BLOCKED)。 + +使用同步代码块解决代码: + +~~~java +public class Ticket implements Runnable{ + private int ticket = 100; + + Object lock = new Object(); + /* + * 执行卖票操作 + */ + @Override + public void run() { + //每个窗口卖票的操作 + //窗口 永远开启 + while(true){ + synchronized (lock) { + if(ticket>0){//有票 可以卖 + //出票操作 + //使用sleep模拟一下出票时间 + try { + Thread.sleep(50); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //获取当前线程对象的名字 + String name = Thread.currentThread().getName(); + System.out.println(name+"正在卖:"+ticket--); + } + } + } + } +} +~~~ + +当使用了同步代码块后,上述的线程的安全问题,解决了。 + +### 2.4 同步方法 + +* **同步方法**:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。 + +格式: + +~~~java +public synchronized void method(){ + 可能会产生线程安全问题的代码 +} +~~~ + +> 同步锁是谁? +> +> ​ 对于非static方法,同步锁就是this。 +> +> ​ 对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。 + +使用同步方法代码如下: + +~~~java +public class Ticket implements Runnable{ + private int ticket = 100; + /* + * 执行卖票操作 + */ + @Override + public void run() { + //每个窗口卖票的操作 + //窗口 永远开启 + while(true){ + sellTicket(); + } + } + + /* + * 锁对象 是 谁调用这个方法 就是谁 + * 隐含 锁对象 就是 this + * + */ + public synchronized void sellTicket(){ + if(ticket>0){//有票 可以卖 + //出票操作 + //使用sleep模拟一下出票时间 + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //获取当前线程对象的名字 + String name = Thread.currentThread().getName(); + System.out.println(name+"正在卖:"+ticket--); + } + } +} +~~~ + +### 2.5 Lock锁 + +`java.util.concurrent.locks.Lock`机制提供了比**synchronized**代码块和**synchronized**方法更广泛的锁定操作,同步代码块/同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象。 + +Lock锁也称同步锁,加锁与释放锁方法化了,如下: + +* `public void lock() `:加同步锁。 +* `public void unlock()`:释放同步锁。 + +使用如下: + +~~~java +public class Ticket implements Runnable{ + private int ticket = 100; + + Lock lock = new ReentrantLock(); + /* + * 执行卖票操作 + */ + @Override + public void run() { + //每个窗口卖票的操作 + //窗口 永远开启 + while(true){ + lock.lock(); + if(ticket>0){//有票 可以卖 + //出票操作 + //使用sleep模拟一下出票时间 + try { + Thread.sleep(50); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //获取当前线程对象的名字 + String name = Thread.currentThread().getName(); + System.out.println(name+"正在卖:"+ticket--); + } + lock.unlock(); + } + } +} +~~~ + +## 第三章 等待唤醒机制 + +### 3.1 线程间通信 + +**概念:**多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。 + +比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。 + + + +**为什么要处理线程间通信:** + +多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。 + +**如何保证线程间通信有效利用资源:** + +多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。 就是多个线程在操作同一份数据时, 避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能有效的利用资源。而这种手段即—— **等待唤醒机制。** + +### 3.2 等待唤醒机制 + +**什么是等待唤醒机制** + +这是多个线程间的一种**协作**机制。谈到线程我们经常想到的是线程间的**竞争(race)**,比如去争夺锁,但这并不是故事的全部,线程间也会有协作机制。就好比在公司里你和你的同事们,你们可能存在在晋升时的竞争,但更多时候你们更多是一起合作以完成某些任务。 + +就是在一个线程进行了规定操作后,就进入等待状态(**wait()**), 等待其他线程执行完他们的指定代码过后 再将其唤醒(**notify()**);在有多个线程进行等待时, 如果需要,可以使用 notifyAll()来唤醒所有的等待线程。 + +wait/notify 就是线程间的一种协作机制。 + +**等待唤醒中的方法** + +等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下: + +1. wait:线程不再活动,不再参与调度,进入 wait set 中,因此不会浪费 CPU 资源,也不会去竞争锁了,这时的线程状态即是 WAITING。它还要执行一个**特别的动作**,也即是“**通知(notify)**”在这个对象上等待的线程从wait set 中释放出来,重新进入到调度队列(ready queue)中 +2. notify:则选取所通知对象的 wait set 中的一个线程释放;例如,餐馆有空位置后,等候就餐最久的顾客最先入座。 +3. notifyAll:则释放所通知对象的 wait set 上的全部线程。 + +> 注意: +> +> 哪怕只通知了一个等待的线程,被通知线程也不能立即恢复执行,因为它当初中断的地方是在同步块内,而此刻它已经不持有锁,所以她需要再次尝试去获取锁(很可能面临其它线程的竞争),成功后才能在当初调用 wait 方法之后的地方恢复执行。 +> +> 总结如下: +> +> - 如果能获取锁,线程就从 WAITING 状态变成 RUNNABLE 状态; +> - 否则,从 wait set 出来,又进入 entry set,线程就从 WAITING 状态又变成 BLOCKED 状态 + +**调用wait和notify方法需要注意的细节** + +1. wait方法与notify方法必须要由同一个锁对象调用。因为:对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后的线程。 +2. wait方法与notify方法是属于Object类的方法的。因为:锁对象可以是任意对象,而任意对象的所属类都是继承了Object类的。 +3. wait方法与notify方法必须要在同步代码块或者是同步函数中使用。因为:必须要通过锁对象调用这2个方法。 + +### 3.3 生产者与消费者问题 + +等待唤醒机制其实就是经典的“生产者与消费者”的问题。 + +就拿生产包子消费包子来说等待唤醒机制如何有效利用资源: + +```java +包子铺线程生产包子,吃货线程消费包子。当包子没有时(包子状态为false),吃货线程等待,包子铺线程生产包子(即包子状态为true),并通知吃货线程(解除吃货的等待状态),因为已经有包子了,那么包子铺线程进入等待状态。接下来,吃货线程能否进一步执行则取决于锁的获取情况。如果吃货获取到锁,那么就执行吃包子动作,包子吃完(包子状态为false),并通知包子铺线程(解除包子铺的等待状态),吃货线程进入等待。包子铺线程能否进一步执行则取决于锁的获取情况。 +``` + +**代码演示:** + +包子资源类: + +```java +public class BaoZi { + String pier ; + String xianer ; + boolean flag = false ;//包子资源 是否存在 包子资源状态 +} +``` + +吃货线程类: + +```java +public class ChiHuo extends Thread{ + private BaoZi bz; + + public ChiHuo(String name,BaoZi bz){ + super(name); + this.bz = bz; + } + @Override + public void run() { + while(true){ + synchronized (bz){ + if(bz.flag == false){//没包子 + try { + bz.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("吃货正在吃"+bz.pier+bz.xianer+"包子"); + bz.flag = false; + bz.notify(); + } + } + } +} +``` + +包子铺线程类: + +```java +public class BaoZiPu extends Thread { + + private BaoZi bz; + + public BaoZiPu(String name,BaoZi bz){ + super(name); + this.bz = bz; + } + + @Override + public void run() { + int count = 0; + //造包子 + while(true){ + //同步 + synchronized (bz){ + if(bz.flag == true){//包子资源 存在 + try { + + bz.wait(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + // 没有包子 造包子 + System.out.println("包子铺开始做包子"); + if(count%2 == 0){ + // 冰皮 五仁 + bz.pier = "冰皮"; + bz.xianer = "五仁"; + }else{ + // 薄皮 牛肉大葱 + bz.pier = "薄皮"; + bz.xianer = "牛肉大葱"; + } + count++; + + bz.flag=true; + System.out.println("包子造好了:"+bz.pier+bz.xianer); + System.out.println("吃货来吃吧"); + //唤醒等待线程 (吃货) + bz.notify(); + } + } + } +} +``` + +测试类: + +```java +public class Demo { + public static void main(String[] args) { + //等待唤醒案例 + BaoZi bz = new BaoZi(); + + ChiHuo ch = new ChiHuo("吃货",bz); + BaoZiPu bzp = new BaoZiPu("包子铺",bz); + + ch.start(); + bzp.start(); + } +} +``` + +执行效果: + +```java +包子铺开始做包子 +包子造好了:冰皮五仁 +吃货来吃吧 +吃货正在吃冰皮五仁包子 +包子铺开始做包子 +包子造好了:薄皮牛肉大葱 +吃货来吃吧 +吃货正在吃薄皮牛肉大葱包子 +包子铺开始做包子 +包子造好了:冰皮五仁 +吃货来吃吧 +吃货正在吃冰皮五仁包子 +``` + +## 第四章 线程状态 + +### 4.1 线程状态概述 + +当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中`java.lang.Thread.State`这个枚举中给出了六种线程状态: + +这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细解析 + +| 线程状态 | 导致状态发生条件 | +| ------------------- | ---------------------------------------- | +| NEW(新建) | 线程刚被创建,但是并未启动。还没调用start方法。 | +| Runnable(可运行) | 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。 | +| Blocked(锁阻塞) | 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。 | +| Waiting(无限等待) | 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。 | +| Timed Waiting(计时等待) | 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。 | +| Teminated(被终止) | 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。 | + +我们不需要去研究这几种状态的实现原理,我们只需知道在做线程操作中存在这样的状态。那我们怎么去理解这几个状态呢,新建与被终止还是很容易理解的,我们就研究一下线程从Runnable(可运行)状态与非运行状态之间的转换问题。 + +### 4.2 Timed Waiting(计时等待) + +Timed Waiting在API中的描述为:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。单独的去理解这句话,真是玄之又玄,其实我们在之前的操作中已经接触过这个状态了,在哪里呢? + +在我们写卖票的案例中,为了减少线程执行太快,现象不明显等问题,我们在run方法中添加了sleep语句,这样就强制当前正在执行的线程休眠(**暂停执行**),以“减慢线程”。 + +其实当我们调用了sleep方法之后,当前执行的线程就进入到“休眠状态”,其实就是所谓的Timed Waiting(计时等待),那么我们通过一个案例加深对该状态的一个理解。 + +**实现一个计数器,计数到100,在每个数字之间暂停1秒,每隔10个数字输出一个字符串** + +代码: + +~~~java +public class MyThread extends Thread { + public void run() { + for (int i = 0; i < 100; i++) { + if ((i) % 10 == 0) { + System.out.println("-------" + i); + } + System.out.print(i); + try { + Thread.sleep(1000); + System.out.print(" 线程睡眠1秒!\n"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + public static void main(String[] args) { + new MyThread().start(); + } +} +~~~ + +通过案例可以发现,sleep方法的使用还是很简单的。我们需要记住下面几点: + +1. 进入 TIMED_WAITING 状态的一种常见情形是调用的 sleep 方法,单独的线程也可以调用,不一定非要有协作关系。 +2. 为了让其他线程有机会执行,可以将Thread.sleep()的调用**放线程run()之内**。这样才能保证该线程执行过程中会睡眠 +3. sleep与锁无关,线程睡眠到期自动苏醒,并返回到Runnable(可运行)状态。 + +> 小提示:sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始立刻执行。 + +Timed Waiting 线程状态图:![](img\计时等待.png) + +### 4.3 BLOCKED(锁阻塞) + +Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。 + +我们已经学完同步机制,那么这个状态是非常好理解的了。比如,线程A与线程B代码中使用同一锁,如果线程A获取到锁,线程A进入到Runnable状态,那么线程B就进入到Blocked锁阻塞状态。 + +这是由Runnable状态进入Blocked状态。除此Waiting以及Time Waiting状态也会在某种情况下进入阻塞状态,而这部分内容作为扩充知识点带领大家了解一下。 + +Blocked 线程状态图![](img\锁阻塞.png) + + + +### 4.4 Waiting(无限等待) + +**Wating状态**:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。 + +那么我们之前遇到过这种状态吗?答案是并没有,但并不妨碍我们进行一个简单深入的了解。我们通过一段代码即生产者和消费者线程来学习一下: + +注意: + +让线程无线等待,我们需要使用wait方法,而唤醒线程应该使用notify(唤醒单个线程)或者notifyAll(唤醒所有线程)方法。所以我们先熟悉下这几个方法。 + +​ A:wait()让线程等待; + +​ B:notify()唤醒某个等待中的线程; + +​ C:notifyAll()唤醒所有等待的线程; + +通过查阅API我们发现这三个方法都位于Object类中,并不是Thread类中。 + +问题:为什么这几个方法,要定义在Object类中呢? + +思考:线程的等待和唤醒应该由谁来控制? + +​ 线程有很多,控制线程的一定是跟多个线程都有关系的对象。--------》锁对象。 + +​ 锁对象,本来就是控制线程运行的。因此,线程的等待和唤醒,就交给锁来控制。 + +线程等待和唤醒应该由锁来完成。 + +锁对象可以是任意的,任意对象都可以调用这几个方法。任意对象都可以调用的方法,必须定义在Object类中。 + +Waiting 线程状态图![](img\无限等待.png) + +### 4.5 补充知识点 + +到此为止我们已经对线程状态有了基本的认识,想要有更多的了解,详情可以见下图: + +![](img\线程状态图.png) + +> 一条有意思的tips: +> +> 我们在翻阅API的时候会发现Timed Waiting(计时等待) 与 Waiting(无限等待) 状态联系还是很紧密的,比如Waiting(无限等待) 状态中wait方法是空参的,而timed waiting(计时等待) 中wait方法是带参的。这种带参的方法,其实是一种倒计时操作,相当于我们生活中的小闹钟,我们设定好时间,到时通知,可是如果提前得到(唤醒)通知,那么设定好时间在通知也就显得多此一举了,那么这种设计方案其实是一举两得。如果没有得到(唤醒)通知,那么线程就处于Timed Waiting状态,直到倒计时完毕自动醒来;如果在倒计时期间得到(唤醒)通知,那么线程从Timed Waiting状态立刻唤醒。 \ No newline at end of file diff --git a/javaSE2/day06/img/无限等待.png b/javaSE2/day06/img/无限等待.png new file mode 100644 index 0000000..73c2370 Binary files /dev/null and b/javaSE2/day06/img/无限等待.png differ diff --git a/javaSE2/day06/img/栈内存原理图.bmp b/javaSE2/day06/img/栈内存原理图.bmp new file mode 100644 index 0000000..9a037c6 Binary files /dev/null and b/javaSE2/day06/img/栈内存原理图.bmp differ diff --git a/javaSE2/day06/img/线程安全问题.png b/javaSE2/day06/img/线程安全问题.png new file mode 100644 index 0000000..98e2957 Binary files /dev/null and b/javaSE2/day06/img/线程安全问题.png differ diff --git a/javaSE2/day06/img/线程流程图.png b/javaSE2/day06/img/线程流程图.png new file mode 100644 index 0000000..8f8f190 Binary files /dev/null and b/javaSE2/day06/img/线程流程图.png differ diff --git a/javaSE2/day06/img/线程状态图.png b/javaSE2/day06/img/线程状态图.png new file mode 100644 index 0000000..b4335b1 Binary files /dev/null and b/javaSE2/day06/img/线程状态图.png differ diff --git a/javaSE2/day06/img/计时等待.png b/javaSE2/day06/img/计时等待.png new file mode 100644 index 0000000..d32eda0 Binary files /dev/null and b/javaSE2/day06/img/计时等待.png differ diff --git a/javaSE2/day06/img/锁阻塞.png b/javaSE2/day06/img/锁阻塞.png new file mode 100644 index 0000000..6efc773 Binary files /dev/null and b/javaSE2/day06/img/锁阻塞.png differ diff --git a/javaSE2/day07/day07【Lambda、函数式接口、Stream流】.md b/javaSE2/day07/day07【Lambda、函数式接口、Stream流】.md new file mode 100644 index 0000000..affa8b1 --- /dev/null +++ b/javaSE2/day07/day07【Lambda、函数式接口、Stream流】.md @@ -0,0 +1,866 @@ +# day07【Lambda、函数式接口、Stream流】 + +### 主要内容 + +* Lambda表达式 +* 函数式接口 +* Stream流 + +### 教学目标 + +- [ ] 能够理解函数式编程相对于面向对象的优点 +- [ ] 能够掌握Lambda表达式的标准格式 +- [ ] 能够掌握Lambda表达式的省略格式与规则 +- [ ] 能够使用Consumer<T>函数式接口 +- [ ] 能够使用Predicate<T>函数式接口 +- [ ] 能够理解流与集合相比的优点 +- [ ] 能够掌握常用的流操作 + +## 第一章 Lambda表达式 + +### 1.1 函数式编程思想概述 + +![](img/03-Overview.png) + +在数学中,**函数**就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——**强调做什么,而不是以什么形式做**。 + +**做什么,而不是怎么做** + +我们真的希望创建一个匿名内部类对象吗?不。我们只是为了做这件事情而**不得不**创建一个对象。我们真正希望做的事情是:将`run`方法体内的代码传递给`Thread`类知晓。 + +**传递一段代码**——这才是我们真正的目的。而创建对象只是受限于面向对象语法而不得不采取的一种手段方式。那,有没有更加简单的办法?如果我们将关注点从“怎么做”回归到“做什么”的本质上,就会发现只要能够更好地达到目的,过程与形式其实并不重要。 + +### 1.2 Lambda的优化 + +当需要启动一个线程去完成任务时,通常会通过`java.lang.Runnable`接口来定义任务内容,并使用`java.lang.Thread`类来启动该线程。 + +**传统写法,代码如下:** + +```java +public class Demo03Thread { + public static void main(String[] args) { + new Thread(new Runnable() { + @Override + public void run() { + System.out.println("多线程任务执行!"); + } + }).start(); + } +} +``` + +本着“一切皆对象”的思想,这种做法是无可厚非的:首先创建一个`Runnable`接口的匿名内部类对象来指定任务内容,再将其交给一个线程来启动。 + +**代码分析:** + +对于`Runnable`的匿名内部类用法,可以分析出几点内容: + +- `Thread`类需要`Runnable`接口作为参数,其中的抽象`run`方法是用来指定线程任务内容的核心; +- 为了指定`run`的方法体,**不得不**需要`Runnable`接口的实现类; +- 为了省去定义一个`RunnableImpl`实现类的麻烦,**不得不**使用匿名内部类; +- 必须覆盖重写抽象`run`方法,所以方法名称、方法参数、方法返回值**不得不**再写一遍,且不能写错; +- 而实际上,**似乎只有方法体才是关键所在**。 + + + +![](img/02-Lambda.png) + +**Lambda表达式写法,代码如下:** + +借助Java 8的全新语法,上述`Runnable`接口的匿名内部类写法可以通过更简单的Lambda表达式达到等效: + +```java +public class Demo04LambdaRunnable { + public static void main(String[] args) { + new Thread(() -> System.out.println("多线程任务执行!")).start(); // 启动线程 + } +} +``` + +这段代码和刚才的执行效果是完全一样的,可以在1.8或更高的编译级别下通过。从代码的语义中可以看出:我们启动了一个线程,而线程任务的内容以一种更加简洁的形式被指定。 + +不再有“不得不创建接口对象”的束缚,不再有“抽象方法覆盖重写”的负担,就是这么简单! + +### 1.3 Lambda的格式 + +#### 标准格式: + +Lambda省去面向对象的条条框框,格式由**3个部分**组成: + +* 一些参数 +* 一个箭头 +* 一段代码 + +Lambda表达式的**标准格式**为: + +``` +(参数类型 参数名称) -> { 代码语句 } +``` + +**格式说明:** + +* 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。 +* `->`是新引入的语法格式,代表指向动作。 +* 大括号内的语法与传统方法体要求基本一致。 + +**匿名内部类与lambda对比:** + +```java +new Thread(new Runnable() { + @Override + public void run() { + System.out.println("多线程任务执行!"); + } +}).start(); +``` + +仔细分析该代码中,`Runnable`接口只有一个`run`方法的定义: + +- `public abstract void run();` + +即制定了一种做事情的方案(其实就是一个方法): + +- **无参数**:不需要任何条件即可执行该方案。 +- **无返回值**:该方案不产生任何结果。 +- **代码块**(方法体):该方案的具体执行步骤。 + +同样的语义体现在`Lambda`语法中,要更加简单: + +```java +() -> System.out.println("多线程任务执行!") +``` + +- 前面的一对小括号即`run`方法的参数(无),代表不需要任何条件; +- 中间的一个箭头代表将前面的参数传递给后面的代码; +- 后面的输出语句即业务逻辑代码。 + +#### 参数和返回值: + +下面举例演示`java.util.Comparator<T>`接口的使用场景代码,其中的抽象方法定义为: + +* `public abstract int compare(T o1, T o2);` + +当需要对一个对象数组进行排序时,`Arrays.sort`方法需要一个`Comparator`接口实例来指定排序的规则。假设有一个`Person`类,含有`String name`和`int age`两个成员变量: + +```java +public class Person { + private String name; + private int age; + + // 省略构造器、toString方法与Getter Setter +} +``` + +**传统写法** + +如果使用传统的代码对`Person[]`数组进行排序,写法如下: + +```java +public class Demo05Comparator { + public static void main(String[] args) { + // 本来年龄乱序的对象数组 + Person[] array = { new Person("古力娜扎", 19), new Person("迪丽热巴", 18), new Person("马尔扎哈", 20) }; + + // 匿名内部类 + Comparator comp = new Comparator() { + @Override + public int compare(Person o1, Person o2) { + return o1.getAge() - o2.getAge(); + } + }; + Arrays.sort(array, comp); // 第二个参数为排序规则,即Comparator接口实例 + + for (Person person : array) { + System.out.println(person); + } + } +} +``` + +这种做法在面向对象的思想中,似乎也是“理所当然”的。其中`Comparator`接口的实例(使用了匿名内部类)代表了“按照年龄从小到大”的排序规则。 + +**代码分析** + +下面我们来搞清楚上述代码真正要做什么事情。 + +- 为了排序,`Arrays.sort`方法需要排序规则,即`Comparator`接口的实例,抽象方法`compare`是关键; +- 为了指定`compare`的方法体,**不得不**需要`Comparator`接口的实现类; +- 为了省去定义一个`ComparatorImpl`实现类的麻烦,**不得不**使用匿名内部类; +- 必须覆盖重写抽象`compare`方法,所以方法名称、方法参数、方法返回值**不得不**再写一遍,且不能写错; +- 实际上,**只有参数和方法体才是关键**。 + +**Lambda写法** + +```java +public class Demo06ComparatorLambda { + public static void main(String[] args) { + Person[] array = { + new Person("古力娜扎", 19), + new Person("迪丽热巴", 18), + new Person("马尔扎哈", 20) }; + + Arrays.sort(array, (Person a, Person b) -> { + return a.getAge() - b.getAge(); + }); + + for (Person person : array) { + System.out.println(person); + } + } +} +``` + +#### 省略格式: + +**省略规则** + +在Lambda标准格式的基础上,使用省略写法的规则为: + +1. 小括号内参数的类型可以省略; +2. 如果小括号内**有且仅有一个参**,则小括号可以省略; +3. 如果大括号内**有且仅有一个语句**,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。 + +> 备注:掌握这些省略规则后,请对应地回顾本章开头的多线程案例。 + +**可推导即可省略** + +Lambda强调的是“做什么”而不是“怎么做”,所以凡是可以推导得知的信息,都可以省略。例如上例还可以使用Lambda的省略写法: + +```java +Runnable接口简化: +1. () -> System.out.println("多线程任务执行!") +Comparator接口简化: +2. Arrays.sort(array, (a, b) -> a.getAge() - b.getAge()); +``` + +### 1.4 Lambda的前提条件 + +Lambda的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意: + +1. 使用Lambda必须具有接口,且要求**接口中有且仅有一个抽象方法**。 + 无论是JDK内置的`Runnable`、`Comparator`接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。 +2. 使用Lambda必须具有接口作为方法参数。 + 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。 + +> 备注:有且仅有一个抽象方法的接口,称为“**函数式接口**”。 + +## 第二章 函数式接口 + +### 2.1 概述 + +函数式接口在Java中是指:**有且仅有一个抽象方法的接口**。 + +函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。 + +> 备注:从应用层面来讲,Java中的Lambda可以看做是匿名内部类的简化格式,但是二者在原理上不同。 + +#### 格式 + +只要确保接口中有且仅有一个抽象方法即可: + +```java +修饰符 interface 接口名称 { + public abstract 返回值类型 方法名称(可选参数信息); + // 其他非抽象方法内容 +} +``` + +由于接口当中抽象方法的`public abstract`是可以省略的,所以定义一个函数式接口很简单: + +```java +public interface MyFunctionalInterface { + void myMethod(); +} +``` + +#### 自定义函数式接口 + +对于刚刚定义好的`MyFunctionalInterface`函数式接口,典型使用场景就是作为方法的参数: + +```java +public class Demo07FunctionalInterface { + // 使用自定义的函数式接口作为方法参数 + private static void doSomething(MyFunctionalInterface inter) { + inter.myMethod(); // 调用自定义的函数式接口方法 + } + + public static void main(String[] args) { + // 调用使用函数式接口的方法 + doSomething(() -> System.out.println("Lambda执行啦!")); + } +} +``` + +#### FunctionalInterface注解 + +与`@Override`注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解:`@FunctionalInterface`。该注解可用于一个接口的定义上: + +```java +@FunctionalInterface +public interface MyFunctionalInterface { + void myMethod(); +} +``` + +一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。不过,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。 + +### 2.2 常用函数式接口 + +JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在`java.util.function`包中被提供。下面是两个常用的函数式接口及使用示例。 + +#### Consumer接口 + +`java.util.function.Consumer<T>`接口,是**消费**一个数据,其数据类型由泛型参数决定。 + +**抽象方法:accept** + +`Consumer`接口中包含抽象方法`void accept(T t)`: 消费一个指定泛型的数据。 + +基本使用如: + +```java +//给你一个字符串,请按照大写的方式进行消费 +import java.util.function.Consumer; +public class Demo08Consumer { + public static void main(String[] args) { + String str = "Hello World"; + //1.lambda表达式标准格式 + fun(str,(String s)->{ + System.out.println(s.toUpperCase()); + }); + //2.lambda表达式简化格式 + fun(str,s-> System.out.println(s.toUpperCase())); + } + /* + 定义方法,使用Consumer接口作为参数 + fun方法: 消费一个String类型的变量 + */ + public static void fun(String s,Consumer con) { + con.accept(s); + } +} + +``` + + + +#### Predicate接口 + +有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用`java.util.function.Predicate<T>`接口。 + +**抽象方法:test** + +`Predicate`接口中包含一个抽象方法:`boolean test(T t)`。用于条件判断的场景: + +```java +//1.练习:判断字符串长度是否大于5 +//2.练习:判断字符串是否包含"H" +public class Demo09Predicate { + private static void method(Predicate predicate,String str) { + boolean veryLong = predicate.test(str); + System.out.println("字符串很长吗:" + veryLong); + } + + public static void main(String[] args) { + method(s -> s.length() > 5, "HelloWorld"); + } +} +``` + +条件判断的标准是传入的Lambda表达式逻辑,只要字符串长度大于5则认为很长。 + + + +## 第三章 Stream流 + +在Java 8中,得益于Lambda所带来的函数式编程,引入了一个**全新的Stream概念**,用于解决已有集合类库既有的弊端。 + +### 3.1 引言 + +**传统集合的多步遍历代码** + +几乎所有的集合(如`Collection`接口或`Map`接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。例如: + +```java +public class Demo10ForEach { + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add("张无忌"); + list.add("周芷若"); + list.add("赵敏"); + list.add("张强"); + list.add("张三丰"); + for (String name : list) { + System.out.println(name); + } + } +} +``` + +这是一段非常简单的集合遍历操作:对集合中的每一个字符串都进行打印输出操作。 + +**循环遍历的弊端** + +Java 8的Lambda让我们可以更加专注于**做什么**(What),而不是**怎么做**(How),这点此前已经结合内部类进行了对比说明。现在,我们仔细体会一下上例代码,可以发现: + +- for循环的语法就是“**怎么做**” +- for循环的循环体才是“**做什么**” + +为什么使用循环?因为要进行遍历。但循环是遍历的唯一方式吗?遍历是指每一个元素逐一进行处理,**而并不是从第一个到最后一个顺次处理的循环**。前者是目的,后者是方式。 + +试想一下,如果希望对集合中的元素进行筛选过滤: + +1. 将集合A根据条件一过滤为**子集B**; +2. 然后再根据条件二过滤为**子集C**。 + +那怎么办?在Java 8之前的做法可能为: + +这段代码中含有三个循环,每一个作用不同: + +1. 首先筛选所有姓张的人; +2. 然后筛选名字有三个字的人; +3. 最后进行对结果进行打印输出。 + +```java +public class Demo11NormalFilter { + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add("张无忌"); + list.add("周芷若"); + list.add("赵敏"); + list.add("张强"); + list.add("张三丰"); + + List zhangList = new ArrayList<>(); + for (String name : list) { + if (name.startsWith("张")) { + zhangList.add(name); + } + } + + List shortList = new ArrayList<>(); + for (String name : zhangList) { + if (name.length() == 3) { + shortList.add(name); + } + } + + for (String name : shortList) { + System.out.println(name); + } + } +} +``` + +每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。这是理所当然的么?**不是。**循环是做事情的方式,而不是目的。另一方面,使用线性循环就意味着只能遍历一次。如果希望再次遍历,只能再使用另一个循环从头开始。 + +那,Lambda的衍生物Stream能给我们带来怎样更加优雅的写法呢? + +**Stream的更优写法** + +下面来看一下借助Java 8的Stream API,什么才叫优雅: + +```java +public class Demo12StreamFilter { + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add("张无忌"); + list.add("周芷若"); + list.add("赵敏"); + list.add("张强"); + list.add("张三丰"); + + list.stream() + .filter(s -> s.startsWith("张")) + .filter(s -> s.length() == 3) + .forEach(s -> System.out.println(s)); + } +} +``` + +直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:**获取流、过滤姓张、过滤长度为3、逐一打印**。代码中并没有体现使用线性循环或是其他任何算法进行遍历,我们真正要做的事情内容被更好地体现在代码中。 + +### 3.2 流式思想概述 + +**注意:请暂时忘记对传统IO流的固有印象!** + +整体来看,流式思想类似于工厂车间的“**生产流水线**”。 + +![](img/02-流水线.jpeg) + +当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步骤方案,然后再按照方案去执行它。 + +![](img/01-流式思想示意图.png) + +这张图中展示了过滤、映射、跳过、计数等多步操作,这是一种集合元素的处理方案,而方案就是一种“函数模型”。图中的每一个方框都是一个“流”,调用指定的方法,可以从一个流模型转换为另一个流模型。而最右侧的数字3是最终结果。 + +这里的`filter`、`map`、`skip`都是在对函数模型进行操作,集合元素并没有真正被处理。只有当终结方法`count`执行的时候,整个模型才会按照指定策略执行操作。而这得益于Lambda的延迟执行特性。 + +> 备注:“Stream流”其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。 + +### 3.3 获取流方式 + +`java.util.stream.Stream<T>`是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。) + +获取一个流非常简单,有以下几种常用的方式: + +- 所有的`Collection`集合都可以通过`stream`默认方法获取流; +- `Stream`接口的静态方法`of`可以获取数组对应的流。 + +**方式1 : 根据Collection获取流** + +首先,`java.util.Collection`接口中加入了default方法`stream`用来获取流,所以其所有实现类均可获取流。 + +```java +import java.util.*; +import java.util.stream.Stream; +/* + 获取Stream流的方式 + + 1.Collection中 方法 + Stream stream() + 2.Stream接口 中静态方法 + of(T...t) 向Stream中添加多个数据 + */ +public class Demo13GetStream { + public static void main(String[] args) { + List list = new ArrayList<>(); + // ... + Stream stream1 = list.stream(); + + Set set = new HashSet<>(); + // ... + Stream stream2 = set.stream(); + } +} +``` + + + +**方式2: 根据数组获取流** + +如果使用的不是集合或映射而是数组,由于数组对象不可能添加默认方法,所以`Stream`接口中提供了静态方法`of`,使用很简单: + +```java +import java.util.stream.Stream; + +public class Demo14GetStream { + public static void main(String[] args) { + String[] array = { "张无忌", "张翠山", "张三丰", "张一元" }; + Stream stream = Stream.of(array); + } +} +``` + +> 备注:`of`方法的参数其实是一个可变参数,所以支持数组。 + +### 3.4 常用方法 + +流模型的操作很丰富,这里介绍一些常用的API。这些方法可以被分成两种: + +- **终结方法**:返回值类型不再是`Stream`接口自身类型的方法,因此不再支持类似`StringBuilder`那样的链式调用。本小节中,终结方法包括`count`和`forEach`方法。 +- **非终结方法**:返回值类型仍然是`Stream`接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方法均为非终结方法。) + +> 备注:本小节之外的更多方法,请自行参考API文档。 + +#### forEach : 逐一处理 + +虽然方法名字叫`forEach`,但是与for循环中的“for-each”昵称不同,该方法**并不保证元素的逐一消费动作在流中是被有序执行的**。 + +```java +void forEach(Consumer action); +``` + +该方法接收一个`Consumer`接口函数,会将每一个流元素交给该函数进行处理。例如: + +```java +import java.util.stream.Stream; + +public class Demo15StreamForEach { + public static void main(String[] args) { + Stream stream = Stream.of("大娃","二娃","三娃","四娃","五娃","六娃","七娃","爷爷","蛇精","蝎子精"); + //Stream stream = Stream.of("张无忌", "张三丰", "周芷若"); + stream.forEach((String str)->{System.out.println(str);}); + } +} +``` + +在这里,lambda表达式`(String str)->{System.out.println(str);}`就是一个Consumer函数式接口的示例。 + +#### filter:过滤 + +可以通过`filter`方法将一个流转换成另一个子集流。方法声明: + +```java +Stream filter(Predicate predicate); +``` + +该接口接收一个`Predicate`函数式接口参数(可以是一个Lambda)作为筛选条件。 + +**基本使用** + +Stream流中的`filter`方法基本使用的代码如: + +```java +public class Demo16StreamFilter { + public static void main(String[] args) { + Stream original = Stream.of("张无忌", "张三丰", "周芷若"); + Stream result = original.filter((String s) -> {return s.startsWith("张");}); + } +} +``` + +在这里通过Lambda表达式来指定了筛选的条件:必须姓张。 + +#### count:统计个数 + +正如旧集合`Collection`当中的`size`方法一样,流提供`count`方法来数一数其中的元素个数: + +```java +long count(); +``` + +该方法返回一个long值代表元素个数(不再像旧集合那样是int值)。基本使用: + +```java +public class Demo17StreamCount { + public static void main(String[] args) { + Stream original = Stream.of("张无忌", "张三丰", "周芷若"); + Stream result = original.filter(s -> s.startsWith("张")); + System.out.println(result.count()); // 2 + } +} +``` + + + +#### limit:取用前几个 + +`limit`方法可以对流进行截取,只取用前n个。方法签名: + +```java +Stream limit(long maxSize):获取Stream流对象中的前n个元素,返回一个新的Stream流对象 +``` + +参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作。基本使用: + +```java +import java.util.stream.Stream; + +public class Demo18StreamLimit { + public static void main(String[] args) { + Stream original = Stream.of("张无忌", "张三丰", "周芷若"); + Stream result = original.limit(2); + System.out.println(result.count()); // 2 + } +} +``` + +#### skip:跳过前几个 + +如果希望跳过前几个元素,可以使用`skip`方法获取一个截取之后的新流: + +```java +Stream skip(long n): 跳过Stream流对象中的前n个元素,返回一个新的Stream流对象 +``` + +如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。基本使用: + +```java +import java.util.stream.Stream; + +public class Demo19StreamSkip { + public static void main(String[] args) { + Stream original = Stream.of("张无忌", "张三丰", "周芷若"); + Stream result = original.skip(2); + System.out.println(result.count()); // 1 + } +} +``` + +#### concat:组合 + +如果有两个流,希望合并成为一个流,那么可以使用`Stream`接口的静态方法`concat`: + +```java +static Stream concat(Stream a, Stream b): 把参数列表中的两个Stream流对象a和b,合并成一个新的Stream流对象 +``` + +> 备注:这是一个静态方法,与`java.lang.String`当中的`concat`方法是不同的。 + +该方法的基本使用代码如: + +```java +import java.util.stream.Stream; + +public class Demo20StreamConcat { + public static void main(String[] args) { + Stream streamA = Stream.of("张无忌"); + Stream streamB = Stream.of("张翠山"); + Stream result = Stream.concat(streamA, streamB); + } +} +``` + + + +### 4.5 Stream综合案例 + +现在有两个`ArrayList`集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)**依次**进行以下若干操作步骤: + +1. 第一个队伍只要名字为3个字的成员姓名; +2. 第一个队伍筛选之后只要前3个人; +3. 第二个队伍只要姓张的成员姓名; +4. 第二个队伍筛选之后不要前2个人; +5. 将两个队伍合并为一个队伍; +6. 打印整个队伍的姓名信息。 + +两个队伍(集合)的代码如下: + +```java +public class Demo21ArrayListNames { + public static void main(String[] args) { + List one = new ArrayList<>(); + one.add("迪丽热巴"); + one.add("宋远桥"); + one.add("苏星河"); + one.add("老子"); + one.add("庄子"); + one.add("孙子"); + one.add("洪七公"); + + List two = new ArrayList<>(); + two.add("古力娜扎"); + two.add("张无忌"); + two.add("张三丰"); + two.add("赵丽颖"); + two.add("张二狗"); + two.add("张天爱"); + two.add("张三"); + // .... + } +} +``` + + + +**传统方式** + +使用for循环 , 示例代码: + +```java +public class Demo22ArrayListNames { + public static void main(String[] args) { + List one = new ArrayList<>(); + // ... + + List two = new ArrayList<>(); + // ... + + // 第一个队伍只要名字为3个字的成员姓名; + List oneA = new ArrayList<>(); + for (String name : one) { + if (name.length() == 3) { + oneA.add(name); + } + } + + // 第一个队伍筛选之后只要前3个人; + List oneB = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + oneB.add(oneA.get(i)); + } + + // 第二个队伍只要姓张的成员姓名; + List twoA = new ArrayList<>(); + for (String name : two) { + if (name.startsWith("张")) { + twoA.add(name); + } + } + + // 第二个队伍筛选之后不要前2个人; + List twoB = new ArrayList<>(); + for (int i = 2; i < twoA.size(); i++) { + twoB.add(twoA.get(i)); + } + + // 将两个队伍合并为一个队伍; + List totalNames = new ArrayList<>(); + totalNames.addAll(oneB); + totalNames.addAll(twoB); + + // 打印整个队伍的姓名信息。 + for (String name : totalNames) { + System.out.println(name); + } + } +} +``` + +运行结果为: + +``` +宋远桥 +苏星河 +洪七公 +张二狗 +张天爱 +张三 +``` + +**Stream方式** + +等效的Stream流式处理代码为: + +```java +public class Demo23StreamNames { + public static void main(String[] args) { + List one = new ArrayList<>(); + // ... + + List two = new ArrayList<>(); + // ... + + // 第一个队伍只要名字为3个字的成员姓名; + // 第一个队伍筛选之后只要前3个人; + Stream streamOne = one.stream().filter(s -> s.length() == 3).limit(3); + + // 第二个队伍只要姓张的成员姓名; + // 第二个队伍筛选之后不要前2个人; + Stream streamTwo = two.stream().filter(s -> s.startsWith("张")).skip(2); + + // 将两个队伍合并为一个队伍; + // 根据姓名创建Person对象; + // 打印整个队伍的Person对象信息。 + Stream.concat(streamOne, streamTwo).forEach(s->System.out.println(s)); + } +} +``` + +运行效果完全一样: + +``` +宋远桥 +苏星河 +洪七公 +张二狗 +张天爱 +张三 +``` + +### 4.6 函数拼接与终结方法[了解] + +在上述介绍的各种方法中,凡是返回值仍然为`Stream`接口的为**函数拼接方法**,它们支持链式调用;而返回值不再为`Stream`接口的为**终结方法**,不再支持链式调用。如下表所示: + +| 方法名 | 方法作用 | 方法种类 | 是否支持链式调用 | +| ------- | ---------- | -------- | ---------------- | +| count | 统计个数 | 终结 | 否 | +| forEach | 逐一处理 | 终结 | 否 | +| filter | 过滤 | 函数拼接 | 是 | +| limit | 取用前几个 | 函数拼接 | 是 | +| skip | 跳过前几个 | 函数拼接 | 是 | +| concat | 组合 | 函数拼接 | 是 | + + + diff --git a/javaSE2/day07/img/01-流式思想示意图.png b/javaSE2/day07/img/01-流式思想示意图.png new file mode 100644 index 0000000..01dfa84 Binary files /dev/null and b/javaSE2/day07/img/01-流式思想示意图.png differ diff --git a/javaSE2/day07/img/02-Lambda.png b/javaSE2/day07/img/02-Lambda.png new file mode 100644 index 0000000..eb17a82 Binary files /dev/null and b/javaSE2/day07/img/02-Lambda.png differ diff --git a/javaSE2/day07/img/02-流水线.jpeg b/javaSE2/day07/img/02-流水线.jpeg new file mode 100644 index 0000000..346a464 Binary files /dev/null and b/javaSE2/day07/img/02-流水线.jpeg differ diff --git a/javaSE2/day07/img/03-Overview.png b/javaSE2/day07/img/03-Overview.png new file mode 100644 index 0000000..0317588 Binary files /dev/null and b/javaSE2/day07/img/03-Overview.png differ diff --git a/javaSE2/day08/day08【File类、递归】.md b/javaSE2/day08/day08【File类、递归】.md new file mode 100644 index 0000000..57920ac --- /dev/null +++ b/javaSE2/day08/day08【File类、递归】.md @@ -0,0 +1,463 @@ +# day08【File类、递归】 + +### 主要内容 + +* File类 +* 递归 + + +### 教学目标 + +- [ ] 能够说出File对象的创建方式 +- [ ] 能够说出File类获取名称的方法名称 +- [ ] 能够说出File类获取绝对路径的方法名称 +- [ ] 能够说出File类获取文件大小的方法名称 +- [ ] 能够说出File类判断是否是文件的方法名称 +- [ ] 能够说出File类判断是否是文件夹的方法名称 +- [ ] 能够辨别相对路径和绝对路径 +- [ ] 能够遍历文件夹 +- [ ] 能够解释递归的含义 +- [ ] 能够使用递归的方式计算5的阶乘 +- [ ] 能够说出使用递归会内存溢出隐患的原因 + +## 第一章 File类 + +### 1.1 概述 + +`java.io.File` 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 + +### 1.2 构造方法 + +* `public File(String pathname) ` :通过将给定的**路径名字符串**转换为抽象路径名来创建新的 File实例。 +* `public File(String parent, String child) ` :从**父路径名字符串和子路径名字符串**创建新的 File实例。 +* `public File(File parent, String child)` :从**父抽象路径名和子路径名字符串**创建新的 File实例。 + + +* 构造举例,代码如下: + +```java +// 文件路径名 +String pathname = "D:\\aaa.txt"; +File file1 = new File(pathname); + +// 文件路径名 +String pathname2 = "D:\\aaa\\bbb.txt"; +File file2 = new File(pathname2); + +// 通过父路径和子路径字符串 + String parent = "d:\\aaa"; + String child = "bbb.txt"; + File file3 = new File(parent, child); + +// 通过父级File对象和子路径字符串 +File parentDir = new File("d:\\aaa"); +String child = "bbb.txt"; +File file4 = new File(parentDir, child); +``` + +> 小贴士: +> +> 1. 一个File对象代表硬盘中实际存在的一个文件或者目录。 +> 2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。 + +### 1.3 常用方法 + +#### 获取功能的方法 + +* `public String getAbsolutePath() ` :返回此File的绝对路径名字符串。 + +* ` public String getPath() ` :将此File转换为路径名字符串。 + +* `public String getName()` :返回由此File表示的文件或目录的名称。 + +* `public long length()` :返回由此File表示的文件的长度。 + + 方法演示,代码如下: + + ```java + public class FileGet { + public static void main(String[] args) { + File f = new File("d:/aaa/bbb.java"); + System.out.println("文件绝对路径:"+f.getAbsolutePath()); + System.out.println("文件构造路径:"+f.getPath()); + System.out.println("文件名称:"+f.getName()); + System.out.println("文件长度:"+f.length()+"字节"); + + File f2 = new File("d:/aaa"); + System.out.println("目录绝对路径:"+f2.getAbsolutePath()); + System.out.println("目录构造路径:"+f2.getPath()); + System.out.println("目录名称:"+f2.getName()); + System.out.println("目录长度:"+f2.length()); + } + } + 输出结果: + 文件绝对路径:d:\aaa\bbb.java + 文件构造路径:d:\aaa\bbb.java + 文件名称:bbb.java + 文件长度:636字节 + + 目录绝对路径:d:\aaa + 目录构造路径:d:\aaa + 目录名称:aaa + 目录长度:4096 + ``` + +> API中说明:length(),表示文件的长度。但是File对象表示目录,则返回值未指定。 + +#### 绝对路径和相对路径 + +* **绝对路径**:从盘符开始的路径,这是一个完整的路径。 +* **相对路径**:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。 + +```java +public class FilePath { + public static void main(String[] args) { + // D盘下的bbb.java文件 + File f = new File("D:\\bbb.java"); + System.out.println(f.getAbsolutePath()); + + // 项目下的bbb.java文件 + File f2 = new File("bbb.java"); + System.out.println(f2.getAbsolutePath()); + } +} +输出结果: +D:\bbb.java +D:\idea_project_test4\bbb.java +``` + +#### 判断功能的方法 + +- `public boolean exists()` :此File表示的文件或目录是否实际存在。 +- `public boolean isDirectory()` :此File表示的是否为目录。 +- `public boolean isFile()` :此File表示的是否为文件。 + + +方法演示,代码如下: + +```java +public class FileIs { + public static void main(String[] args) { + File f = new File("d:\\aaa\\bbb.java"); + File f2 = new File("d:\\aaa"); + // 判断是否存在 + System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists()); + System.out.println("d:\\aaa 是否存在:"+f2.exists()); + // 判断是文件还是目录 + System.out.println("d:\\aaa 文件?:"+f2.isFile()); + System.out.println("d:\\aaa 目录?:"+f2.isDirectory()); + } +} +输出结果: +d:\aaa\bbb.java 是否存在:true +d:\aaa 是否存在:true +d:\aaa 文件?:false +d:\aaa 目录?:true +``` + +#### 创建删除功能的方法 + +- `public boolean createNewFile()` :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 +- `public boolean delete()` :删除由此File表示的文件或目录。 +- `public boolean mkdir()` :创建由此File表示的目录。 +- `public boolean mkdirs()` :创建由此File表示的目录,包括任何必需但不存在的父目录。 + +方法演示,代码如下: + +```java +public class FileCreateDelete { + public static void main(String[] args) throws IOException { + // 文件的创建 + File f = new File("aaa.txt"); + System.out.println("是否存在:"+f.exists()); // false + System.out.println("是否创建:"+f.createNewFile()); // true + System.out.println("是否存在:"+f.exists()); // true + + // 目录的创建 + File f2= new File("newDir"); + System.out.println("是否存在:"+f2.exists());// false + System.out.println("是否创建:"+f2.mkdir()); // true + System.out.println("是否存在:"+f2.exists());// true + + // 创建多级目录 + File f3= new File("newDira\\newDirb"); + System.out.println(f3.mkdir());// false + File f4= new File("newDira\\newDirb"); + System.out.println(f4.mkdirs());// true + + // 文件的删除 + System.out.println(f.delete());// true + + // 目录的删除 + System.out.println(f2.delete());// true + System.out.println(f4.delete());// false + } +} +``` + +> API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。 + +### 1.4 目录的遍历 + +* `public String[] list()` :返回一个String数组,表示该File目录中的所有子文件或目录。 + + +* `public File[] listFiles()` :返回一个File数组,表示该File目录中的所有的子文件或目录。 + +```java +public class FileFor { + public static void main(String[] args) { + File dir = new File("d:\\java_code"); + + //获取当前目录下的文件以及文件夹的名称。 + String[] names = dir.list(); + for(String name : names){ + System.out.println(name); + } + //获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息 + File[] files = dir.listFiles(); + for (File file : files) { + System.out.println(file); + } + } +} +``` + +> 小贴士: +> +> 调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。 + +## 第二章 递归 + +### 2.1 概述 + +* **递归**:指在当前方法内调用自己的这种现象。 + +```java +public static void main(String[] args) { + System.out.println("main"); + main(args); +} +``` + +### 2.2 递归累和 + +#### 计算1 ~ n的和 + +**分析**:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。 + +**实现代码**: + +```java +public class DiGuiDemo { + public static void main(String[] args) { + //计算1~num的和,使用递归完成 + int num = 5; + // 调用求和的方法 + int sum = getSum(num); + // 输出结果 + System.out.println(sum); + + } + /* + 通过递归算法实现. + 参数列表:int + 返回值类型: int + */ + public static int getSum(int num) { + /* + num为1时,方法返回1, + 相当于是方法的出口,num总有是1的情况 + */ + if(num == 1){ + return 1; + } + /* + num不为1时,方法返回 num +(num-1)的累和 + 递归调用getSum方法 + */ + return num + getSum(num-1); + } +} +``` + +#### 代码执行图解 + +![](img/day08_01_递归累和.jpg) + +> 小贴士:递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。 + +### 2.3 递归求阶乘 + +* **阶乘**:所有小于及等于该数的正整数的积。 + +```java +n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1 +``` + +**分析**:这与累和类似,只不过换成了乘法运算,学员可以自己练习,需要注意阶乘值符合int类型的范围。 + +``` +推理得出:n! = n * (n-1)! +``` + +**代码实现**: + +```java +public class DiGuiDemo { + //计算n的阶乘,使用递归完成 + public static void main(String[] args) { + int n = 3; + // 调用求阶乘的方法 + int value = getValue(n); + // 输出结果 + System.out.println("阶乘为:"+ value); + } + /* + 通过递归算法实现. + 参数列表:int + 返回值类型: int + */ + public static int getValue(int n) { + // 1的阶乘为1 + if (n == 1) { + return 1; + } + /* + n不为1时,方法返回 n! = n*(n-1)! + 递归调用getValue方法 + */ + return n * getValue(n - 1); + } +} +``` + +### 2.4 递归打印多级目录 + +**分析**:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。 + +**代码实现**: + +```java +public class DiGuiDemo2 { + public static void main(String[] args) { + // 创建File对象 + File dir = new File("D:\\aaa"); + // 调用打印目录方法 + printDir(dir); + } + + public static void printDir(File dir) { + // 获取子文件和目录 + File[] files = dir.listFiles(); + // 循环打印 + /* + 判断: + 当是文件时,打印绝对路径. + 当是目录时,继续调用打印目录的方法,形成递归调用. + */ + for (File file : files) { + // 判断 + if (file.isFile()) { + // 是文件,输出文件绝对路径 + System.out.println("文件名:"+ file.getAbsolutePath()); + } else { + // 是目录,输出目录绝对路径 + System.out.println("目录:"+file.getAbsolutePath()); + // 继续遍历,调用printDir,形成递归 + printDir(file); + } + } + } +} +``` + +## 第三章 综合案例 + +### 3.1 文件搜索 + +搜索`D:\aaa` 目录中的`.java` 文件。 + +**分析**: + +1. 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。 +2. 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。 + +**代码实现**: + +```java +public class DiGuiDemo3 { + public static void main(String[] args) { + // 创建File对象 + File dir = new File("D:\\aaa"); + // 调用打印目录方法 + printDir(dir); + } + + public static void printDir(File dir) { + // 获取子文件和目录 + File[] files = dir.listFiles(); + + // 循环打印 + for (File file : files) { + if (file.isFile()) { + // 是文件,判断文件名并输出文件绝对路径 + if (file.getName().endsWith(".java")) { + System.out.println("文件名:" + file.getAbsolutePath()); + } + } else { + // 是目录,继续遍历,形成递归 + printDir(file); + } + } + } +} +``` + +### 3.2 文件过滤器优化 + +`java.io.FileFilter`是一个接口,是File的过滤器。 该接口的对象可以传递给File类的`listFiles(FileFilter)` 作为参数, 接口中只有一个方法。 + +`boolean accept(File pathname) ` :测试pathname是否应该包含在当前File目录中,符合则返回true。 + +**分析**: + +1. 接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。 +2. `accept`方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则: + 1. 要么是.java文件。 + 2. 要么是目录,用于继续遍历。 +3. 通过过滤器的作用,`listFiles(FileFilter)`返回的数组元素中,子文件对象都是符合条件的,可以直接打印。 + +**代码实现:** + +```java +public class DiGuiDemo4 { + public static void main(String[] args) { + File dir = new File("D:\\aaa"); + printDir2(dir); + } + + public static void printDir2(File dir) { + // 匿名内部类方式,创建过滤器子类对象 + File[] files = dir.listFiles(new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.getName().endsWith(".java")||pathname.isDirectory(); + } + }); + // 循环打印 + for (File file : files) { + if (file.isFile()) { + System.out.println("文件名:" + file.getAbsolutePath()); + } else { + printDir2(file); + } + } + } +} +``` + + + + + diff --git a/javaSE2/day08/img/day08_01_递归累和.jpg b/javaSE2/day08/img/day08_01_递归累和.jpg new file mode 100644 index 0000000..7cececa Binary files /dev/null and b/javaSE2/day08/img/day08_01_递归累和.jpg differ diff --git a/javaSE2/day09/day09【字节流、字符流】.md b/javaSE2/day09/day09【字节流、字符流】.md new file mode 100644 index 0000000..308107d --- /dev/null +++ b/javaSE2/day09/day09【字节流、字符流】.md @@ -0,0 +1,939 @@ +# day09【字节流、字符流】 + +### 主要内容 + +* IO流 +* 字节流 +* 字符流 +* 异常处理 +* Properties + +### 教学目标 +- [ ] 能够说出IO流的分类和功能 +- [ ] 能够使用字节输出流写出数据到文件 +- [ ] 能够使用字节输入流读取数据到程序 +- [ ] 能够理解读取数据read(byte[])方法的原理 +- [ ] 能够使用字节流完成文件的复制 +- [ ] 能够使用FileWirter写数据到文件 +- [ ] 能够说出FileWriter中关闭和刷新方法的区别 +- [ ] 能够使用FileWriter写数据的5个方法 +- [ ] 能够使用FileWriter写数据实现换行和追加写 +- [ ] 能够使用FileReader读数据 +- [ ] 能够使用FileReader读数据一次一个字符数组 +- [ ] 能够使用Properties的load方法加载文件中配置信息 + +## 第一章 IO概述 + +### 1.1 什么是IO + +生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了`ctrl+s` ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。 + +我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为`输入input` 和`输出output` ,即流向内存是输入流,流出内存的输出流。 + +Java中I/O操作主要是指使用`java.io`包下的内容,进行输入、输出操作。**输入**也叫做**读取**数据,**输出**也叫做作**写出**数据。 + +### 1.2 IO的分类 + +根据数据的流向分为:**输入流**和**输出流**。 + +* **输入流** :把数据从`其他设备`上读取到`内存`中的流。 +* **输出流** :把数据从`内存` 中写出到`其他设备`上的流。 + +格局数据的类型分为:**字节流**和**字符流**。 + +* **字节流** :以字节为单位,读写数据的流。 +* **字符流** :以字符为单位,读写数据的流。 + +### 1.3 IO的流向说明图解 + +![](img/1_io.jpg) + +### 1.4 顶级父类们 + +| | **输入流** | 输出流 | +| :-----: | :------------------------: | :-------------------------: | +| **字节流** | 字节输入流
**InputStream** | 字节输出流
**OutputStream** | +| **字符流** | 字符输入流
**Reader** | 字符输出流
**Writer** | + +## 第二章 字节流 + +### 2.1 一切皆为字节 + +一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。 + +### 2.2 字节输出流【OutputStream】 + +`java.io.OutputStream `抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。 + +* `public void close()` :关闭此输出流并释放与此流相关联的任何系统资源。 +* `public void flush() ` :刷新此输出流并强制任何缓冲的输出字节被写出。 +* `public void write(byte[] b)`:将 b.length字节从指定的字节数组写入此输出流。 +* `public void write(byte[] b, int off, int len)` :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 +* `public abstract void write(int b)` :将指定的字节输出流。 + +> 小贴士: +> +> close方法,当完成流的操作时,必须调用此方法,释放系统资源。 + +### 2.3 FileOutputStream类 + +`OutputStream`有很多子类,我们从最简单的一个子类开始。 + +`java.io.FileOutputStream `类是文件输出流,用于将数据写出到文件。 + +#### 构造方法 + +* `public FileOutputStream(File file)`:创建文件输出流以写入由指定的 File对象表示的文件。 +* `public FileOutputStream(String name)`: 创建文件输出流以指定的名称写入文件。 + +当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。 + +* 构造举例,代码如下: + +```java +public class FileOutputStreamConstructor throws IOException { + public static void main(String[] args) { + // 使用File对象创建流对象 + File file = new File("a.txt"); + FileOutputStream fos = new FileOutputStream(file); + + // 使用文件名称创建流对象 + FileOutputStream fos = new FileOutputStream("b.txt"); + } +} +``` + +#### 写出字节数据 + +1. **写出字节**:`write(int b)` 方法,每次可以写出一个字节数据,代码使用演示: + +```java +public class FOSWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileOutputStream fos = new FileOutputStream("fos.txt"); + // 写出数据 + fos.write(97); // 写出第1个字节 + fos.write(98); // 写出第2个字节 + fos.write(99); // 写出第3个字节 + // 关闭资源 + fos.close(); + } +} +输出结果: +abc +``` + +> 小贴士: +> +> 1. 虽然参数为int类型四个字节,但是只会保留一个字节的信息写出。 +> 2. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。 + +2. **写出字节数组**:`write(byte[] b)`,每次可以写出数组中的数据,代码使用演示: + +```java +public class FOSWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileOutputStream fos = new FileOutputStream("fos.txt"); + // 字符串转换为字节数组 + byte[] b = "java程序员".getBytes(); + // 写出字节数组数据 + fos.write(b); + // 关闭资源 + fos.close(); + } +} +输出结果: +java程序员 +``` + +3. **写出指定长度字节数组**:`write(byte[] b, int off, int len)` ,每次写出从off索引开始,len个字节,代码使用演示: + +```java +public class FOSWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileOutputStream fos = new FileOutputStream("fos.txt"); + // 字符串转换为字节数组 + byte[] b = "abcde".getBytes(); + // 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。 + fos.write(b,2,2); + // 关闭资源 + fos.close(); + } +} +输出结果: +cd +``` + +#### 数据追加续写 + +经过以上的演示,每次程序运行,创建输出流对象,都会清空目标文件中的数据。如何保留目标文件中数据,还能继续添加新数据呢? + +- `public FileOutputStream(File file, boolean append)`: 创建文件输出流以写入由指定的 File对象表示的文件。 +- `public FileOutputStream(String name, boolean append)`: 创建文件输出流以指定的名称写入文件。 + +这两个构造方法,参数中都需要传入一个boolean类型的值,`true` 表示追加数据,`false` 表示清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了,代码使用演示: + +```java +public class FOSWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileOutputStream fos = new FileOutputStream("fos.txt",true); + // 字符串转换为字节数组 + byte[] b = "abcde".getBytes(); + // 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。 + fos.write(b); + // 关闭资源 + fos.close(); + } +} +文件操作前:cd +文件操作后:cdabcde +``` + +#### 写出换行 + +Windows系统里,换行符号是`\r\n` 。把 + +以指定是否追加续写了,代码使用演示: + +```java +public class FOSWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileOutputStream fos = new FileOutputStream("fos.txt"); + // 定义字节数组 + byte[] words = {97,98,99,100,101}; + // 遍历数组 + for (int i = 0; i < words.length; i++) { + // 写出一个字节 + fos.write(words[i]); + // 写出一个换行, 换行符号转成数组写出 + fos.write("\r\n".getBytes()); + } + // 关闭资源 + fos.close(); + } +} + +输出结果: +a +b +c +d +e +``` + +> * 回车符`\r`和换行符`\n` : +> * 回车符:回到一行的开头(return)。 +> * 换行符:下一行(newline)。 +> * 系统中的换行: +> * Windows系统里,每行结尾是 `回车+换行` ,即`\r\n`; +> * Unix系统里,每行结尾只有 `换行` ,即`\n`; +> * Mac系统里,每行结尾是 `回车` ,即`\r`。从 Mac OS X开始与Linux统一。 + +### 2.4 字节输入流【InputStream】 + +`java.io.InputStream `抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。 + +- `public void close()` :关闭此输入流并释放与此流相关联的任何系统资源。 +- `public abstract int read()`: 从输入流读取数据的下一个字节。 +- `public int read(byte[] b)`: 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。 + +> 小贴士: +> +> close方法,当完成流的操作时,必须调用此方法,释放系统资源。 + +### 2.5 FileInputStream类 + +`java.io.FileInputStream `类是文件输入流,从文件中读取字节。 + +#### 构造方法 + +* `FileInputStream(File file)`: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 +* `FileInputStream(String name)`: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。 + +当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出`FileNotFoundException` 。 + +- 构造举例,代码如下: + +```java +public class FileInputStreamConstructor throws IOException{ + public static void main(String[] args) { + // 使用File对象创建流对象 + File file = new File("a.txt"); + FileInputStream fos = new FileInputStream(file); + + // 使用文件名称创建流对象 + FileInputStream fos = new FileInputStream("b.txt"); + } +} +``` + +#### 读取字节数据 + +1. **读取字节**:`read`方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回`-1`,代码使用演示: + +```java +public class FISRead { + public static void main(String[] args) throws IOException{ + // 使用文件名称创建流对象 + FileInputStream fis = new FileInputStream("read.txt"); + // 读取数据,返回一个字节 + int read = fis.read(); + System.out.println((char) read); + read = fis.read(); + System.out.println((char) read); + read = fis.read(); + System.out.println((char) read); + read = fis.read(); + System.out.println((char) read); + read = fis.read(); + System.out.println((char) read); + // 读取到末尾,返回-1 + read = fis.read(); + System.out.println( read); + // 关闭资源 + fis.close(); + } +} +输出结果: +a +b +c +d +e +-1 +``` + +循环改进读取方式,代码使用演示: + +```java +public class FISRead { + public static void main(String[] args) throws IOException{ + // 使用文件名称创建流对象 + FileInputStream fis = new FileInputStream("read.txt"); + // 定义变量,保存数据 + int b ; + // 循环读取 + while ((b = fis.read())!=-1) { + System.out.println((char)b); + } + // 关闭资源 + fis.close(); + } +} +输出结果: +a +b +c +d +e +``` + +> 小贴士: +> +> 1. 虽然读取了一个字节,但是会自动提升为int类型。 +> 2. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。 + +2. **使用字节数组读取**:`read(byte[] b)`,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回`-1` ,代码使用演示: + +```java +public class FISRead { + public static void main(String[] args) throws IOException{ + // 使用文件名称创建流对象. + FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde + // 定义变量,作为有效个数 + int len ; + // 定义字节数组,作为装字节数据的容器 + byte[] b = new byte[2]; + // 循环读取 + while (( len= fis.read(b))!=-1) { + // 每次读取后,把数组变成字符串打印 + System.out.println(new String(b)); + } + // 关闭资源 + fis.close(); + } +} + +输出结果: +ab +cd +ed +``` + +错误数据`d`,是由于最后一次读取时,只读取一个字节`e`,数组中,上次读取的数据没有被完全替换,所以要通过`len` ,获取有效的字节,代码使用演示: + +```java +public class FISRead { + public static void main(String[] args) throws IOException{ + // 使用文件名称创建流对象. + FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde + // 定义变量,作为有效个数 + int len ; + // 定义字节数组,作为装字节数据的容器 + byte[] b = new byte[2]; + // 循环读取 + while (( len= fis.read(b))!=-1) { + // 每次读取后,把数组的有效字节部分,变成字符串打印 + System.out.println(new String(b,0,len));// len 每次读取的有效字节个数 + } + // 关闭资源 + fis.close(); + } +} + +输出结果: +ab +cd +e +``` + +> 小贴士: +> +> 使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用。 + +### 2.6 字节流练习:图片复制 + +#### 复制原理图解 + +![](img/2_copy.jpg) + +#### 案例实现 + +复制图片文件,代码使用演示: + +```java +public class Copy { + public static void main(String[] args) throws IOException { + // 1.创建流对象 + // 1.1 指定数据源 + FileInputStream fis = new FileInputStream("D:\\test.jpg"); + // 1.2 指定目的地 + FileOutputStream fos = new FileOutputStream("test_copy.jpg"); + + // 2.读写数据 + // 2.1 定义数组 + byte[] b = new byte[1024]; + // 2.2 定义长度 + int len; + // 2.3 循环读取 + while ((len = fis.read(b))!=-1) { + // 2.4 写出数据 + fos.write(b, 0 , len); + } + + // 3.关闭资源 + fos.close(); + fis.close(); + } +} +``` + +> 小贴士: +> +> 流的关闭原则:先开后关,后开先关。 + +## 第三章 字符流 + +当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。 + +### 3.1 字符输入流【Reader】 + +`java.io.Reader`抽象类是表示用于读取字符流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。 + +- `public void close()` :关闭此流并释放与此流相关联的任何系统资源。 +- `public int read()`: 从输入流读取一个字符。 +- `public int read(char[] cbuf)`: 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。 + +### 3.2 FileReader类 + +`java.io.FileReader `类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。 + +> 小贴士: +> +> 1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。 +> +> idea中UTF-8 +> +> 2. 字节缓冲区:一个字节数组,用来临时存储字节数据。 + +#### 构造方法 + +- `FileReader(File file)`: 创建一个新的 FileReader ,给定要读取的File对象。 +- `FileReader(String fileName)`: 创建一个新的 FileReader ,给定要读取的文件的名称。 + +当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream 。 + +- 构造举例,代码如下: + +```java +public class FileReaderConstructor throws IOException{ + public static void main(String[] args) { + // 使用File对象创建流对象 + File file = new File("a.txt"); + FileReader fr = new FileReader(file); + + // 使用文件名称创建流对象 + FileReader fr = new FileReader("b.txt"); + } +} +``` + +#### 读取字符数据 + +1. **读取字符**:`read`方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回`-1`,循环读取,代码使用演示: + +```java +public class FRRead { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileReader fr = new FileReader("read.txt"); + // 定义变量,保存数据 + int b ; + // 循环读取 + while ((b = fr.read())!=-1) { + System.out.println((char)b); + } + // 关闭资源 + fr.close(); + } +} +输出结果: +黑 +马 +程 +序 +员 +``` + +> 小贴士:虽然读取了一个字符,但是会自动提升为int类型。 +> + +2. **使用字符数组读取**:`read(char[] cbuf)`,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回`-1` ,代码使用演示: + +```java +public class FRRead { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileReader fr = new FileReader("read.txt"); + // 定义变量,保存有效字符个数 + int len ; + // 定义字符数组,作为装字符数据的容器 + char[] cbuf = new char[2]; + // 循环读取 + while ((len = fr.read(cbuf))!=-1) { + System.out.println(new String(cbuf)); + } + // 关闭资源 + fr.close(); + } +} +输出结果: +黑马 +程序 +员序 +``` + +获取有效的字符改进,代码使用演示: + +```java +public class FISRead { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileReader fr = new FileReader("read.txt"); + // 定义变量,保存有效字符个数 + int len ; + // 定义字符数组,作为装字符数据的容器 + char[] cbuf = new char[2]; + // 循环读取 + while ((len = fr.read(cbuf))!=-1) { + System.out.println(new String(cbuf,0,len)); + } + // 关闭资源 + fr.close(); + } +} + +输出结果: +黑马 +程序 +员 +``` + +### 3.3 字符输出流【Writer】 + +`java.io.Writer `抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。 + +- `public abstract void close()` :关闭此输出流并释放与此流相关联的任何系统资源。 +- `public abstract void flush() ` :刷新此输出流并强制任何缓冲的输出字符被写出。 +- `public void write(int c)` :写出一个字符。 +- `public void write(char[] cbuf)`:将 b.length字符从指定的字符数组写出此输出流。 +- `public abstract void write(char[] b, int off, int len)` :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。 +- `public void write(String str)` :写出一个字符串。 + +### 3.4 FileWriter类 + +`java.io.FileWriter `类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。 + +#### 构造方法 + +- `FileWriter(File file)`: 创建一个新的 FileWriter,给定要读取的File对象。 +- `FileWriter(String fileName)`: 创建一个新的 FileWriter,给定要读取的文件的名称。 + +当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。 + +- 构造举例,代码如下: + +```java +public class FileWriterConstructor { + public static void main(String[] args) throws IOException { + // 使用File对象创建流对象 + File file = new File("a.txt"); + FileWriter fw = new FileWriter(file); + + // 使用文件名称创建流对象 + FileWriter fw = new FileWriter("b.txt"); + } +} +``` + +#### 基本写出数据 + +**写出字符**:`write(int b)` 方法,每次可以写出一个字符数据,代码使用演示: + +```java +public class FWWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileWriter fw = new FileWriter("fw.txt"); + // 写出数据 + fw.write(97); // 写出第1个字符 + fw.write('b'); // 写出第2个字符 + fw.write('C'); // 写出第3个字符 + fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。 + + /* + 【注意】关闭资源时,与FileOutputStream不同。 + 如果不关闭,数据只是保存到缓冲区,并未保存到文件。 + */ + // fw.close(); + } +} +输出结果: +abC田 +``` + +> 小贴士: +> +> 1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。 +> 2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。 + +#### 关闭和刷新 + +因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要`flush` 方法了。 + +* `flush` :刷新缓冲区,流对象可以继续使用。 +* `close` :关闭流,释放系统资源。关闭前会刷新缓冲区。 + +代码使用演示: + +```java +public class FWWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileWriter fw = new FileWriter("fw.txt"); + // 写出数据,通过flush + fw.write('刷'); // 写出第1个字符 + fw.flush(); + fw.write('新'); // 继续写出第2个字符,写出成功 + fw.flush(); + + // 写出数据,通过close + fw.write('关'); // 写出第1个字符 + fw.close(); + fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closed + fw.close(); + } +} +``` + +> 小贴士:即便是flush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。 + +#### 写出其他数据 + +1. **写出字符数组** :`write(char[] cbuf)` 和 `write(char[] cbuf, int off, int len)` ,每次可以写出字符数组中的数据,用法类似FileOutputStream,代码使用演示: + +```java +public class FWWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileWriter fw = new FileWriter("fw.txt"); + // 字符串转换为字节数组 + char[] chars = "java程序员".toCharArray(); + + // 写出字符数组 + fw.write(chars); // java程序员 + + // 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。 + fw.write(b,2,2); // 程序 + + // 关闭资源 + fos.close(); + } +} +``` + +2. **写出字符串**:`write(String str)` 和 `write(String str, int off, int len)` ,每次可以写出字符串中的数据,更为方便,代码使用演示: + +```java +public class FWWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象 + FileWriter fw = new FileWriter("fw.txt"); + // 字符串 + String msg = "java程序员"; + + // 写出字符数组 + fw.write(msg); //java程序员 + + // 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。 + fw.write(msg,2,2); // 程序 + + // 关闭资源 + fos.close(); + } +} +``` + +3. **续写和换行**:操作类似于FileOutputStream。 + +```java +public class FWWrite { + public static void main(String[] args) throws IOException { + // 使用文件名称创建流对象,可以续写数据 + FileWriter fw = new FileWriter("fw.txt",true); + // 写出字符串 + fw.write("黑马"); + // 写出换行 + fw.write("\r\n"); + // 写出字符串 + fw.write("程序员"); + // 关闭资源 + fw.close(); + } +} +输出结果: +黑马 +程序员 +``` + +> 小贴士:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。 + +## 第四章 IO异常的处理 + +#### JDK7前处理 + +之前的入门练习,我们一直把异常抛出,而实际开发中并不能这样处理,建议使用`try...catch...finally` 代码块,处理异常部分,代码使用演示: + +```java +public class HandleException1 { + public static void main(String[] args) { + // 声明变量 + FileWriter fw = null; + try { + //创建流对象 + fw = new FileWriter("fw.txt"); + // 写出数据 + fw.write("java程序员"); //java程序员 + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (fw != null) { + fw.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} +``` + +#### JDK7的处理 + +还可以使用JDK7优化后的`try-with-resource` 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。 + +格式: + +```java +try (创建流对象语句,如果多个,使用';'隔开) { + // 读写数据 +} catch (IOException e) { + e.printStackTrace(); +} +``` + +代码使用演示: + +```java +public class HandleException2 { + public static void main(String[] args) { + // 创建流对象 + try ( FileWriter fw = new FileWriter("fw.txt"); ) { + // 写出数据 + fw.write("java程序员"); //java程序员 + } catch (IOException e) { + e.printStackTrace(); + } + } +} +``` + +#### JDK9的改进(了解内容) + +JDK9中`try-with-resource` 的改进,对于**引入对象**的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,无需手动close,我们来了解一下格式。 + +改进前格式: + +```java +// 被final修饰的对象 +final Resource resource1 = new Resource("resource1"); +// 普通对象 +Resource resource2 = new Resource("resource2"); +// 引入方式:创建新的变量保存 +try (Resource r1 = resource1; + Resource r2 = resource2) { + // 使用对象 +} +``` + +改进后格式: + +```java +// 被final修饰的对象 +final Resource resource1 = new Resource("resource1"); +// 普通对象 +Resource resource2 = new Resource("resource2"); + +// 引入方式:直接引入 +try (resource1; resource2) { + // 使用对象 +} +``` + +改进后,代码使用演示: + +```java +public class TryDemo { + public static void main(String[] args) throws IOException { + // 创建流对象 + final FileReader fr = new FileReader("in.txt"); + FileWriter fw = new FileWriter("out.txt"); + // 引入到try中 + try (fr; fw) { + // 定义变量 + int b; + // 读取数据 + while ((b = fr.read())!=-1) { + // 写出数据 + fw.write(b); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} +``` + +## 第五章 属性集 + +### 5.1 概述 + +`java.util.Properties ` 继承于` Hashtable` ,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。该类也被许多Java类使用,比如获取系统属性时,`System.getProperties` 方法就是返回一个`Properties`对象。 + +### 5.2 Properties类 + +#### 构造方法 + +- `public Properties()` :创建一个空的属性列表。 + +#### 基本的存储方法 + +- `public Object setProperty(String key, String value)` : 保存一对属性。 +- `public String getProperty(String key) ` :使用此属性列表中指定的键搜索属性值。 +- `public Set stringPropertyNames() ` :所有键的名称的集合。 + +```java +public class ProDemo { + public static void main(String[] args) throws FileNotFoundException { + // 创建属性集对象 + Properties properties = new Properties(); + // 添加键值对元素 + properties.setProperty("filename", "a.txt"); + properties.setProperty("length", "209385038"); + properties.setProperty("location", "D:\\a.txt"); + // 打印属性集对象 + System.out.println(properties); + // 通过键,获取属性值 + System.out.println(properties.getProperty("filename")); + System.out.println(properties.getProperty("length")); + System.out.println(properties.getProperty("location")); + + // 遍历属性集,获取所有键的集合 + Set strings = properties.stringPropertyNames(); + // 打印键值对 + for (String key : strings ) { + System.out.println(key+" -- "+properties.getProperty(key)); + } + } +} +输出结果: +{filename=a.txt, length=209385038, location=D:\a.txt} +a.txt +209385038 +D:\a.txt +filename -- a.txt +length -- 209385038 +location -- D:\a.txt +``` + +#### 与流相关的方法 + +- `public void load(InputStream inStream)`: 从字节输入流中读取键值对。 + +参数中使用了字节输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了。文本数据格式: + +``` +filename=a.txt +length=209385038 +location=D:\a.txt +``` + +加载代码演示: + +```java +public class ProDemo2 { + public static void main(String[] args) throws FileNotFoundException { + // 创建属性集对象 + Properties pro = new Properties(); + // 加载文本中信息到属性集 + pro.load(new FileInputStream("read.txt")); + // 遍历集合并打印 + Set strings = pro.stringPropertyNames(); + for (String key : strings ) { + System.out.println(key+" -- "+pro.getProperty(key)); + } + } +} +输出结果: +filename -- a.txt +length -- 209385038 +location -- D:\a.txt +``` + +> 小贴士:文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。 \ No newline at end of file diff --git a/javaSE2/day09/img/1_io.jpg b/javaSE2/day09/img/1_io.jpg new file mode 100644 index 0000000..6ac67b9 Binary files /dev/null and b/javaSE2/day09/img/1_io.jpg differ diff --git a/javaSE2/day09/img/2_copy.jpg b/javaSE2/day09/img/2_copy.jpg new file mode 100644 index 0000000..ddc0bae Binary files /dev/null and b/javaSE2/day09/img/2_copy.jpg differ diff --git a/javaSE2/day10/day10【缓冲流、转换流、序列化流、Files】.md b/javaSE2/day10/day10【缓冲流、转换流、序列化流、Files】.md new file mode 100644 index 0000000..fc5db0e --- /dev/null +++ b/javaSE2/day10/day10【缓冲流、转换流、序列化流、Files】.md @@ -0,0 +1,696 @@ +# day10【缓冲流、转换流、序列化流】 + +### 主要内容 + +* 转换流 +* 缓冲流 +* 序列化流 +* 打印流 + + +### 教学目标 + +- [ ] 能够使用字节缓冲流读取数据到程序 +- [ ] 能够使用字节缓冲流写出数据到文件 +- [ ] 能够明确字符缓冲流的作用和基本用法 +- [ ] 能够使用缓冲流的特殊功能 +- [ ] 能够阐述编码表的意义 +- [ ] 能够使用转换流读取指定编码的文本文件 +- [ ] 能够使用转换流写入指定编码的文本文件 +- [ ] 能够说出打印流的特点 +- [ ] 能够使用序列化流写出对象到文件 +- [ ] 能够使用反序列化流读取文件到程序中 + +## 第一章 缓冲流 + +昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。 + +### 1.1 概述 + +缓冲流,也叫高效流,是对4个基本的`FileXxx` 流的增强,所以也是4个流,按照数据类型分类: + +* **字节缓冲流**:`BufferedInputStream`,`BufferedOutputStream` +* **字符缓冲流**:`BufferedReader`,`BufferedWriter` + +缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。 + +### 1.2 字节缓冲流 + +#### 构造方法 + +* `public BufferedInputStream(InputStream in)` :创建一个 新的缓冲输入流。 +* `public BufferedOutputStream(OutputStream out)`: 创建一个新的缓冲输出流。 + +构造举例,代码如下: + +```java +// 创建字节缓冲输入流 +BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt")); +// 创建字节缓冲输出流 +BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt")); +``` + +#### 效率测试 + +查询API,缓冲流读写方法与基本的流是一致的,我们通过复制大文件(375MB),测试它的效率。 + +1. 基本流,代码如下: + +```java +public class BufferedDemo { + public static void main(String[] args) throws FileNotFoundException { + // 记录开始时间 + long start = System.currentTimeMillis(); + // 创建流对象 + try ( + FileInputStream fis = new FileInputStream("jdk9.exe"); + FileOutputStream fos = new FileOutputStream("copy.exe") + ){ + // 读写数据 + int b; + while ((b = fis.read()) != -1) { + fos.write(b); + } + } catch (IOException e) { + e.printStackTrace(); + } + // 记录结束时间 + long end = System.currentTimeMillis(); + System.out.println("普通流复制时间:"+(end - start)+" 毫秒"); + } +} + +十几分钟过去了... +``` + +2. 缓冲流,代码如下: + +```java +public class BufferedDemo { + public static void main(String[] args) throws FileNotFoundException { + // 记录开始时间 + long start = System.currentTimeMillis(); + // 创建流对象 + try ( + BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe")); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe")); + ){ + // 读写数据 + int b; + while ((b = bis.read()) != -1) { + bos.write(b); + } + } catch (IOException e) { + e.printStackTrace(); + } + // 记录结束时间 + long end = System.currentTimeMillis(); + System.out.println("缓冲流复制时间:"+(end - start)+" 毫秒"); + } +} + +缓冲流复制时间:8016 毫秒 +``` +如何更快呢? + +使用数组的方式,代码如下: + +```java +public class BufferedDemo { + public static void main(String[] args) throws FileNotFoundException { + // 记录开始时间 + long start = System.currentTimeMillis(); + // 创建流对象 + try ( + BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe")); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe")); + ){ + // 读写数据 + int len; + byte[] bytes = new byte[8*1024]; + while ((len = bis.read(bytes)) != -1) { + bos.write(bytes, 0 , len); + } + } catch (IOException e) { + e.printStackTrace(); + } + // 记录结束时间 + long end = System.currentTimeMillis(); + System.out.println("缓冲流使用数组复制时间:"+(end - start)+" 毫秒"); + } +} +缓冲流使用数组复制时间:666 毫秒 +``` + +### 1.3 字符缓冲流 + +#### 构造方法 + +* `public BufferedReader(Reader in)` :创建一个 新的缓冲输入流。 +* `public BufferedWriter(Writer out)`: 创建一个新的缓冲输出流。 + +构造举例,代码如下: + +```java +// 创建字节缓冲输入流 +BufferedReader br = new BufferedReader(new FileReader("br.txt")); +// 创建字节缓冲输出流 +BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); +``` + +#### 特有方法 + +字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,我们来看它们具备的特有方法。 + +* BufferedReader:`public String readLine()`: 读一行文字。 +* BufferedWriter:`public void newLine()`: 写一行行分隔符,由系统属性定义符号。 + +`readLine`方法演示,代码如下: + +```java +public class BufferedReaderDemo { + public static void main(String[] args) throws IOException { + // 创建流对象 + BufferedReader br = new BufferedReader(new FileReader("in.txt")); + // 定义字符串,保存读取的一行文字 + String line = null; + // 循环读取,读取到最后返回null + while ((line = br.readLine())!=null) { + System.out.print(line); + System.out.println("------"); + } + // 释放资源 + br.close(); + } +} +``` + +`newLine`方法演示,代码如下: + + ```java +public class BufferedWriterDemo throws IOException { + public static void main(String[] args) throws IOException { + // 创建流对象 + BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt")); + // 写出数据 + bw.write("黑马"); + // 写出换行 + bw.newLine(); + bw.write("程序"); + bw.newLine(); + bw.write("员"); + bw.newLine(); + // 释放资源 + bw.close(); + } +} +输出效果: +黑马 +程序 +员 + ``` + +### 1.4 练习:文本排序 + +请将文本信息恢复顺序。 + +``` +3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必得裨补阙漏,有所广益。 +8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。 +4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 +2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。 +1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 +9.今当远离,临表涕零,不知所言。 +6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 +7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 +5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 +``` + +#### 案例分析 + +1. 逐行读取文本信息。 +2. 解析文本信息到集合中。 +3. 遍历集合,按顺序,写出文本信息。 + +#### 案例实现 + +```java +public class BufferedTest { + public static void main(String[] args) throws IOException { + // 创建map集合,保存文本数据,键为序号,值为文字 + HashMap lineMap = new HashMap<>(); + + // 创建流对象 + BufferedReader br = new BufferedReader(new FileReader("in.txt")); + BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt")); + + // 读取数据 + String line = null; + while ((line = br.readLine())!=null) { + // 解析文本 + String[] split = line.split("\\."); + // 保存到集合 + lineMap.put(split[0],split[1]); + } + // 释放资源 + br.close(); + + // 遍历map集合 + for (int i = 1; i <= lineMap.size(); i++) { + String key = String.valueOf(i); + // 获取map中文本 + String value = lineMap.get(key); + // 写出拼接文本 + bw.write(key+"."+value); + // 写出换行 + bw.newLine(); + } + // 释放资源 + bw.close(); + } +} +``` + + + +## 第二章 转换流 + +### 2.1 字符编码和字符集 + +#### 字符编码 + +计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为**编码** 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为**解码** 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本f符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。 + +* **字符编码`Character Encoding`** : 就是一套自然语言的字符与二进制数之间的对应规则。 + +#### 字符集 + +* **字符集 `Charset`**:是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。 + +计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBK字符集、Unicode字符集等。![](img/1_charset.jpg) + +可见,当指定了**编码**,它所对应的**字符集**自然就指定了,所以**编码**才是我们最终要关心的。 + +* **ASCII字符集** : + * ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)。 + * 基本的ASCII字符集,使用7位(bits)表示一个字符,共128字符。ASCII的扩展字符集使用8位(bits)表示一个字符,共256字符,方便支持欧洲常用字符。 +* **ISO-8859-1字符集**: + * 拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。 + * ISO-5559-1使用单字节编码,兼容ASCII编码。 +* **GBxxx字符集**: + * GB就是国标的意思,是为了显示中文而设计的一套字符集。 + * **GB2312**:简体中文码表。一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。 + * **GBK**:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。 + * **GB18030**:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。 +* **Unicode字符集** : + * Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。 + * 它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。最为常用的UTF-8编码。 + * UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web应用,也要使用UTF-8编码。它使用一至四个字节为每个字符编码,编码规则: + 1. 128个US-ASCII字符,只需一个字节编码。 + 2. 拉丁文等字符,需要二个字节编码。 + 3. 大部分常用字(含中文),使用三个字节编码。 + 4. 其他极少使用的Unicode辅助字符,使用四字节编码。 + +### 2.2 编码引出的问题 + +在IDEA中,使用`FileReader` 读取项目中的文本文件。由于IDEA的设置,都是默认的`UTF-8`编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。 + +```java +public class ReaderDemo { + public static void main(String[] args) throws IOException { + FileReader fileReader = new FileReader("E:\\File_GBK.txt"); + int read; + while ((read = fileReader.read()) != -1) { + System.out.print((char)read); + } + fileReader.close(); + } +} +输出结果: +��� +``` + +那么如何读取GBK编码的文件呢? + +### 2.3 InputStreamReader类 + +转换流`java.io.InputStreamReader`,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。 + +#### 构造方法 + +* `InputStreamReader(InputStream in)`: 创建一个使用默认字符集的字符流。 +* `InputStreamReader(InputStream in, String charsetName)`: 创建一个指定字符集的字符流。 + +构造举例,代码如下: + +```java +InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt")); +InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK"); +``` + +#### 指定编码读取 + +```java +public class ReaderDemo2 { + public static void main(String[] args) throws IOException { + // 定义文件路径,文件为gbk编码 + String FileName = "E:\\file_gbk.txt"; + // 创建流对象,默认UTF8编码 + InputStreamReader isr = new InputStreamReader(new FileInputStream(FileName)); + // 创建流对象,指定GBK编码 + InputStreamReader isr2 = new InputStreamReader(new FileInputStream(FileName) , "GBK"); + // 定义变量,保存字符 + int read; + // 使用默认编码字符流读取,乱码 + while ((read = isr.read()) != -1) { + System.out.print((char)read); // ��Һ� + } + isr.close(); + + // 使用指定编码字符流读取,正常解析 + while ((read = isr2.read()) != -1) { + System.out.print((char)read);// 大家好 + } + isr2.close(); + } +} +``` + +### 2.4 OutputStreamWriter类 + +转换流`java.io.OutputStreamWriter` ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集讲字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。 + +#### 构造方法 + +- `OutputStreamWriter(OutputStream in)`: 创建一个使用默认字符集的字符流。 +- `OutputStreamWriter(OutputStream in, String charsetName)`: 创建一个指定字符集的字符流。 + +构造举例,代码如下: + +```java +OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt")); +OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK"); +``` + +#### 指定编码写出 + +```java +public class OutputDemo { + public static void main(String[] args) throws IOException { + // 定义文件路径 + String FileName = "E:\\out.txt"; + // 创建流对象,默认UTF8编码 + OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(FileName)); + // 写出数据 + osw.write("你好"); // 保存为6个字节 + osw.close(); + + // 定义文件路径 + String FileName2 = "E:\\out2.txt"; + // 创建流对象,指定GBK编码 + OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(FileName2),"GBK"); + // 写出数据 + osw2.write("你好");// 保存为4个字节 + osw2.close(); + } +} +``` + +#### 转换流理解图解 + +**转换流是字节与字符间的桥梁!**![](img/2_zhuanhuan.jpg) + +### 2.5 练习:转换文件编码 + +将GBK编码的文本文件,转换为UTF-8编码的文本文件。 + +#### 案例分析 + +1. 指定GBK编码的转换流,读取文本文件。 +2. 使用UTF-8编码的转换流,写出文本文件。 + +#### 案例实现 + +```java +public class TransDemo { + public static void main(String[] args) { + // 1.定义文件路径 + String srcFile = "file_gbk.txt"; + String destFile = "file_utf8.txt"; + // 2.创建流对象 + // 2.1 转换输入流,指定GBK编码 + InputStreamReader isr = new InputStreamReader(new FileInputStream(srcFile) , "GBK"); + // 2.2 转换输出流,默认utf8编码 + OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(destFile)); + // 3.读写数据 + // 3.1 定义数组 + char[] cbuf = new char[1024]; + // 3.2 定义长度 + int len; + // 3.3 循环读取 + while ((len = isr.read(cbuf))!=-1) { + // 循环写出 + osw.write(cbuf,0,len); + } + // 4.释放资源 + osw.close(); + isr.close(); + } +} +``` + +## 第三章 序列化 + +### 3.1 概述 + +Java 提供了一种对象**序列化**的机制。用一个字节序列可以表示一个对象,该字节序列包含该`对象的数据`、`对象的类型`和`对象中存储的数据`等信息。字节序列写出到文件之后,相当于文件中**持久保存**了一个对象的信息。 + +反之,该字节序列还可以从文件中读取回来,重构对象,对它进行**反序列化**。`对象的数据`、`对象的类型`和`对象中存储的数据`信息,都可以用来在内存中创建对象。看图理解序列化: ![](img/3_xuliehua.jpg) + +### 3.2 ObjectOutputStream类 + +`java.io.ObjectOutputStream ` 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。 + +#### 构造方法 + +* `public ObjectOutputStream(OutputStream out) `: 创建一个指定OutputStream的ObjectOutputStream。 + +构造举例,代码如下: + +```java +FileOutputStream fileOut = new FileOutputStream("employee.txt"); +ObjectOutputStream out = new ObjectOutputStream(fileOut); +``` + +#### 序列化操作 + +1. 一个对象要想序列化,必须满足两个条件: + +* 该类必须实现`java.io.Serializable ` 接口,`Serializable` 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出`NotSerializableException` 。 +* 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用`transient` 关键字修饰。 + +```java +public class Employee implements java.io.Serializable { + public String name; + public String address; + public transient int age; // transient瞬态修饰成员,不会被序列化 + public void addressCheck() { + System.out.println("Address check : " + name + " -- " + address); + } +} +``` + +2.写出对象方法 + +* `public final void writeObject (Object obj)` : 将指定的对象写出。 + +```java +public class SerializeDemo{ + public static void main(String [] args) { + Employee e = new Employee(); + e.name = "zhangsan"; + e.address = "beiqinglu"; + e.age = 20; + try { + // 创建序列化流对象 + ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.txt")); + // 写出对象 + out.writeObject(e); + // 释放资源 + out.close(); + fileOut.close(); + System.out.println("Serialized data is saved"); // 姓名,地址被序列化,年龄没有被序列化。 + } catch(IOException i) { + i.printStackTrace(); + } + } +} +输出结果: +Serialized data is saved +``` + +### 3.3 ObjectInputStream类 + +ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。 + +#### 构造方法 + +* `public ObjectInputStream(InputStream in) `: 创建一个指定InputStream的ObjectInputStream。 + +#### 反序列化操作1 + +如果能找到一个对象的class文件,我们可以进行反序列化操作,调用`ObjectInputStream`读取对象的方法: + +- `public final Object readObject ()` : 读取一个对象。 + +```java +public class DeserializeDemo { + public static void main(String [] args) { + Employee e = null; + try { + // 创建反序列化流 + FileInputStream fileIn = new FileInputStream("employee.txt"); + ObjectInputStream in = new ObjectInputStream(fileIn); + // 读取一个对象 + e = (Employee) in.readObject(); + // 释放资源 + in.close(); + fileIn.close(); + }catch(IOException i) { + // 捕获其他异常 + i.printStackTrace(); + return; + }catch(ClassNotFoundException c) { + // 捕获类找不到异常 + System.out.println("Employee class not found"); + c.printStackTrace(); + return; + } + // 无异常,直接打印输出 + System.out.println("Name: " + e.name); // zhangsan + System.out.println("Address: " + e.address); // beiqinglu + System.out.println("age: " + e.age); // 0 + } +} +``` + +**对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 `ClassNotFoundException` 异常。** + +#### **反序列化操作2** + +**另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个`InvalidClassException`异常。**发生这个异常的原因如下: + +* 该类的序列版本号与从流中读取的类描述符的版本号不匹配 +* 该类包含未知数据类型 +* 该类没有可访问的无参数构造方法 + +`Serializable` 接口给需要序列化的类,提供了一个序列版本号。`serialVersionUID` 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。 + +```java +public class Employee implements java.io.Serializable { + // 加入序列版本号 + private static final long serialVersionUID = 1L; + public String name; + public String address; + // 添加新的属性 ,重新编译, 可以反序列化,该属性赋为默认值. + public int eid; + + public void addressCheck() { + System.out.println("Address check : " + name + " -- " + address); + } +} +``` + + + +### 3.4 练习:序列化集合 + +1. 将存有多个自定义对象的集合序列化操作,保存到`list.txt`文件中。 +2. 反序列化`list.txt` ,并遍历集合,打印对象信息。 + +#### 案例分析 + +1. 把若干学习对象 ,保存到集合中。 +2. 把集合序列化。 +3. 反序列化读取时,只需要读取一次,转换为集合类型。 +4. 遍历集合,可以打印所有的学生信息 + +#### 案例实现 + +```java +public class SerTest { + public static void main(String[] args) throws Exception { + // 创建 学生对象 + Student student = new Student("老王", "laow"); + Student student2 = new Student("老张", "laoz"); + Student student3 = new Student("老李", "laol"); + + ArrayList arrayList = new ArrayList<>(); + arrayList.add(student); + arrayList.add(student2); + arrayList.add(student3); + // 序列化操作 + // serializ(arrayList); + + // 反序列化 + ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt")); + // 读取对象,强转为ArrayList类型 + ArrayList list = (ArrayList)ois.readObject(); + + for (int i = 0; i < list.size(); i++ ){ + Student s = list.get(i); + System.out.println(s.getName()+"--"+ s.getPwd()); + } + } + + private static void serializ(ArrayList arrayList) throws Exception { + // 创建 序列化流 + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt")); + // 写出对象 + oos.writeObject(arrayList); + // 释放资源 + oos.close(); + } +} +``` + + +## 第四章 打印流 + +### 4.1 概述 + +平时我们在控制台打印输出,是调用`print`方法和`println`方法完成的,这两个方法都来自于`java.io.PrintStream`类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。 + +### 4.2 PrintStream类 + +#### 构造方法 + +* `public PrintStream(String fileName) `: 使用指定的文件名创建一个新的打印流。 + +构造举例,代码如下: + +```java +PrintStream ps = new PrintStream("ps.txt"); +``` + +#### 改变打印流向 + +`System.out`就是`PrintStream`类型的,只不过它的流向是系统规定的,打印在控制台上。不过,既然是流对象,我们就可以玩一个"小把戏",改变它的流向。 + +```java +public class PrintDemo { + public static void main(String[] args) throws IOException { + // 调用系统的打印流,控制台直接输出97 + System.out.println(97); + + // 创建打印流,指定文件的名称 + PrintStream ps = new PrintStream("ps.txt"); + + // 设置系统的打印流流向,输出到ps.txt + System.setOut(ps); + // 调用系统的打印流,ps.txt中输出97 + System.out.println(97); + } +} +``` + diff --git a/javaSE2/day10/img/1_charset.jpg b/javaSE2/day10/img/1_charset.jpg new file mode 100644 index 0000000..6d21559 Binary files /dev/null and b/javaSE2/day10/img/1_charset.jpg differ diff --git a/javaSE2/day10/img/2_zhuanhuan.jpg b/javaSE2/day10/img/2_zhuanhuan.jpg new file mode 100644 index 0000000..883398e Binary files /dev/null and b/javaSE2/day10/img/2_zhuanhuan.jpg differ diff --git a/javaSE2/day10/img/3_xuliehua.jpg b/javaSE2/day10/img/3_xuliehua.jpg new file mode 100644 index 0000000..65882b7 Binary files /dev/null and b/javaSE2/day10/img/3_xuliehua.jpg differ diff --git a/javaSE2/day11/day11【网络编程】.md b/javaSE2/day11/day11【网络编程】.md new file mode 100644 index 0000000..dcb9d76 --- /dev/null +++ b/javaSE2/day11/day11【网络编程】.md @@ -0,0 +1,556 @@ +# day11【网络编程】 + +### 主要内容 + +* 软件架构CS/BS +* 网络通信三要素 +* TCP通信 +* Socket套接字 +* ServerSocket + + +### 教学目标 + +- [ ] 能够辨别UDP和TCP协议特点 +- [ ] 能够说出TCP协议下两个常用类名称 +- [ ] 能够编写TCP协议下字符串数据传输程序 +- [ ] 能够理解TCP协议下文件上传案例 +- [ ] 能够理解TCP协议下BS案例 + +## 第一章 网络编程入门 + +### 1.1软件结构 + +- **C/S结构** :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。 + +![](img/1_cs.jpg) + +**B/S结构** :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 + +![](img/2_bs.jpg) + +两种架构各有优势,但是无论哪种架构,都离不开网络的支持。**网络编程**,就是在一定的协议下,实现两台计算机的通信的程序。 + +### 1.2 网络通信协议 + +* **网络通信协议:**通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换。 + + +* **TCP/IP协议:** 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。 + +![](img/3_tcp_ip.jpg) + +### 1.3 协议分类 + +通信的协议还是比较复杂的,`java.net` 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。 + +`java.net` 包中提供了两种常见的网络协议的支持: + +- **TCP**:传输控制协议 (Transmission Control Protocol)。TCP协议是**面向连接**的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。 + - 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。 + - 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。 + - 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。 + - 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。 + +![](img/4_tcp.jpg) + +​ 完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。 + +- **UDP**:用户数据报协议(User Datagram Protocol)。UDP协议是一个**面向无连接**的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。 + +### 1.4 网络编程三要素 + +#### 协议 + +* **协议:**计算机网络通信必须遵守的规则,已经介绍过了,不再赘述。 + +#### IP地址 + +* **IP地址:指互联网协议地址(Internet Protocol Address)**,俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话,那么“IP地址”就相当于“电话号码”。 + +**IP地址分类** + +* IPv4:是一个32位的二进制数,通常被分为4个字节,表示成`a.b.c.d` 的形式,例如`192.168.65.100` 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。 + +* IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。有资料显示,全球IPv4地址在2011年2月分配完毕。 + + 为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成`ABCD:EF01:2345:6789:ABCD:EF01:2345:6789`,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。 + +**常用命令** + +* 查看本机IP地址,在控制台输入: + +```java +ipconfig +``` + +* 检查网络是否连通,在控制台输入: + +```java +ping 空格 IP地址 +ping 220.181.57.216 +``` + +**特殊的IP地址** + +* 本机IP地址:`127.0.0.1`、`localhost` 。 + +#### 端口号 + +网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢? + +如果说**IP地址**可以唯一标识网络中的设备,那么**端口号**就可以唯一标识设备中的进程(应用程序)了。 + +* **端口号:用两个字节表示的整数,它的取值范围是0~65535**。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。 + +利用`协议`+`IP地址`+`端口号` 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。 + +## 第二章 TCP通信程序 + +### 2.1 概述 + +TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。 + +**两端通信时步骤:** + +1. 服务端程序,需要事先启动,等待客户端的连接。 +2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。 + +**在Java中,提供了两个类用于实现TCP通信程序:** + +1. 客户端:`java.net.Socket` 类表示。创建`Socket`对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。 +2. 服务端:`java.net.ServerSocket` 类表示。创建`ServerSocket`对象,相当于开启一个服务,并等待客户端的连接。 + +### 2.2 Socket类 + +`Socket` 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。 + +#### 构造方法 + +* `public Socket(String host, int port)` :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。 + + > 小贴士:回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。 + +构造举例,代码如下: + +```java +Socket client = new Socket("127.0.0.1", 6666); +``` + +#### 成员方法 + +* `public InputStream getInputStream()` : 返回此套接字的输入流。 + * 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。 + * 关闭生成的InputStream也将关闭相关的Socket。 +* `public OutputStream getOutputStream()` : 返回此套接字的输出流。 + * 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。 + * 关闭生成的OutputStream也将关闭相关的Socket。 +* `public void close()` :关闭此套接字。 + * 一旦一个socket被关闭,它不可再使用。 + * 关闭此socket也将关闭相关的InputStream和OutputStream 。 +* `public void shutdownOutput()` : 禁用此套接字的输出流。 + * 任何先前写出的数据将被发送,随后终止输出流。 + +### 2.3 ServerSocket类 + +`ServerSocket`类:这个类实现了服务器套接字,该对象等待通过网络的请求。 + +#### 构造方法 + +* `public ServerSocket(int port)` :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。 + +构造举例,代码如下: + +```java +ServerSocket server = new ServerSocket(6666); +``` + +#### 成员方法 + +* `public Socket accept()` :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。 + + +### 2.4 简单的TCP网络程序 + +#### TCP通信分析图解 + +1. 【服务端】启动,创建ServerSocket对象,等待连接。 +2. 【客户端】启动,创建Socket对象,请求连接。 +3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象。 +4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据。 +5. 【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。 + +> 到此,客户端向服务端发送数据成功。 + +![](img/5_简单通信.jpg) + +> 自此,服务端向客户端回写数据。 + +6. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。 +7. 【客户端】Scoket对象,获取InputStream,解析回写数据。 +8. 【客户端】释放资源,断开连接。 + +#### 客户端向服务器发送数据 + +**服务端实现:** + +```java +public class ServerTCP { + public static void main(String[] args) throws IOException { + System.out.println("服务端启动 , 等待连接 .... "); + // 1.创建 ServerSocket对象,绑定端口,开始等待连接 + ServerSocket ss = new ServerSocket(6666); + // 2.接收连接 accept 方法, 返回 socket 对象. + Socket server = ss.accept(); + // 3.通过socket 获取输入流 + InputStream is = server.getInputStream(); + // 4.一次性读取数据 + // 4.1 创建字节数组 + byte[] b = new byte[1024]; + // 4.2 据读取到字节数组中. + int len = is.read(b); + // 4.3 解析数组,打印字符串信息 + String msg = new String(b, 0, len); + System.out.println(msg); + //5.关闭资源. + is.close(); + server.close(); + } +} +``` + +**客户端实现:** + +```java +public class ClientTCP { + public static void main(String[] args) throws Exception { + System.out.println("客户端 发送数据"); + // 1.创建 Socket ( ip , port ) , 确定连接到哪里. + Socket client = new Socket("localhost", 6666); + // 2.获取流对象 . 输出流 + OutputStream os = client.getOutputStream(); + // 3.写出数据. + os.write("你好么? tcp ,我来了".getBytes()); + // 4. 关闭资源 . + os.close(); + client.close(); + } +} +``` + +#### 服务器向客户端回写数据 + +**服务端实现:** + +```java +public class ServerTCP { + public static void main(String[] args) throws IOException { + System.out.println("服务端启动 , 等待连接 .... "); + // 1.创建 ServerSocket对象,绑定端口,开始等待连接 + ServerSocket ss = new ServerSocket(6666); + // 2.接收连接 accept 方法, 返回 socket 对象. + Socket server = ss.accept(); + // 3.通过socket 获取输入流 + InputStream is = server.getInputStream(); + // 4.一次性读取数据 + // 4.1 创建字节数组 + byte[] b = new byte[1024]; + // 4.2 据读取到字节数组中. + int len = is.read(b); + // 4.3 解析数组,打印字符串信息 + String msg = new String(b, 0, len); + System.out.println(msg); + // =================回写数据======================= + // 5. 通过 socket 获取输出流 + OutputStream out = server.getOutputStream(); + // 6. 回写数据 + out.write("我很好,谢谢你".getBytes()); + // 7.关闭资源. + out.close(); + is.close(); + server.close(); + } +} +``` + +**客户端实现:** + +```java +public class ClientTCP { + public static void main(String[] args) throws Exception { + System.out.println("客户端 发送数据"); + // 1.创建 Socket ( ip , port ) , 确定连接到哪里. + Socket client = new Socket("localhost", 6666); + // 2.通过Scoket,获取输出流对象 + OutputStream os = client.getOutputStream(); + // 3.写出数据. + os.write("你好么? tcp ,我来了".getBytes()); + // ==============解析回写========================= + // 4. 通过Scoket,获取 输入流对象 + InputStream in = client.getInputStream(); + // 5. 读取数据数据 + byte[] b = new byte[100]; + int len = in.read(b); + System.out.println(new String(b, 0, len)); + // 6. 关闭资源 . + in.close(); + os.close(); + client.close(); + } +} +``` + +## 第三章 综合案例 + +### 3.1 文件上传案例 + +#### 文件上传分析图解 + +1. 【客户端】输入流,从硬盘读取文件数据到程序中。 +2. 【客户端】输出流,写出文件数据到服务端。 +3. 【服务端】输入流,读取文件数据到服务端程序。 +4. 【服务端】输出流,写出文件数据到服务器硬盘中。 + +![](img/6_upload.jpg) + +##### 基本实现 + +**服务端实现:** + +```java +public class FileUpload_Server { + public static void main(String[] args) throws IOException { + System.out.println("服务器 启动..... "); + // 1. 创建服务端ServerSocket + ServerSocket serverSocket = new ServerSocket(6666); + // 2. 建立连接 + Socket accept = serverSocket.accept(); + // 3. 创建流对象 + // 3.1 获取输入流,读取文件数据 + BufferedInputStream bis = new BufferedInputStream(accept.getInputStream()); + // 3.2 创建输出流,保存到本地 . + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg")); + // 4. 读写数据 + byte[] b = new byte[1024 * 8]; + int len; + while ((len = bis.read(b)) != -1) { + bos.write(b, 0, len); + } + //5. 关闭 资源 + bos.close(); + bis.close(); + accept.close(); + System.out.println("文件上传已保存"); + } +} +``` + +**客户端实现:** + +```java +public class FileUPload_Client { + public static void main(String[] args) throws IOException { + // 1.创建流对象 + // 1.1 创建输入流,读取本地文件 + BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg")); + // 1.2 创建输出流,写到服务端 + Socket socket = new Socket("localhost", 6666); + BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); + + //2.写出数据. + byte[] b = new byte[1024 * 8 ]; + int len ; + while (( len = bis.read(b))!=-1) { + bos.write(b, 0, len); + bos.flush(); + } + System.out.println("文件发送完毕"); + // 3.释放资源 + + bos.close(); + socket.close(); + bis.close(); + System.out.println("文件上传完毕 "); + } +} +``` + +#### 文件上传优化分析 + +1. **文件名称写死的问题** + + 服务端,保存文件的名称如果写死,那么最终导致服务器硬盘,只会保留一个文件,建议使用系统时间优化,保证文件名称唯一,代码如下: + +```java +FileOutputStream fis = new FileOutputStream(System.currentTimeMillis()+".jpg") // 文件名称 +BufferedOutputStream bos = new BufferedOutputStream(fis); +``` + +2. **循环接收的问题** + + 服务端,指保存一个文件就关闭了,之后的用户无法再上传,这是不符合实际的,使用循环改进,可以不断的接收不同用户的文件,代码如下: + +```java +// 每次接收新的连接,创建一个Socket +while(true){ + Socket accept = serverSocket.accept(); + ...... +} +``` + +3. **效率问题** + + 服务端,在接收大文件时,可能耗费几秒钟的时间,此时不能接收其他用户上传,所以,使用多线程技术优化,代码如下: + +```java +while(true){ + Socket accept = serverSocket.accept(); + // accept 交给子线程处理. + new Thread(() -> { + ...... + InputStream bis = accept.getInputStream(); + ...... + }).start(); +} +``` + +##### 优化实现 + +```java +public class FileUpload_Server { + public static void main(String[] args) throws IOException { + System.out.println("服务器 启动..... "); + // 1. 创建服务端ServerSocket + ServerSocket serverSocket = new ServerSocket(6666); + // 2. 循环接收,建立连接 + while (true) { + Socket accept = serverSocket.accept(); + /* + 3. socket对象交给子线程处理,进行读写操作 + Runnable接口中,只有一个run方法,使用lambda表达式简化格式 + */ + new Thread(() -> { + try ( + //3.1 获取输入流对象 + BufferedInputStream bis = new BufferedInputStream(accept.getInputStream()); + //3.2 创建输出流对象, 保存到本地 . + FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg"); + BufferedOutputStream bos = new BufferedOutputStream(fis);) { + // 3.3 读写数据 + byte[] b = new byte[1024 * 8]; + int len; + while ((len = bis.read(b)) != -1) { + bos.write(b, 0, len); + } + //4. 关闭 资源 + bos.close(); + bis.close(); + accept.close(); + System.out.println("文件上传已保存"); + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + } + } +} +``` + +#### 信息回写分析图解 + +前四步与基本文件上传一致. + +5. 【服务端】获取输出流,回写数据。 +6. 【客户端】获取输入流,解析回写数据。 + +![](img/6_upload2.jpg) + +##### 回写实现 + +```java +public class FileUpload_Server { + public static void main(String[] args) throws IOException { + System.out.println("服务器 启动..... "); + // 1. 创建服务端ServerSocket + ServerSocket serverSocket = new ServerSocket(6666); + // 2. 循环接收,建立连接 + while (true) { + Socket accept = serverSocket.accept(); + /* + 3. socket对象交给子线程处理,进行读写操作 + Runnable接口中,只有一个run方法,使用lambda表达式简化格式 + */ + new Thread(() -> { + try ( + //3.1 获取输入流对象 + BufferedInputStream bis = new BufferedInputStream(accept.getInputStream()); + //3.2 创建输出流对象, 保存到本地 . + FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg"); + BufferedOutputStream bos = new BufferedOutputStream(fis); + ) { + // 3.3 读写数据 + byte[] b = new byte[1024 * 8]; + int len; + while ((len = bis.read(b)) != -1) { + bos.write(b, 0, len); + } + + // 4.=======信息回写=========================== + System.out.println("back ........"); + OutputStream out = accept.getOutputStream(); + out.write("上传成功".getBytes()); + out.close(); + //================================ + + //5. 关闭 资源 + bos.close(); + bis.close(); + accept.close(); + System.out.println("文件上传已保存"); + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + } + } +} +``` + +**客户端实现:** + +```java +public class FileUpload_Client { + public static void main(String[] args) throws IOException { + // 1.创建流对象 + // 1.1 创建输入流,读取本地文件 + BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg")); + // 1.2 创建输出流,写到服务端 + Socket socket = new Socket("localhost", 6666); + BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); + + //2.写出数据. + byte[] b = new byte[1024 * 8 ]; + int len ; + while (( len = bis.read(b))!=-1) { + bos.write(b, 0, len); + } + // 关闭输出流,通知服务端,写出数据完毕 + socket.shutdownOutput(); + System.out.println("文件发送完毕"); + // 3. =====解析回写============ + InputStream in = socket.getInputStream(); + byte[] back = new byte[20]; + in.read(back); + System.out.println(new String(back)); + in.close(); + // ============================ + + // 4.释放资源 + socket.close(); + bis.close(); + } +} +``` + + + diff --git a/javaSE2/day11/img/1_cs.jpg b/javaSE2/day11/img/1_cs.jpg new file mode 100644 index 0000000..46e8a30 Binary files /dev/null and b/javaSE2/day11/img/1_cs.jpg differ diff --git a/javaSE2/day11/img/2_bs.jpg b/javaSE2/day11/img/2_bs.jpg new file mode 100644 index 0000000..acf47c8 Binary files /dev/null and b/javaSE2/day11/img/2_bs.jpg differ diff --git a/javaSE2/day11/img/3_tcp_ip.jpg b/javaSE2/day11/img/3_tcp_ip.jpg new file mode 100644 index 0000000..e0f9209 Binary files /dev/null and b/javaSE2/day11/img/3_tcp_ip.jpg differ diff --git a/javaSE2/day11/img/4_tcp.jpg b/javaSE2/day11/img/4_tcp.jpg new file mode 100644 index 0000000..c938b02 Binary files /dev/null and b/javaSE2/day11/img/4_tcp.jpg differ diff --git a/javaSE2/day11/img/5_简单通信.jpg b/javaSE2/day11/img/5_简单通信.jpg new file mode 100644 index 0000000..8f35be5 Binary files /dev/null and b/javaSE2/day11/img/5_简单通信.jpg differ diff --git a/javaSE2/day11/img/6_upload.jpg b/javaSE2/day11/img/6_upload.jpg new file mode 100644 index 0000000..6ba9693 Binary files /dev/null and b/javaSE2/day11/img/6_upload.jpg differ diff --git a/javaSE2/day11/img/6_upload2.jpg b/javaSE2/day11/img/6_upload2.jpg new file mode 100644 index 0000000..61adad1 Binary files /dev/null and b/javaSE2/day11/img/6_upload2.jpg differ diff --git a/javaSE2/day11/img/7_firefox.jpg b/javaSE2/day11/img/7_firefox.jpg new file mode 100644 index 0000000..f55dff8 Binary files /dev/null and b/javaSE2/day11/img/7_firefox.jpg differ diff --git a/javaSE2/day11/img/8_ie.jpg b/javaSE2/day11/img/8_ie.jpg new file mode 100644 index 0000000..1932f6e Binary files /dev/null and b/javaSE2/day11/img/8_ie.jpg differ diff --git a/javaSE2/day11/img/BS通信.bmp b/javaSE2/day11/img/BS通信.bmp new file mode 100644 index 0000000..27d3c35 Binary files /dev/null and b/javaSE2/day11/img/BS通信.bmp differ diff --git a/javaSE2/day11/img/复制.png b/javaSE2/day11/img/复制.png new file mode 100644 index 0000000..c97ed75 Binary files /dev/null and b/javaSE2/day11/img/复制.png differ diff --git a/javaSE2/day11/img/效果图1.png b/javaSE2/day11/img/效果图1.png new file mode 100644 index 0000000..3d63839 Binary files /dev/null and b/javaSE2/day11/img/效果图1.png differ diff --git a/javaSE2/day11/img/效果图2.png b/javaSE2/day11/img/效果图2.png new file mode 100644 index 0000000..3328acc Binary files /dev/null and b/javaSE2/day11/img/效果图2.png differ diff --git a/javaSE2/day11/img/无法访问.jpg b/javaSE2/day11/img/无法访问.jpg new file mode 100644 index 0000000..b434d81 Binary files /dev/null and b/javaSE2/day11/img/无法访问.jpg differ diff --git a/javaSE2/day11/img/读取访问信息.jpg b/javaSE2/day11/img/读取访问信息.jpg new file mode 100644 index 0000000..1ebe361 Binary files /dev/null and b/javaSE2/day11/img/读取访问信息.jpg differ diff --git a/javaSE2/day12/assets/1556078289643.png b/javaSE2/day12/assets/1556078289643.png new file mode 100644 index 0000000..3645344 Binary files /dev/null and b/javaSE2/day12/assets/1556078289643.png differ diff --git a/javaSE2/day12/assets/1556078373316.png b/javaSE2/day12/assets/1556078373316.png new file mode 100644 index 0000000..8bcdd25 Binary files /dev/null and b/javaSE2/day12/assets/1556078373316.png differ diff --git a/javaSE2/day12/assets/1556078462690.png b/javaSE2/day12/assets/1556078462690.png new file mode 100644 index 0000000..1641500 Binary files /dev/null and b/javaSE2/day12/assets/1556078462690.png differ diff --git a/javaSE2/day12/assets/1556078542161.png b/javaSE2/day12/assets/1556078542161.png new file mode 100644 index 0000000..c3dc43c Binary files /dev/null and b/javaSE2/day12/assets/1556078542161.png differ diff --git a/javaSE2/day12/assets/1556078626138.png b/javaSE2/day12/assets/1556078626138.png new file mode 100644 index 0000000..d8c2389 Binary files /dev/null and b/javaSE2/day12/assets/1556078626138.png differ diff --git a/javaSE2/day12/assets/1556078637906.png b/javaSE2/day12/assets/1556078637906.png new file mode 100644 index 0000000..e5f81d1 Binary files /dev/null and b/javaSE2/day12/assets/1556078637906.png differ diff --git a/javaSE2/day12/assets/1556078709856.png b/javaSE2/day12/assets/1556078709856.png new file mode 100644 index 0000000..27fed4a Binary files /dev/null and b/javaSE2/day12/assets/1556078709856.png differ diff --git a/javaSE2/day12/assets/1556079266963.png b/javaSE2/day12/assets/1556079266963.png new file mode 100644 index 0000000..6f13743 Binary files /dev/null and b/javaSE2/day12/assets/1556079266963.png differ diff --git a/javaSE2/day12/assets/1556079606412.png b/javaSE2/day12/assets/1556079606412.png new file mode 100644 index 0000000..449aa27 Binary files /dev/null and b/javaSE2/day12/assets/1556079606412.png differ diff --git a/javaSE2/day12/assets/1556080052414.png b/javaSE2/day12/assets/1556080052414.png new file mode 100644 index 0000000..4488202 Binary files /dev/null and b/javaSE2/day12/assets/1556080052414.png differ diff --git a/javaSE2/day12/assets/1556088494865.png b/javaSE2/day12/assets/1556088494865.png new file mode 100644 index 0000000..6f13743 Binary files /dev/null and b/javaSE2/day12/assets/1556088494865.png differ diff --git a/javaSE2/day12/assets/1556090042762.png b/javaSE2/day12/assets/1556090042762.png new file mode 100644 index 0000000..c6753ef Binary files /dev/null and b/javaSE2/day12/assets/1556090042762.png differ diff --git a/javaSE2/day12/assets/1556092262925.png b/javaSE2/day12/assets/1556092262925.png new file mode 100644 index 0000000..f3fcd0a Binary files /dev/null and b/javaSE2/day12/assets/1556092262925.png differ diff --git a/javaSE2/day12/assets/1556093210198.png b/javaSE2/day12/assets/1556093210198.png new file mode 100644 index 0000000..a7bd3d7 Binary files /dev/null and b/javaSE2/day12/assets/1556093210198.png differ diff --git a/javaSE2/day12/assets/1556093748861.png b/javaSE2/day12/assets/1556093748861.png new file mode 100644 index 0000000..2632a8b Binary files /dev/null and b/javaSE2/day12/assets/1556093748861.png differ diff --git a/javaSE2/day12/assets/1556094406370.png b/javaSE2/day12/assets/1556094406370.png new file mode 100644 index 0000000..421daed Binary files /dev/null and b/javaSE2/day12/assets/1556094406370.png differ diff --git a/javaSE2/day12/assets/1556095819688.png b/javaSE2/day12/assets/1556095819688.png new file mode 100644 index 0000000..aff0568 Binary files /dev/null and b/javaSE2/day12/assets/1556095819688.png differ diff --git a/javaSE2/day12/assets/1556364443940.png b/javaSE2/day12/assets/1556364443940.png new file mode 100644 index 0000000..2552fbd Binary files /dev/null and b/javaSE2/day12/assets/1556364443940.png differ diff --git a/javaSE2/day12/assets/1556367165141.png b/javaSE2/day12/assets/1556367165141.png new file mode 100644 index 0000000..5dbc7d5 Binary files /dev/null and b/javaSE2/day12/assets/1556367165141.png differ diff --git a/javaSE2/day12/assets/1556368731115.png b/javaSE2/day12/assets/1556368731115.png new file mode 100644 index 0000000..b6ad318 Binary files /dev/null and b/javaSE2/day12/assets/1556368731115.png differ diff --git a/javaSE2/day12/assets/1556373974919.png b/javaSE2/day12/assets/1556373974919.png new file mode 100644 index 0000000..999ed88 Binary files /dev/null and b/javaSE2/day12/assets/1556373974919.png differ diff --git a/javaSE2/day12/day12-Junit、反射、注解.md b/javaSE2/day12/day12-Junit、反射、注解.md new file mode 100644 index 0000000..f0a971f --- /dev/null +++ b/javaSE2/day12/day12-Junit、反射、注解.md @@ -0,0 +1,1100 @@ +# day12 - Junit、反射、注解 + +### 主要内容 + +- Junit单元测试 +- 反射 +- 注解 + +### 学习目标 + +- [ ] 能够使用Junit进行单元测试 + +- [ ] 能够通过反射技术获取Class字节码对象 + + 1. Class.forName(全类名) + 2. 类名.class + 3. 对象.getClass() + +- [ ] 能够通过反射技术获取构造方法对象,并创建对象 + + 1. Class 中存在 getConstructor( 参数) + 2. newInstance + +- [ ] 能够通过反射获取成员方法对象,并且调用方法 + + 1. getMethd : 可以获取本类及父类中的public方法 + 2. getDeclaredMethod : 只能获取本类的所有包含private的方法 + +- [ ] 能够自定义注解 + + ``` + @Target 指定位置 + @Retention 指定生命周期 + public @interface 注解名{ + String vlaue(); + } + ``` + +- [ ] 能够使用自定义注解 + + 1. 可以在根元注解指定的位置,在指定位置上注解 + +## 第1章 Junit单元测试 + +测试分类: +- 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。 +- 白盒测试:需要写代码的。关注程序具体的执行流程。 + +![](img/测试分类.bmp) + +​ Junit是一个Java语言的单元测试框架,属于白盒测试,简单理解为可以用于取代java的main方法。 +​ Junit属于第三方工具,需要导入jar包后使用。 + +#### Junit测试使用步骤 + +1. 编写测试类,简单理解Junit可以用于取代java的main方法 + + 说明:如果以前想让一个方法运行必须在main方法中调用该方法。![1556078373316](assets/1556078373316.png) + +2. 在测试类JunitDemo01方法上添加注解 @Test(说明:关于什么是注解,下面会详细讲解) + + ![1556078462690](assets/1556078462690.png) + +3. @Test修饰的方法要求:public void 方法名() {…} ,没有参数。 + + ==**说明:单元测试的方法必须是public修饰,void表示没有返回值,没有参数列表,否则就会不满足单元测试要求,报异常**==。 + + ![1556078542161](assets/1556078542161.png) + +4. 添加Idea中集成的Junit库,鼠标放在“@Test”处,使用快捷键“alt+Enter”,点击“Add Junit …” + ![1556078626138](assets/1556078626138.png) + + ![1556078637906](assets/1556078637906.png) + +5. 使用:选中方法右键,执行当前方法;选中类名右键,执行类中所有方法(方法必须标记@Test) + + ![1556078709856](assets/1556078709856.png) + + 绿条: 正常运行 + 红条: 出现问题,异常了 + +#### 常用Junit注解 + +1. `@Test`,用于修饰需要执行的方法 + +2. `@Before`,测试方法前执行的方法 + +3. `@After`,测试方法后执行的方法 + + ```java + public class JunitDemo02 { + @Test + public void myTest(){ + System.out.println("测试 test"); + } + + @Before + public void myBefore(){ + System.out.println("方法前"); + } + + @After + public void myAfter(){ + System.out.println("方法后"); + } + } + ``` + + ![1556078289643](assets/1556078289643.png) + + + +## 第2章 反射:框架设计的灵魂 + +### 2.1 反射概述 + +反射是一种机制/功能,利用该机制/功能可以在程序运行过程中==对类进行解剖==并操作类中的构造方法,成员方法,成员属性。 + +#### 2.1.1 反射的使用场景 + +1. 开发工具中写代码时的提示 + + 开发工具之所能够把该对象的方法和属性展示出来就使用利用了反射机制对该对象所有类进行了==解剖获取到了类中的所有方法和属性信息==,这是反射在IDE中的一个使用场景。 + + ![1556079606412](assets/1556079606412.png) + +2. 各种框架的设计【SSM=Spring+SpringMVC+MyBatis】 + + ![1556080052414](assets/1556080052414.png) + + 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 + +#### 2.1.2 反射的好处 + +1. 可以在程序运行过程中,操作这些对象。 +2. 可以解耦,提高程序的可扩展性。 + +### 2.2 类的加载 + +我们要使用反射,那么就得研究类的对象是如何产生,一个class字节码文件是如何加载到内存中的,这是使用反射机制解剖类的前提。 + +当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 + +1. **加载** + + 1. 就是指将class文件读入内存,并为之创建一个Class对象。 + 2. 任何类被使用时系统都会建立一个Class对象 + +2. **连接** + + 1. 验证是否有正确的内部结构,并和其他类协调一致 + 2. 准备负责为类的静态成员分配内存,并设置默认初始化值 + 3. 解析将类的二进制数据中的符号引用替换为直接引用 + +3. **初始化** + + 在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对类变量【静态变量】进行初始化。 + 在 Java 类中对类变量指定初始值有两种方式: + ​ ① 声明类变量时指定初始值; + ​ ② 使用静态代码块为类变量指定初始值。 + +![1556088494865](assets/1556088494865.png) + +当一个类完成加载后就会产生一个该类型的Class对象,我们要使用反射技术,就得使用该Class对象。如何获取该类型的Class对象呢?请看下节内容。 + +### 2.3 获取Class对象的方式 + +| 获取class对象 | 作用 | 应用场景 | +| --------------------| -------------------- | ------------------ | +| Class.forName("全类名") | 通过指定的字符串路径获取 | 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 | +| 类名.class | 通过类名的属性class获取 | 多用于参数的传递 | +| 对象.getClass() | 通过对象的getClass()方法获取 | 多用于对象的获取字节码的方式 | + +注意:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。 + +```java +@Test +public void testClass() throws ClassNotFoundException { + //1.Class.forName("全类名") + //全类名路径:含有包名的全类名 + Class cls1 = Class.forName("com.inmind.demo01Reflect.User"); + //2.类名.class + Class cls2 = User.class; + //3.对象.getClass() + Class cls3 = new User().getClass(); + + //类只加载一次,内存中只会存在一份User 文件 + System.out.println(cls1 == cls2); // true + System.out.println(cls1 == cls3); // true +} +``` + +### 2.4 获取Class对象信息 + +#### 2.4.1 获取类名信息 + +我们已经获取了Class对象了,接下来就介绍几个Class类中常用的方法了。 + +1. `String getSimpleName()`; 获得简单类名,只是类名,没有包 +2. `String getName();` 获取完整类名,包含包名+类名 +3. `T newInstance() ;`创建此 Class 对象所表示的类的一个新实例。要求:==类必须有public的无参数构造方法== + +```java +@Test +public void testClass2() throws IllegalAccessException, InstantiationException { + //获取User类的Class对象 + Class cls = User.class; + //1. String getSimpleName(); 获得简单类名,只是类名,没有包 + String simpleName = cls.getSimpleName(); + System.out.println("simpleName = " + simpleName); //User + //2. String getName(); 获取完整类名,包含包名+类名 + String name = cls.getName(); + System.out.println("name = " + name);// com.inmind.demo01Reflect.User +} +``` + +测试结果: + +![1556090042762](assets/1556090042762.png) + + + +一开始在阐述反射概念的时候,我们说到利用反射可以在程序运行过程中对类进行解剖并操作里面的成员。而一般常操作的成员:构造方法,成员方法,成员属性,那么接下来看看怎么利用反射来操作这些成员以及操作这些成员能干什么,先来看看怎么操作构造方法。 + +#### 2.4.2 获取类中构造器 + +要通过反射操作类的构造方法,我们需要先知道一个Constructor类。Constructor是构造方法类,类中的每一个构造方法都是Constructor的对象,通过Constructor对象可以实例化对象。 + +##### Constructor类概述 + +Constructor是构造方法类,类中的每一个构造方法都是Constructor的对象,通过Constructor对象可以实例化对象。 + +![1556092262925](assets/1556092262925.png) + +##### Class中获取Constructor的方法 + +1. `Constructor[] getConstructors()` + + 获取所有的public修饰的构造方法 + +2. `Constructor getConstructor(Class... parameterTypes)` + + 根据参数类型获取构造方法对象,只能获得public修饰的构造方法。如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。 + + ```java + 参数是可变参数,调用此方法时,可以不写参数,获取的空参构造可以写参数,给定的参数必须是Class对象 + 比如: + 参数 类名(String name,int age) + 调用此方法: String.class,int.class + ``` + + 例如,一已知存在User类如下: + + ```java + public class User { + int age + String name; + + public User(){} + + public User(String name,int age) { + this.name = name; + this.age = age; + } + } + ``` + + 1. 获取所有public构造方法 + + 2. 获取public修饰的空参构造方法对象 + + 3. 获取public修饰的第一个参数是String类型,第二个参数是int类型的构造方法对象 + + ```java + @Test + public void testConstructor() throws NoSuchMethodException { + Class cls = User.class; + //1. 获取所有的public构造方法 + Constructor[] cons = cls.getConstructors(); + for (Constructor con : cons) { + System.out.println("con = " + con); + } + System.out.println("========"); + //2. 获取public修饰的空参构造方法对象 + Constructor con1 = cls.getConstructor(); + System.out.println("con1 = " + con1); + System.out.println("========"); + //3. 获取public修饰的第一个参数是String类型,第二个参数是int类型的构造方法对象 + Constructor con2 = cls.getConstructor(String.class, int.class); + System.out.println("con2 = " + con2); + } + ``` + + 运行如下: + + ![1556093210198](assets/1556093210198.png) + +##### Constructor类中常用方法 + +1. T newInstance(Object... initargs) 根据指定参数创建对象。 +2. T newInstance() 空参构造方法创建对象。 + +```java +@Test +public void test3() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { + Class cls = User.class; + + //1. 获取public修饰的空参构造方法对象 + Constructor con1 = cls.getConstructor(); + User u1 = con1.newInstance(); + System.out.println("name="+u1.name+":age="+u1.age); + + System.out.println("========"); + //2. 获取public修饰的第一个参数是String类型,第二个参数是int类型的构造方法对象 + Constructor con2 = cls.getConstructor(String.class, int.class); + User u2 = con2.newInstance("小强", 10); + System.out.println("name="+u2.name+":age="+u2.age); + +} +``` + +运行结果如下: + +![1556093748861](assets/1556093748861.png) + + + +#### 2.4.3 获取类中方法 + +Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以调用方法。 + +![1556094406370](assets/1556094406370.png) + +##### Class类获取Method相关方法 + +```java +1. Method[] getMethods() +获取所有的public修饰的成员方法,包括父类中 + +2. Method[] getDeclaredMethods() +获取当前类中所有的方法,包含私有的,不包括父类中 + +3. Method getMethod("方法名", 方法的参数类型... 类型) +根据方法名和参数类型获得一个方法对象,只能是获取public修饰的 + +4. Method getDeclaredMethod("方法名", 方法的参数类型... 类型) +根据方法名和参数类型获得一个方法对象,包括private修饰的 + +``` + +##### Method类中常用方法 + +```java +1. Object invoke(Object obj, Object... args) +根据参数args调用对象obj的该成员方法 +如果obj=null,则表示该方法是静态方法 + +2. void setAccessible(true) +暴力反射,设置为可以直接调用私有修饰的成员方法【对于私有方法使用前需要调用该方法】 +``` + +> 编写代码演示 + +存在User类: + +```java +User.java +/** + * 用户 JavaBean + */ +public class User { + //项目开发中,字段和属性名相同 + private int id;//编号 + private String name;//姓名 + private double sal;//薪水 + + public User(){} + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public double getSal() { + return sal; + } + public void setSal(double sal) { + this.sal = sal; + } +} + +``` + +```java +/** + * 获取Class对象的Method信息 + */ +public class Demo04 { + + /** + * 演示Method[] getMethods() + * JUnit单元测试 + */ + @Test + public void test1() { + Class clazz = User.class; + Method[] ms = clazz.getMethods(); + for(Method m:ms){ + System.out.println(m); + } + } + + /** + * 演示Method[] getDeclaredMethods() + */ + @Test + public void test2(){ + Class clazz = User.class; + Method[] ms = clazz.getDeclaredMethods(); + for(Method m:ms){ + System.out.println(m); + } + } + + /** + * 演示Method getMethod("方法名", 方法的参数类型... 类型) + */ + @Test + public void test3() throws Exception{ + Class clazz = User.class; + //参数一:方法名 + //参数二:方法名中参数的Class类型,如果无的话,书写null + Method m = clazz.getMethod("set",null); + System.out.println(m); + } + + /** + * 演示Method getDeclaredMethod("方法名", 方法的参数类型... 类型) + */ + @Test + public void test4() throws Exception{ + Class clazz = User.class; + Object obj = clazz.newInstance(); + Method m = clazz.getDeclaredMethod("show",null); + System.out.println(m); + } + + /** + * 演示Object invoke(Object obj, Object... args) + */ + @Test + public void test5() throws Exception{ + Class clazz = User.class; + Object obj = clazz.newInstance(); + //参数一:方法名 + //参数二:方法名中参数的Class类型,如果无的话,书写null + Method m = clazz.getMethod("set",null); + //调用方法 + //参数一:对象 + //参数二:实际参数,如果无的话,书写null + m.invoke(obj,null); + } + + /** + * 演示void setAccessible(true) + */ + @Test + public void test6()throws Exception{ + Class clazz = User.class; + Object obj = clazz.newInstance(); + Method m = clazz.getDeclaredMethod("show",null); + //暴力反射 + m.setAccessible(true); + m.invoke(obj,null); + } + +``` + + + +#### 2.4.4 获取类中属性 + +##### Field类概述 + +Field是属性类,类中的每一个属性都是Field的对象,通过Field对象可以给对应的属性赋值和取值。 + +![1556095819688](assets/1556095819688.png) + +##### Class类中与Field相关方法 + +```java +1. Field[] getFields() +获取所有的包括父类中public修饰的属性对象,返回数组 + +2. Field[] getDeclaredFields() +获取所有本类属性对象,包括private修饰的,返回数组 + +3. Field getField(String name) +根据属性名获得属性对象,只能获取public修饰的 + +4. Field getDeclaredField(String name) +根据属性名获得属性对象,包括private修饰的 +``` + + + +##### Filed类中的方法 + +```java +1. Object get(Object obj) + 返回指定对象上此 Field 表示的字段的值。 + +2. void set(Object obj, Object value) + 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 +3. void setAccessible(true); + 暴力反射,设置为可以直接访问私有类型的属性 +``` + +例如:已知类User,通过反射的方式获取属性 + +```java +public class User { + + //项目开发中,字段和属性名相同 + + private int id;//编号 + private String name;//姓名 + private double sal;//薪水 + + public User(){} + //省略 getter/setter方法 +} +``` + +```java +/** + * 获取Class对象的Field信息 + */ +public class Demo05 { + + /** + * 演示Field[] getFields() + */ + @Test + public void test1() throws Exception{ + Class clazz = User.class; + Field[] fs = clazz.getFields(); + for (Field f : fs) { + System.out.println(f); + } + } + + /** + * 演示Field[] getDeclaredFields() + */ + @Test + public void test2()throws Exception{ + Class clazz = User.class; + Field[] fs = clazz.getDeclaredFields(); + for (Field f : fs) { + System.out.println(f); + } + } + + /** + * 演示Field getField(String name) + */ + @Test + public void test3()throws Exception{ + Class clazz = User.class; + //获取某个Field对象 + //参数一:字段名 + Field f = clazz.getField("id"); + System.out.println(f); + } + + /** + * 演示Field getDeclaredField(String name) + */ + @Test + public void test4()throws Exception{ + Class clazz = User.class; + Field f = clazz.getDeclaredField("sal"); + System.out.println(f); + } + + /** + * 演示set/get() + */ + @Test + public void test5()throws Exception{ + Class clazz = User.class; + Object obj = clazz.newInstance(); + //获取某个Field对象 + //参数一:字段名 + Field f = clazz.getField("id"); + //为id字段设置值 + //参数一:对象 + //参数二:实际值 + f.setInt(obj,2018); + //从id字段中获取值 + System.out.println(f.getInt(obj)); + } + + /** + * 演示void setAccessible(true) + */ + @Test + public void test6()throws Exception{ + Class clazz = User.class; + Object obj = clazz.newInstance(); + //f指向私有成员变量 + Field f = clazz.getDeclaredField("sal"); + //暴力反射 + f.setAccessible(true); + f.setDouble(obj,5555.55); + System.out.println(f.getDouble(obj)); + + } +} + +``` + + + +### 3 反射案例 + +需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 + +实现: + +1. 配置文件 +2. 反射 + +步骤: + +1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中 +2. 在程序中加载读取配置文件 +3. 使用反射技术来加载类文件进内存 +4. 创建对象 +5. 执行方法 + +> 编写代码演示 + +pro.properties + +```java +className=com.inmind.domain.Student +methodName=sleep +``` + +Student.java + +```java +package com.inmind.domain; + +public class Student { + public void sleep(){ + System.out.println("sleep..."); + } +} +``` + +RefectTest.java + +```java +public class ReflectTest { + @Test + public void test() throws Exception { + //可以创建任意类的对象,可以执行任意方法 + //前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法 + + //1.加载配置文件 + //1.1创建Properties对象 + Properties pro = new Properties(); + //1.2加载配置文件,转换为一个集合 + InputStream is = new FileInputStream("pro.properties"); + pro.load(is); + + //2.获取配置文件中定义的数据 + String className = pro.getProperty("className"); + String methodName = pro.getProperty("methodName"); + + //3.加载该类进内存 + Class cls = Class.forName(className); + //4.创建对象 + Object obj = cls.newInstance(); + //5.获取方法对象 + Method method = cls.getMethod(methodName); + //6.执行方法 + method.invoke(obj); + } +} +``` + + + +## 第3章 注解 + +### 4.1 注解概述 + +#### 注解是什么 + +注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上定义。 + +#### 注解的应用场景 + +1. 在代码中辅助说明代码的功能或者限定语法格式 + + ``` + 例如: + 重写方法时使用 @Override 限定子类方法格式 + 函数式接口使用 @Functionnal 限定接口格式 + 单元测试时用来标记方法使用 @Test + 表示方法已经过时 @Deprecated + ``` + +2. 在框架中配置数据 + + 现在多数框架都基于注解进行配置【后面又例子说明】 + + + +### 4.2 自定义注解 + +#### 定义格式 + +```java +public @interface 注解名称{ + 注解成员 +} +``` + +- 注解本质上就是一个接口,该接口默认继承Annotation接口 + +```java +public interface MyAnno extends java.lang.annotation.Annotation {} +``` + +#### 注解的成员定义 + +1. **注解成员的作用** + + 可以用来保存注解中需要保存得值 + +2. **注解成员定义格式** + + 其实就是接口中定义一个无参有返回值类型得抽象方法,特别的是可以给成员指定一个默认值。如下: + + - **格式1:数据类型 属性名();** + - **格式2:数据类型 属性名() default 默认值;** + + 例如: + + ```java + public @interface StudentInfo { + String name(); // 姓名 + int age() default 18; // 年龄 + String gender() default "男"; // 性别 + } + ``` + +3. **成员支持的类型** + + 1. 八种基本数据类型(**int,float,boolean,byte,double,char,long,short**) + 2. String类型,Class类型,Enum枚举类型,注解类型 + 3. 以上所有类型的对应的一维数组 + + + +### 4.3 使用自定义注解 + +#### 使用注解 + +定义好注解后,我们可以将注解作用在类,成员变量及方法上。 + +使用格式: + +``` +@注解名(属性名 = 属性值, 属性名 = 属性值, ...) +``` + +例如: + +```java +@StudentInfo(name = "李四", age = 20, gender = "女")//注解作用在类上 +public class Demo01Student { + + @StudentInfo(name = "李四", age = 20, gender = "女")//注解作用在成员变量上 + Student stu; + + @StudentInfo(name = "李四", age = 20, gender = "女")//注解作用在方法上 + public void showStudent(Student student) { + System.out.println("student = " + student); + + Student stu; + } + +} +``` + +**使用注意事项** + +- 如果属性有默认值,则使用注解的时候,这个属性可以不用赋值。 +- 如果属性没有默认值,那么在使用注解时一定要给属性赋值。 + +#### 特殊属性value + +1. **当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值,无论value是单值元素还是数组类型。** + +```java +// 定义注解Book +public @interface Book { + // 书名 + String value(); +} + +// 使用注解Book +public class BookShelf { + @Book("西游记") + public void showBook(){ + + } +} +或 +public class BookShelf { + @Book(value="西游记") + public void showBook(){ + + } +} +``` + +2.**如果注解中除了value属性还有其他属性,且至少有一个属性没有默认值,则在使用注解给属性赋值时,value属性名不能省略。** + +```java +// 定义注解Book +public @interface Book { + // 书名 + String value(); + // 价格 + double price() default 100; + // 多位作者 + String[] authors(); +} + +// 使用Book注解:正确方式 +@Book(value="红楼梦",authors = "曹雪芹") +public class BookShelf { + // 使用Book注解:正确方式 + @Book(value="西游记",authors = {"吴承恩","白求恩"}) + public void showBook(){ + + } +} +// 使用Book注解:错误方式 +public class BookShelf { + @Book("西游记",authors = {"吴承恩","白求恩"}) + public void showBook(){ + } +} +// 此时value属性名不能省略了。 +``` + +### 4.4 元注解 + +#### 元注解概述 + +用来定义注解的注解,用来说明自定义注解的在类中出现的位置和生命周期 + +#### 常用元注解 + +##### @Target + +```java +作用:定义该注解用在哪个位置,如果不写,默认是类中任何地方都可以使用。 + +可选的参数值在枚举类ElemenetType中包括: +TYPE: 用在类,接口上 +FIELD:用在成员变量上 +METHOD: 用在方法上 +PARAMETER:用在参数上 +CONSTRUCTOR:用在构造方法上 +LOCAL_VARIABLE:用在局部变量上 + +``` + +##### @Retention + +```java +作用:定义该注解的生命周期 + +可选的参数值在枚举类型RetentionPolicy中包括: +SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。 +CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没 +有,这个是默认值。 +RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中, +程序可以通过反射获取该注解 + +``` + +例如: + +自定义一个注解 + +```java +@Retention(value = RetentionPolicy.RUNTIME) // 注解声明周期到运算时 +@Target(value = ElementType.METHOD) //只能用于方法 +public @interface Book { + int id() default 10;//图书编号 + + String author() default "赵君";//作者 + + double price() default 11.11;//单价 +} +``` + +使用该注解时,只能在本: + +![1556367165141](assets/1556367165141.png) + +### 4.5 解析注解 + +通过Java技术,在程序运行时,获取注解中所有属性的过程则称为解析注解。 + +#### 与注解解析相关的接口 + +``` + +Anontation:所有注解类型的公共接口,类似所有类的父类是Object。 + +AnnotatedElement接口:定义了与注解解析相关的方法,常用方法以下四个: + +1. boolean isAnnotationPresent(Class annotationClass); + 判断当前对象是否有指定的注解,有则返回true,否则返回false。 + +2. T getAnnotation(Class annotationClass); + 获得当前对象上指定的注解对象。 + +3. Annotation[] getAnnotations(); + 获得当前对象及其从父类上继承的所有的注解对象。 + +4. Annotation[] getDeclaredAnnotations(); + 获得当前对象上所有的注解对象,不包括父类的。 + +``` + +![1556368731115](assets/1556368731115.png) + +AnnotatedElement接口是Method,Constructor,Filed等的父接口,所以我们在判断这些对象是否存在注解时,可以使用通用方法。 + +#### 获取注解数据的原理 + +注解作用在那个成员上,就通过反射获得该成员的对象来得到它的注解。 + +如注解作用在方法上,就通过方法(Method)对象得到它的注解 + +```java +// 得到方法对象 +Method method = clazz.getDeclaredMethod("方法名"); +// 根据注解名得到方法上的注解对象 +Book book = method.getAnnotation(Book.class); + +``` + +如注解作用在类上,就通过Class对象得到它的注解 + +```java +// 获得Class对象 +Class c = 类名.class; +// 根据注解的Class获得使用在类上的注解对象 +Book book = c.getAnnotation(Book.class); + +``` + +例如: + +```java +/** + * 解析注解Book + */ +public class Demo03 { + + /** + * 在程序运行时,获取注解Book的所有属性值 + */ + @Book + public void test1() throws Exception{ + //@Book->test1()->Class + + //获取Demo03类的Class对象 + Class clazz = Demo03.class; + //获取Class对象的Method对象 + Method m = clazz.getMethod("test1",null); + //获取Method对象中的@Book注解 + //参数一:注解类型的Class + //返回值:注解 + Book book = m.getAnnotation(Book.class); + //获取Book注解里面的所有属性值 + System.out.println(book.id()); + System.out.println(book.author()); + System.out.println(book.price()); + } + + + public static void main(String[] args) throws Exception{ + Demo03 test = new Demo03(); + test.test1(); + } + +} +``` + + + +### 注解案例 + +使用反射获取注解的数据 需求说明 + +1. 定义注解BookInfo,要求如下: + - 包含属性:String value() 书名 + 1. 包含属性:double price() 价格,默认值为 100 + 2. 包含属性:String[] authors() 多位作者 + 3. 限制注解使用的位置:类和成员方法上 + 4. 指定注解的有效范围:RUNTIME +2. 定义BookStore类,在类和成员方法上使用BookInfo注解 +3. 定义TestAnnotation测试类获取BookInfo注解上的数据 + +按照需求实现 + +- BookInfo + +```java + +@Target({ElementType.METHOD, ElementType.TYPE}) +//支持用在方法上和类型上 +@Retention(RetentionPolicy.RUNTIME)// 生命周期到运行时 +public @interface BookInfo { + String value(); // 书名 + double price() default 100; // 价格 + String[] authors(); // 作者 +} +``` + +- BookStore + +```java +@BookInfo(value = "红楼梦", authors = "曹雪芹", price = 998) +public class BookStore { + @BookInfo(value = "西游记", authors = "吴承恩") + public void buyBook() { + } +} +``` + +- TestAnnotation + +```java + +public class AnnotationTest { + public static void main(String[] args) throws NoSuchMethodException { + //获取Class对象 + Class cls = BookStore.class; + boolean result = cls.isAnnotationPresent(BookInfo.class); + if (result) { + BookInfo bookInfo = cls.getAnnotation(BookInfo.class); + showBookInfo(bookInfo); + } + + System.out.println("========"); + + //获取方法 + Method buyBook = cls.getDeclaredMethod("buyBook"); + if (buyBook.isAnnotationPresent(BookInfo.class)) { + BookInfo bookInfo = buyBook.getAnnotation(BookInfo.class); + + showBookInfo(bookInfo); + } + + } + + private static void showBookInfo(BookInfo bookInfo) { + String value = bookInfo.value(); + String[] authors = bookInfo.authors(); + double price = bookInfo.price(); + + System.out.println("value = " + value); + System.out.println("price = " + price); + System.out.println("authors = " + Arrays.toString(authors)); + } +} +``` + +​ ![1556373974919](assets/1556373974919.png) \ No newline at end of file diff --git a/javaSE2/day12/img/image11.png b/javaSE2/day12/img/image11.png new file mode 100644 index 0000000..13b6fbe Binary files /dev/null and b/javaSE2/day12/img/image11.png differ diff --git a/javaSE2/day12/img/image12.png b/javaSE2/day12/img/image12.png new file mode 100644 index 0000000..767774e Binary files /dev/null and b/javaSE2/day12/img/image12.png differ diff --git a/javaSE2/day12/img/image16.png b/javaSE2/day12/img/image16.png new file mode 100644 index 0000000..aaee54d Binary files /dev/null and b/javaSE2/day12/img/image16.png differ diff --git a/javaSE2/day12/img/image29.png b/javaSE2/day12/img/image29.png new file mode 100644 index 0000000..01db926 Binary files /dev/null and b/javaSE2/day12/img/image29.png differ diff --git a/javaSE2/day12/img/junit01.png b/javaSE2/day12/img/junit01.png new file mode 100644 index 0000000..6232ace Binary files /dev/null and b/javaSE2/day12/img/junit01.png differ diff --git a/javaSE2/day12/img/测试分类.bmp b/javaSE2/day12/img/测试分类.bmp new file mode 100644 index 0000000..629edad Binary files /dev/null and b/javaSE2/day12/img/测试分类.bmp differ diff --git a/javaSE2/day12/img/类加载器01.bmp b/javaSE2/day12/img/类加载器01.bmp new file mode 100644 index 0000000..b9863ac Binary files /dev/null and b/javaSE2/day12/img/类加载器01.bmp differ diff --git a/javaSE2/day12/img/类加载器02.bmp b/javaSE2/day12/img/类加载器02.bmp new file mode 100644 index 0000000..f6edc53 Binary files /dev/null and b/javaSE2/day12/img/类加载器02.bmp differ diff --git a/javaSE2/day13/day09.md b/javaSE2/day13/day09.md new file mode 100644 index 0000000..3d64618 --- /dev/null +++ b/javaSE2/day13/day09.md @@ -0,0 +1,3 @@ +# day13-动态代理、xml + +## 见doc文件资料