MySQL事件调度器

1、创建记录表:

1
2
3
4
5
6
7
8
9
-- 用户登录记录表
create table user_logs
(
id bigint auto_increment primary key,
user_id bigint not null,
login_time datetime not null,
session_data text,
index (login_time)
);

2、启动事件调度器:

1
2
3
4
5
-- 检查事件调度器是否启用
show variables like 'event_scheduler';

-- 启用事件调度器
set global event_scheduler = on;

3、创建事件:

1
2
3
4
5
6
7
create event delete_old_logs
on schedule every 1 day -- 每天执行
starts current_timestamp -- 从当前时间开始
do
delete
from user_logs
where login_time < now() - interval 30 day; -- 删除三十天前的登录记录

4、事件调度器基本操作:

1
2
3
4
5
6
7
8
-- 查看事件
show events;

-- 禁用事件
alter event delete_old_logs disable;

-- 删除事件
drop event delete_old_logs;

MySQL函数大全笔记(持续更新中...)

控制流程函数:

1. case when then 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 例子:
SELECT
employee_id,
first_name,
last_name,
CASE
WHEN salary < 3000 THEN 'Low'
WHEN salary BETWEEN 3000 AND 6000 THEN 'Medium'
ELSE 'High'
END AS salary_category
FROM
employees;
-- 解析:这个和Java里面一样

2. IF 函数

1
2
3
4
5
6
7
8
9
-- 例子:
SELECT
employee_id,
first_name,
last_name,
IF(salary > 5000, 'High Salary', 'Low Salary') AS salary_status
FROM
employees;
-- 解析:如果 salary > 5000 为true,则返回'High Salary',否则返回'Low Salary'

3. IFNULL 函数

1
2
3
4
5
6
7
8
9
-- 例子:
SELECT
employee_id,
first_name,
last_name,
IFNULL(phone_number, 'No Phone Number') AS contact_number
FROM
employees;
-- 解析:如果 phone_number 为null,则返回'No Phone Number'

4. NULLIF 函数

1
2
3
4
5
6
7
8
-- 例子:
SELECT
product_id,
product_name,
NULLIF(discount, 0) AS effective_discount
FROM
products;
-- 解析:如果 discount 为0,则返回null,否则返回原始的值

字符串函数:

5. ASCII 函数

1
2
3
4
5
6
7
-- 例子:
SELECT
first_name,
ASCII(SUBSTRING(first_name, 1, 1)) AS ascii_value
FROM
employees;
-- 解析:如果员工的名字是 "Belly",则 ascii_value 将返回 66,因为大写字母 "B" 的 ASCII 值是 66。

6. BIN 函数

1
2
3
4
5
6
7
8
-- 例子:
SELECT
employee_id,
salary,
BIN(salary) AS binary_salary
FROM
employees;
-- 解析:如果工资是 10,binary_salary 将显示为 '1010'。

7. CHAR 函数

1
2
3
4
5
6
7
8
-- 例子:
SELECT
employee_id,
CHAR(65) AS character_a,
CHAR(66, 67) AS characters_bc
FROM
employees;
-- 解析:CHAR(65)返回A,CHAR(66, 67)返回BC

8. CHAR_LENGTH 函数

1
2
3
4
5
6
7
8
-- 例子:
SELECT
employee_id,
first_name,
CHAR_LENGTH(first_name) AS name_length
FROM
employees;
-- 解析:如果员工的名字是 "Belly",则 name_length 将返回 5。

9. CHARACTER_LENGTH 函数

1
2
3
4
5
6
7
8
-- 例子:
SELECT
employee_id,
last_name,
CHARACTER_LENGTH(last_name) AS name_length
FROM
employees;
-- 解析:如果员工的名字是 "Belly",则 name_length 将返回 5。

10. COMPRESS 函数

1
2
3
4
5
6
7
-- 例子:
SELECT
first_name,
COMPRESS(first_name) AS compressed_name
FROM
employees;
-- 解析:该函数会将每个员工的名字压缩,生成一个更小的二进制格式。如果你需要节省存储或优化性能,使用这个函数会很有帮助。

11. CONCAT 函数

1
2
3
4
5
6
7
8
-- 例子:
SELECT
first_name,
last_name,
CONCAT(first_name, '_', last_name) AS full_name
FROM
employees;
-- 解析:如果 first_name 是 "Belly" 而 last_name 是 "lin",则 full_name 将返回 "Belly_lin"。

12. CONCAT_WS 函数

1
2
3
4
5
6
7
8
-- 例子:
SELECT
first_name,
last_name,
CONCAT_WS(' ', first_name, last_name) AS full_name
FROM
employees;
-- 解析:该函数使用空格作为分隔符,如果 first_name 是 "Belly" 而 last_name 是 "lin",则 full_name 将返回 "Belly lin"。

13. CONV 函数

1
2
3
4
5
-- 例子:
SELECT CONV(10, 10, 2); -- 返回 '1010'
SELECT CONV('A', 16, 10); -- 返回 '10'
SELECT CONV('10', 8, 16); -- 返回 '8'
-- 解析:1.将十进制数转换为二进制;2.将十六进制数转换为十进制;3.将八进制数转换为十六进制。

14. ELT 函数

1
2
3
4
-- 例子:
SELECT ELT(2, 'apple', 'banana', 'cherry'); -- 返回 'banana'
SELECT ELT(5, 'one', 'two', 'three'); -- 返回 NULL,因为没有第五个元素
-- 解析:索引(从 1 开始),如果索引超出范围,返回 null。

15. EXPORT_SET 函数

1
2
3
4
-- 例子:
SELECT EXPORT_SET(preferences, 'Enabled', 'Disabled', ', ', 3) AS preference_string
FROM user_preferences;
-- 解析:如果 preferences 的值为 5(即二进制 101),输出将会是:Enabled, Disabled, Enabled。(ps:第四个空是在结果字符串中分隔符,第五个空是要检查的位数)

16. FIELD 函数

1
2
3
-- 例子:
SELECT FIELD('b', 'a', 'b', 'c');
-- 解析:输出将是 2,因为 'b' 是列表中的第二个元素,如果不存在输出是0。

17. FIND_IN_SET 函数

1
2
3
-- 例子:
SELECT * FROM students WHERE FIND_IN_SET('Math', courses);
-- 解析:如果有一个表 students,其中有一个列 courses,它存储了学生所选的课程,以逗号分隔(ps: courses:"Math,English,Physics"),这个查询将返回所有选修了“Math”课程的学生。

18. FORMAT 函数

1
2
3
-- 例子:
SELECT FORMAT(1234567.891, 2);
-- 解析:结果输出为1,234,567.89,

19. HEX 函数

1
2
3
4
-- 例子:
SELECT HEX('Hello');
SELECT HEX(255);
-- 解析:输出结果 1.'48656C6C6F';2.'FF',该函数是能将字符串或则数字转成十六进制。

20. INSTR 函数

1
2
3
-- 例子:
SELECT INSTR('Hello, World!', 'World');
-- 解析:输出结果为8, 对大小写敏感,从1开始计数。

21. LCASE 函数

1
2
3
-- 例子:
SELECT LCASE('Hello World');
-- 解析:输出结果为'hello world',LCASE() 是 LOWER() 的同义词,将字符串中的所有字母转换为小写字母。

22. LEFT 函数

1
2
3
-- 例子:
SELECT LEFT('Hello World', 5);
-- 解析:输出结果为'Hello',该函数用于从一个字符串的左侧提取指定数量的字符。

23. LENGTH 函数

1
2
3
-- 例子:
SELECT LENGTH('Hello World');
-- 解析:输出结果为11,因为“Hello World”包含 11 个字符

24. LOAD_FILE 函数

1
2
3
-- 例子:
SELECT LOAD_FILE('/path/to/your/file.txt') AS file_content;
-- 解析:该函数用于从指定的文件中读取数据。它返回文件的内容,前提是服务器有权限访问该文件。

25. LOCATE 函数

1
2
3
4
-- 例子:
SELECT LOCATE('world', 'Hello world!');
SELECT LOCATE('o', 'Hello world!', 5);
-- 解析:1.输出结果为7,因为 "world" 从第 7 个字符开始;2.输出结果为8,从第 5 个字符开始查找 "o",找到的位置是第 8 个,如果不存在则返回0。

26. LOWER 函数

1
2
3
-- 例子:
SELECT LOWER('Hello World');
-- 解析:输出结果为'hello world',LCASE() 是 LOWER() 的同义词,将字符串中的所有字母转换为小写字母。

27. LPAD 函数

1
2
3
4
-- 例子:
SELECT LPAD('123', 5, '0');
SELECT LPAD('Hello', 3, 'X');
-- 解析:1.输出结果为'00123';2.输出结果为'Hel',因为长度限制为 3。该函数用于将字符串的左侧填充指定的字符,以达到特定的长度。

28. LTRIM 函数

1
2
3
-- 例子:
SELECT LTRIM(' Hello World! ');
-- 解析:输出结果为'Hello World! ',左侧的空格被删除。

29. MAKE_SET 函数

1
2
3
4
-- 例子:
SELECT MAKE_SET(5, 'Apple', 'Banana', 'Cherry', 'Date', 'Elderberry');
SELECT MAKE_SET(3, 'Red', 'Green', 'Blue', 'Yellow', 'Black');
-- 解析:1.返回结果为'Apple,Cherry',因为 5 的二进制是 101,表示选择第 1 和第 3 个字符串;2.返回结果为'Red,Green',因为 3 的二进制是 011,表示选择第 1 和第 2 个字符串。

30. MID 函数

1
2
3
-- 例子:
SELECT MID('Hello World', 1, 5);
-- 解析:输出结果为'Hello',MID(str ,pos ,len ) 是 SUBSTRING(str ,pos ,len ) 的同义词。

31. OCT 函数

1
2
3
-- 例子:
SELECT OCT(10);
-- 解析:返回结果为:12,该函数用于将数字转换为八进制(Octal)字符串表示。

32. OCTET_LENGTH 函数

1
2
3
-- 例子:
SELECT OCTET_LENGTH('中文');
-- 解析:返回结果为:6(字符 "中文" 在 UTF-8 编码下每个字符占用 3 个字节),该函数是计算字符串占用的内存大小,而不是字符数。

33. ORD 函数

1
2
3
4
-- 例子:
SELECT ORD('Hello');
SELECT ORD('你');
-- 解析:1.输出结果为:72;2.输出结果为:20320(在 UTF-8 编码下,字符 '你' 的 Unicode 代码点是 20320),该函数用于返回字符串中第一个字符的 ASCII 码 或 Unicode 代码点。

34. POSITION 函数

1
2
3
-- 例子:
SELECT POSITION('na' IN 'banana');
-- 解析:输出结果为:2,该函数用于返回子字符串在字符串中首次出现的位置(索引,从1开始)。

35. QUOTE 函数

1
2
3
-- 例子:
SELECT QUOTE('This is a "quoted" word');
-- 解析:输出结果为:'This is a \"quoted\" word',转义双引号,生成合法的 SQL 字符串,该函数用于将字符串转换为合法的 SQL 字符串文字(即在字符串两边加上引号)。

36. REPEAT 函数

1
2
3
4
-- 例子:
SELECT REPEAT('abc', 3);
SELECT REPEAT('test', 0);
-- 解析:1.输出结果为:abcabcabc ;2.输出结果为:''(空字符串),该函数用于重复一个字符串指定的次数,并返回生成的结果,如次数为负数报错。

37. REPLACE 函数

1
2
3
-- 例子:
SELECT REPLACE('Hello, world!', 'world', 'SQL');
-- 解析:输出结果为:Hello, SQL! ,该函数用于替换字符串中的指定部分。它会查找原字符串中的某个子字符串,并将其替换为另一个子字符串。

38. REVERSE 函数

1
2
3
-- 例子:
SELECT REVERSE('12345');
-- 解析:输出结果为:54321,该函数用于返回给定字符串的反转版本,即将字符串中的字符顺序倒置。

39. RIGHT 函数

1
2
3
-- 例子:
SELECT RIGHT('abcdef', 3);
-- 解析:输出结果为:def ,该函数用于返回一个字符串的 右侧(即末尾)部分,它从指定的位置开始,提取字符串的最后 N 个字符。

40. RPAD 函数

1
2
3
-- 例子:
SELECT RPAD('abc', 6, '*')
-- 解析:输出结果为:'abc***' ,该函数作用是将一个字符串填充到指定的长度,如果原字符串的长度小于指定的长度,则会在其右侧(也就是字符串的结尾)填充指定的字符,直到字符串达到目标长度。

41. RTRIM 函数

1
2
3
-- 例子:
SELECT RTRIM(' Hello World ');
-- 解析:输出结果为' Hello World',该函数用于移除字符串右端的空格字符(即尾部的空格)。

42. SOUNDEX 函数

1
2
3
-- 例子:
SELECT SOUNDEX('hello');
-- 解析:输出结果为:'H440',该函数是一个用来返回字符串的声音编码的函数。

43. SPACE 函数

1
2
3
-- 例子:
SELECT SPACE(5);
-- 解析:输出结果为:' ',该函数用于生成指定数量的空格字符。

44. SUBSTRING 函数

1
2
3
-- 例子:
SELECT SUBSTRING('Hello, World!', -6, 5);
-- 解析:输出结果为:'World' (ps:从倒数第六个开始提取五个字符),该函数用于从一个字符串中提取子字符串。

45. SUBSTRING_INDEX 函数

1
2
3
4
-- 例子:
SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', 2);
SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -1);
-- 解析:1.输出结果为:'apple,banana';2.输出结果为:'cherry',该函数用于根据指定的分隔符提取字符串的某一部分。

46. TRIM 函数

1
2
3
-- 例子:
SELECT TRIM(' Hello, World! ');
-- 解析:输出结果为:'Hello, World!',该函数用于删除字符串两端的空白字符或指定的字符。

47. UCASE 函数

1
2
3
-- 例子:
SELECT UCASE('hello, world!');
-- 解析:输出结果为:'HELLO, WORLD!',该函数用于将字符串中的所有字符转换为大写字母。

48. UNCOMPRESS 函数

1
2
3
4
-- 例子:
SELECT COMPRESS('This is a test string.'); -- 压缩数据
SELECT UNCOMPRESS(COMPRESS('This is a test string.')); -- 解压缩数据
-- 解析:该函数用于解压缩使用 COMPRESS() 压缩的二进制数据。

49. UNCOMPRESSED_LENGTH 函数

1
2
3
4
-- 例子:
SELECT COMPRESS('This is a test string.'); -- 压缩一个字符串
SELECT UNCOMPRESSED_LENGTH(COMPRESS('This is a test string.')); -- 获取该压缩数据的原始长度
-- 解析:输出结果为:22,该函数用于计算已压缩数据的原始长度。

50. UNHEX 函数

1
2
3
-- 例子:
SELECT UNHEX('A1B2');
-- 解析:输出结果为:0xA1B2,该函数用于将十六进制字符串转换为原始的二进制数据。

51. UPPER 函数

1
2
3
-- 例子:
SELECT UPPER('hello!');
-- 解析:输出结果为:HELLO!,该函数用于将字符串中的所有字母转换为大写字母。

日期时间函数:

52. ADDDATE 函数

1
2
3
4
5
6
7
8
9
-- 语法:
-- ADDDATE(date, INTERVAL expr unit)
-- date:要修改的原始日期或时间。
-- expr:要添加的时间间隔数值,可以是一个数字或表达式。
-- unit:时间单位,指定要添加的时间单位类型,例如天(DAY)、月(MONTH)、年(YEAR)、小时(HOUR)、分钟(MINUTE)、秒(SECOND)、周(WEEK)等。

-- 例子:
SELECT ADDDATE('2024-11-01', INTERVAL 10 DAY);
-- 解析:输出结果为:2024-11-11,该函数是一个用于向日期或时间添加指定时间间隔的函数。

53. ADDTIME 函数

1
2
3
4
5
6
7
8
-- 语法:
-- ADDTIME(datetime, time)
-- datetime:原始的日期时间值,类型为 DATETIME 或 TIME。
-- time:要添加的时间间隔,通常是以 'HH:MM:SS' 格式表示的时间值。

-- 例子:
SELECT ADDTIME('2024-11-01 12:00:00', '01:30:00');
-- 解析:输出结果为:2024-11-01 13:30:00,该函数是一个用于向时间或日期时间值添加指定的时间间隔的函数。

54. CONVERT_TZ 函数

1
2
3
4
5
6
7
8
9
-- 语法:
-- CONVERT_TZ(datetime, from_tz, to_tz)
-- datetime: 要转换的时间,通常是一个 DATETIME 或 TIMESTAMP 类型的值。
-- from_tz: 当前时间所在的时区,应该是一个有效的时区名称或时区偏移量(ps:'-05:00'、'+02:00')。
-- to_tz: 目标时区,应该是一个有效的时区名称或时区偏移量。

-- 例子:
SELECT CONVERT_TZ('2024-11-14 10:00:00', 'America/New_York', 'Asia/Shanghai');
-- 解析:该函数用于将一个时间值从一个时区转换为另一个时区。

55. CURDATE 函数

1
2
3
-- 例子:
SELECT CURDATE();
-- 解析:输出结果为:2024-11-14 10:00:00(当前日期),该函数是一个用于返回当前日期的函数。

56. CURRENT_DATE 函数

1
2
3
-- 例子:
SELECT CURRENT_DATE;
-- 解析:输出结果为:2024-11-15,该函数返回服务器所在时区的当前日期,即具体取决于数据库的时区设置,通常格式为 YYYY-MM-DD(年-月-日)。

57. CURTIME 函数

1
2
3
-- 例子:
SELECT CURTIME();
-- 解析:输出结果为:13:30:45,该函数返回的是服务器当前的时间,通常格式为 HH:MM:SS(小时:分钟:秒), 具体取决于数据库的时区设置。

58. CURRENT_TIMESTAMP 函数

1
2
3
4
5
6
7
-- 例子:
CREATE TABLE example (
id INT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 解析:该函数用于获取当前的日期和时间,于NOW()等价。

59. DATE 函数

1
2
3
-- 例子:
SELECT DATE('2024-11-19 08:45:30');
-- 解析:输出结果为:2024-11-19,该函数用于从日期或时间戳中提取日期部分(即年、月、日,格式YYYY-MM-DD)。

60. DATEDIFF 函数

1
2
3
-- 例子:
SELECT DATEDIFF('2024-11-19', '2024-11-10');
-- 解析:输出结果为:9(如果第一个日期早于第二个日期,返回值为负数),该函数用于计算两个日期之间的天数差值。

61. DATE_ADD 函数

1
2
3
4
5
6
7
8
9
-- 语法:
-- DATE_ADD(date, INTERVAL value unit)
-- date:要添加时间间隔的日期或日期时间值。
-- value:要添加的时间数量。它是一个整数,可以是负数(表示减去时间)。
-- unit:时间单位,指定时间间隔的类型,例如 SECOND(秒)、MINUTE(分钟)、HOUR(小时)、DAY(天)、MONTH(月)、YEAR(年)、WEEK(周)、QUARTER(季度)等。

-- 例子:
SELECT DATE_ADD('2024-11-19', INTERVAL 10 DAY);
-- 解析:输出结果为:2024-11-29,该函数用于向一个日期值添加指定的时间间隔(如天、月、年等)。

62. DATE_FORMAT 函数

1
2
3
4
5
6
7
8
9
-- 语法:
-- DATE_FORMAT(date, format)
-- date:要格式化的日期或日期时间值。
-- format:一个格式字符串,定义了如何将日期转换为字符串。格式字符串包含了特定的格式化符号,代表日期和时间的各个部分(如年、月、日、小时、分钟等)。
-- 常用的格式化符号:%Y:四位数的年份(例如:2024)、%y:两位数的年份(例如:24)、%m:月份(01到12)、%d:日(01到31)、%H:小时(00到23)、%i:分钟(00到59)、%s:秒(00到59)、%W:星期的全名(例如:Sunday)、%a:星期的简写(例如:Sun)、%b:月份的简写(例如:Jan)、%M:月份的全名(例如:January)

-- 例子:
SELECT DATE_FORMAT('2024-11-19 15:30:45', '%Y-%m-%d %H:%i:%s');
-- 解析:输出结果为:2024-11-19 15:30:45,该函数用于将日期值格式化为指定的字符串格式。

63. DAY 函数

1
2
3
4
5
6
7
-- 语法:
-- DAY(date)
-- date:一个有效的日期或日期时间值。可以是一个 DATE 类型、DATETIME 类型或者 TIMESTAMP 类型的字段或表达式。

-- 例子:
SELECT DAY('2024-11-19 15:30:45');
-- 解析:输出结果为:19,该函数用于从日期或日期时间值中提取出“天”的部分,返回的是一个整数,表示日期中的“日”部分(即一个月中的具体日期,范围是 1 到 31)。

64. DAYNAME 函数

1
2
3
4
5
6
7
-- 语法:
-- DAYNAME(date)
-- date:一个有效的日期或日期时间值。可以是 DATE 类型、DATETIME 类型或者 TIMESTAMP 类型的字段或表达式。

-- 例子:
SELECT DAYNAME('2024-11-19');
-- 解析:输出结果为:Tuesday,该函数用于返回一个日期值对应的星期几的名称,返回的结果是一个字符串,表示星期几的全名(如:Monday, Tuesday 等)。

65. DAYOFMONTH 函数

1
2
3
4
5
6
7
-- 语法:
-- DAYOFMONTH(date)
-- date:一个有效的日期或日期时间值,通常是 DATE、DATETIME 或 TIMESTAMP 类型的字段或表达式。

-- 例子:
SELECT DAYOFMONTH('2024-11-19 15:30:45');
-- 解析:输出结果为:19,该函数用于返回一个日期或日期时间值中的“日”部分,也就是该日期在一个月中的具体日期。

66. DAYOFWEEK 函数

1
2
3
4
5
6
7
8
-- 语法:
-- DAYOFWEEK(date)
-- date:一个有效的日期或日期时间值,可以是 DATE、DATETIME 或 TIMESTAMP 类型的字段或表达式。
-- 返回一个整数,表示该日期对应的星期几。1:星期日 (Sunday)、2:星期一 (Monday)、3:星期二 (Tuesday)、4:星期三 (Wednesday)、5:星期四 (Thursday)、6:星期五 (Friday)、7:星期六 (Saturday)

-- 例子:
SELECT DAYOFWEEK('2024-11-19');
-- 解析:输出结果为:3,该函数用于返回一个日期值对应的星期几的数字表示。星期天返回值为 1,星期一为 2,依此类推,星期六为 7。

67. DAYOFYEAR 函数

1
2
3
4
5
6
7
-- 语法:
-- DAYOFYEAR(date)
-- date:一个有效的日期(DATE 类型)或日期时间(DATETIME 类型)值。也可以是日期或时间的字符串表示。

-- 例子:
SELECT DAYOFYEAR('2024-11-21 15:30:00');
-- 解析:输出结果为:326,该函数用于返回给定日期是该年的第几天(即该日期在一年中的天数)。

68. EXTRACT 函数

1
2
3
4
5
6
7
8
-- 语法:
-- EXTRACT(unit FROM date)
-- unit:要提取的日期或时间部分(如年、月、日等)。这是一个关键字,可以是以下之一:YEAR:提取年份、MONTH:提取月份、DAY:提取日、HOUR:提取小时、MINUTE:提取分钟、SECOND:提取秒、MICROSECOND:提取微秒、QUARTER:提取季度(1 到 4)、WEEK:提取周数(ISO 周)、DAYOFYEAR:提取年份中的第几天、DAYS:提取自某个参考时间起的天数、其他如 ISOWEEK(ISO 周数)等。
-- date:有效的日期或时间值,可以是 DATE、DATETIME、TIMESTAMP 或 TIME 类型。

-- 例子:
SELECT EXTRACT(DAYOFYEAR FROM '2024-11-21');
-- 解析:输出结果:326,该函数用于从日期或时间值中提取特定的部分(如年、月、日、小时、分钟等)。

69. ASCII 函数

1
2
3
4
5
6
7
-- 语法:
-- FROM_DAYS(N)
-- N:这是一个整数值,表示自“纪元”(通常是 0年1月1日)以来的天数。

-- 例子:
SELECT FROM_DAYS(733000);
-- 解析:输出结果为:2000-01-01,该函数是一个用于将一个日期表示为天数(从某个特定日期以来的天数)转换为实际日期。

70. FROM_UNIXTIME 函数

1
2
3
4
5
6
7
8
9
-- 语法:
-- FROM_UNIXTIME(unix_timestamp, [format])
-- unix_timestamp:这是一个整数值,表示自 1970 年 1 月 1 日 00:00:00 UTC 起的秒数(即 Unix 时间戳)。
-- format(可选):这是一个格式字符串,指定如何显示转换后的日期和时间。如果没有提供此参数,FROM_UNIXTIME 默认返回的日期格式是 YYYY-MM-DD HH:MM:SS。

-- 例子:
SELECT FROM_UNIXTIME(1609459200, '%Y-%m-%d');

-- 解析:输出结果为:2021-01-01,FROM_UNIXTIME 支持的格式化选项类似于 DATE_FORMAT 函数,常见的选项包括:%Y:四位数的年份(例如:2021)、%m:月份(01 到 12)、%d:日期(01 到 31)、%H:小时(00 到 23)、%i:分钟(00 到 59)、%s:秒(00 到 59)、%W:星期几(例如:Monday)。

71. GET_FORMAT 函数

1
2
3
4
5
6
7
8
-- 语法:
-- GET_FORMAT(date_or_time, type)
-- date_or_time:表示日期或时间类型,通常是 DATE 或 TIME。
-- type:指定返回的格式类型,可以是以下值之一:'DATE'返回用于 DATE 类型的日期格式、'TIME'返回用于 TIME 类型的时间格式、'DATETIME'返回用于 DATETIME 类型的日期时间格式。

-- 例子:
SELECT GET_FORMAT(DATETIME, 'DATETIME');
-- 解析:输出结果为:'YYYY-MM-DD HH:MM:SS',该函数是一个用于获取日期或时间格式化的方式

72. HOUR 函数

1
2
3
-- 例子:
SELECT HOUR('2024-11-21 14:45:30');
-- 解析:输出结果为:14,该函数用于从时间或日期时间值中提取小时部分。

73. LAST_DAY 函数

1
2
3
-- 例子:
SELECT LAST_DAY('2024-11-15');
-- 解析:输出结果为:2024-11-30,该函数用于获取指定日期所在月份的最后一天。

74. LOCALTIME 函数

1
2
3
-- 例子:
SELECT LOCALTIME;
-- 解析:输出结果为:2024-11-21 08:30:45,该函数返回当前数据库服务器的本地时间,格式为 YYYY-MM-DD HH:MM:SS。

75. LOCALTIMESTAMP 函数

1
2
3
-- 例子:
SELECT LOCALTIMESTAMP;
-- 解析:输出结果为:2024-11-21 08:30:45,该函数返回当前本地时间的 DATETIME 类型,格式为 YYYY-MM-DD HH:MM:SS。

76. MAKEDATE 函数

1
2
3
4
5
6
7
8
-- 语法:
-- MAKEDATE(year, day_of_year)
-- year:表示年份的整数,通常是一个 4 位数(例如:2024)。
-- day_of_year:表示年份中的第几天,必须是一个整数,范围从 1 到 366。如果是闰年,最多可以是 366 天。

-- 例子:
SELECT MAKEDATE(2024, 100);
-- 解析:输出结果为:2024-04-09,该函数用于根据给定的年份和天数创建一个日期。

77. MAKETIME 函数

1
2
3
4
5
6
7
8
9
-- 语法:
-- MAKETIME(hour, minute, second)
-- hour:小时数,整数,取值范围为 0 到 23。
-- minute:分钟数,整数,取值范围为 0 到 59。
-- second:秒数,整数,取值范围为 0 到 59。

-- 例子:
SELECT MAKETIME(14, 30, 45);
-- 解析:输出结果为:14:30:45,该函数用于根据给定的小时、分钟和秒数创建一个时间值,如果传入超出正常范围的数值(例如分钟超过 59 或秒数超过 59),MySQL 会自动调整为有效的时间。

78. MICROSECOND 函数

1
2
3
-- 例子:
SELECT MICROSECOND('2024-11-21 14:32:45.123456');
-- 解析:输出结果为:123456,该函数会返回从秒的部分开始的微秒数(即小数点后 6 位)。

79. MINUTE 函数

1
2
3
-- 例子:
SELECT MINUTE('2024-11-21 14:32:45');
-- 解析:输出结果为:32,该函数用于从时间或日期中提取“分钟”部分。

80. MONTH 函数

1
2
3
-- 例子:
SELECT MONTH('2024-11-21 14:32:45');
-- 解析:输出结果为:11,该函数用于从一个日期或时间表达式中提取“月份”部分。

81. MONTHNAME 函数

1
2
3
-- 例子:
SELECT MONTHNAME('2024-11-21 14:32:45');
-- 解析:输出结果为:November,该函数用于从日期中提取完整的月份名称(如“January”, “February” 等)。

82. NOW 函数

1
2
3
-- 例子:
SELECT NOW();
-- 解析:输出结果为:2024-11-21 09:30:55,该函数返回一个 DATETIME 类型的值,表示服务器的当前日期和时间,格式为 YYYY-MM-DD HH:MM:SS。

5. ASCII 函数

1
2
3
-- 语法:
-- 例子:
-- 解析:

5. ASCII 函数

1
2
3
-- 语法:
-- 例子:
-- 解析:

5. ASCII 函数

1
2
3
-- 语法:
-- 例子:
-- 解析:

5. ASCII 函数

1
2
3
-- 语法:
-- 例子:
-- 解析:

5. ASCII 函数

1
2
3
-- 语法:
-- 例子:
-- 解析:

数学函数:

5. ABS 函数

1
2
3
-- 例子:
SELECT ABS(-2)
-- 解析:输出结果:2,该函数将数字转变成绝对值。

5. ASCII 函数

1
2
-- 例子:
-- 解析:

5. ASCII 函数

1
2
-- 例子:
-- 解析:

5. ASCII 函数

1
2
-- 例子:
-- 解析:

聚合函数

5. AVG 函数

1
2
3
4
-- 例子:
SELECT AVG(salary) AS average_salary
FROM employees;
-- 解析:该函数用于计算指定列的平均值。

5. BIT_AND 函数

1
2
3
4
5
6
7
8
9
10
11
12
-- 例子,假设权限值是按位存储的(例如:user_id=permissions,7 = 0111,3 = 0011,5 = 0101),你可以使用 BIT_AND() 来计算这些权限的按位与结果:
SELECT BIT_AND(permissions) AS combined_permissions
FROM user_permissions;
-- 解析:对于 7 (0111),3 (0011),和 5 (0101),按位与操作会得到 1 (0001),因此返回结果为 1。
-- 按位与 运算:
-- 0111 (7)
-- AND
-- 0011 (3)
-- AND
-- 0101 (5)
-- -----------------
-- 0001 (1)

5. BIT_OR 函数

1
2
3
4
5
6
7
8
9
10
11
12
-- 例子,假设权限值是按位存储的(例如:user_id=permissions,7 = 0111,3 = 0011,5 = 0101),你可以使用 BIT_OR() 来计算这些权限的按位与结果:
SELECT BIT_OR(permissions) AS combined_permissions
FROM user_permissions;
-- 解析:对于 7 (0111),3 (0011),和 5 (0101),按位或操作会得到 15 (1111),因此返回结果为 15。
-- 按位与 运算:
-- 0111 (7)
-- OR
-- 0011 (3)
-- OR
-- 0101 (5)
-- -----------------
-- 1111 (15)

5. BIT_XOR 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 例子,假设权限值是按位存储的(例如:user_id=permissions,7 = 0111,3 = 0011,5 = 0101),你可以使用 BIT_XOR() 来计算这些权限的按位与结果:
SELECT BIT_XOR(permissions) AS xor_permissions
FROM user_permissions;
-- 解析:对于 7 (0111),3 (0011),和 5 (0101),按位异或操作会得到 1 (0001),因此返回结果为 1。
-- 按位与 运算:
-- 0111 (7)
-- XOR
-- 0011 (3)
-- -----------------
-- 0100 (4)

-- 0100 (4)
-- XOR
-- 0101 (5)
-- -----------------
-- 0001 (1)

5. COUNT 函数

1
2
3
-- 例子:
SELECT COUNT(user_id) FROM employees;
-- 解析:输出结果是user_id的个数,该函数用于计算表中某列的行数。

5. GROUP_CONCAT 函数

1
2
3
4
5
-- 例子:
SELECT department, GROUP_CONCAT(name ORDER BY name SEPARATOR '|') AS employees
FROM employees
GROUP BY department;
-- 解析:输出结果为:HR Alice|Charlie,IT Bob|Dave,该函数用于将分组中的多个值连接成一个字符串。

5. MIN 函数

1
2
3
4
-- 例子:
SELECT MIN(salary) AS min_salary
FROM employees;
-- 解析:输出结果返回salary的最小值,该函数用于返回指定列中的最小值。

5. MAX 函数

1
2
3
4
-- 例子:
SELECT MAX(salary) AS max_salary
FROM employees;
-- 解析:输出结果返回salary的最大值,该函数用于返回指定列中的最大值。

5. STDDEV(简写:STD) 函数

1
2
3
4
-- 例子:
SELECT STDDEV(salary) AS salary_stddev
FROM employees;
-- 解析:STD 和 STDDEV 函数都用于计算某列的标准差。

5. STDDEV_POP 函数

1
2
3
4
-- 例子:
SELECT STDDEV_POP(amount) AS overall_stddev
FROM sales;
-- 解析:该函数用于计算一组数据的总体标准差。

5. STDDEV_SAMP 函数

1
2
3
4
-- 例子:
SELECT STDDEV_SAMP(amount) AS sample_stddev
FROM sales;
-- 解析:该函数用于计算样本标准差,而不是总体标准差。

5. SUM 函数

1
2
3
-- 例子:
SELECT SUM(quantity * price) AS total_revenue FROM sales;
-- 解析:结果返回列quantity和price的乘积求和。

5. VAR_POP 函数

1
2
-- 例子:
-- 解析:楼主不是SQLBoy理解不了一点

5. VAR_SAMP 函数

1
2
-- 例子:
-- 解析:楼主不是SQLBoy理解不了一点

5. VARIANCE 函数

1
2
-- 例子:
-- 解析:楼主不是SQLBoy理解不了一点

HTTP响应状态码大全及介绍

常见的HTTP状态码:

200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误

HTTP状态码分类:

说明:HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。

HTTP状态码共分为5种类型:

1** – 信息,服务器收到请求,需要请求者继续执行操作
2** – 成功,操作被成功接收并处理
3** – 重定向,需要进一步的操作以完成请求
4** – 客户端错误,请求包含语法错误或无法完成请求
5** – 服务器错误,服务器在处理请求的过程中发生了错误

HTTP状态码列表:

–HTTP状态码– –状态码名称– 描述说明
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到 HTTP 的新版本协议
200 OK 请求成功。一般用于 GET 与 POST 请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的 meta 信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分 GET 请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新 URI ,返回信息会包括新的 URI ,浏览器会自动定向到新 URI 。今后任何新的请求都应使用新的 URI 代替
302 Found 临时移动。与 301 类似。但资源只是临时被移动。客户端应继续使用原有 URI
303 See Other 查看其它地址。与 301 类似。使用 GET 和 POST 请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的 HTTP 状态码
307 Temporary Redirect 临时重定向。与 302 类似。使用 GET 请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置 “您所请求的资源无法找到” 的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与 401 类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410 不同于 404,如果资源以前有现在被永久删除了可使用 410 代码,网站设计人员可通过 301 代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带 Content-Length 的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个 Retry-After 的响应信息
414 Request-URI Too Large 请求的 URI 过长( URI 通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足 Expect 的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的 Retry-After 头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的 HTTP 协议的版本,无法完成处理

Spring笔记

AOP底层实现原理:

首先定义一个接口Vehicle
1
2
3
4
5
6
7
8
9
10
11
public class Car implements Vehicle{
@Override
public void run() {
System.out.println("Car正在run~~~");
}

@Override
public String fly(int height) {
return "Car飞行的高度为:" + height;
}
}
然后定义两个Car和Ship类去实现Vehicle接口
1
2
3
4
5
6
7
8
9
10
11
public class Car implements Vehicle{
@Override
public void run() {
System.out.println("Car正在run~~~");
}

@Override
public String fly(int height) {
return "Car飞行的高度为:" + height;
}
}
1
2
3
4
5
6
7
8
9
10
11
public class Ship implements Vehicle{
@Override
public void run() {
System.out.println("Ship正在run~~~");
}

@Override
public String fly(int height) {
return "Ship飞行的高度为:" + height;
}
}
最后定义VehicleProxyProvider返回一个代理对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
public class VehicleProxyProvider {
//定义一个属性
//target_vehicle表示真正执行的对象
//该对象需要实现了Vehicle接口
private Vehicle target_vehicle;

public VehicleProxyProvider(Vehicle target_vehicle) {
this.target_vehicle = target_vehicle;
}

//编写一个可以返回代理对象的方法,
// 该代理对象可以通过反射机制调用到被代理对象的方法
public Vehicle getProxy(){

//得到类的加载器
ClassLoader classLoader =
target_vehicle.getClass().getClassLoader();

//得到要代理的对象/被执行对象的接口信息,底层是通过接口来完成调用
Class<?>[] interfaces =
target_vehicle.getClass().getInterfaces();

//创建InvocationHandler对象
//因为InvocationHandler是接口,
// 所有我们可以通过局部内部类的方式来创建该对象
/**
* public interface InvocationHandler {
* public Object invoke(Object proxy, Method method, Object[] args)
* throws Throwable;
* }
* invoke方法是将来执行我们的target_vehicle的方法时,会调用到
*/
InvocationHandler invocationHandler =
new InvocationHandler() {
/**
* invoke方法是将来执行我们的target_vehicle的方法时,会调用
*
* @param proxy 表示代理对象
*
* @param method 就是通过代理对象调用方法时去掉的那个方法,
* 如:代理对象.run() 或者 代理对象.fly(100)
*
* @param args 表示调用代理对象来执行方法时需要传入的参数,
* 如:代理对象.fly(xxx) xxx就是传入的参数
*
* @return 表示代理对象.run()执行后的结果
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("全部开始运作咯~~~");
//这里method 是public abstract void com.belly.spring.proxy1.Vehicle.run()
// 或是public abstract void com.belly.spring.proxy1.Vehicle.fly(xxx)
//target_vehicle 是需要代理的对象
//args 是代理对象调用的方法里的参数,如:fly(xxx)方法参数为xxx、
// run()方法没有参数所有args为null
Object result = method.invoke(target_vehicle, args);
System.out.println("全部停止运作咯~~~");
return result;
}
};

/**
* public static Object newProxyInstance(ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h)
* newProxyInstance()方法说明:
* 1.newProxyInstance()方法可以返回一个代理对象
* 2.ClassLoader loader 类的加载器
* 3.Class<?>[] interfaces 就是将来要代理的对象的接口信息
* 4.InvocationHandler h 调用处理器/对象 其中它里面有一个非常重要的方法invoke
*/
Vehicle proxy =
(Vehicle) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);

return proxy;
}

这样我们就能够通过给VehicleProxyProvider传入一个Car对象或则Ship对象来返回一个代理对象,AOP就是在反射调用目标方法的前后去执行你所定义的代码,如图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {

System.out.println("方法执行前-日志-方法名-" + method.getName() + "-参数"
+ Arrays.asList(args));//这里从AOP角度看,就是一个横切关注点-前置通知
BellyAOP.before(proxy, method, args);

//使用反射调用方法
result = method.invoke(target_obj, args);

System.out.println("方法执行正常结束-日志-方法名-" + method.getName()
+ "-结果result=" + result);//从AOP角度看,这也是横切关注点-返回通知

} catch (Exception e) {

System.out.println("方法执行异常-日志-方法名-" + method.getName()
+ "-异常类型=" + e.getClass().getName());//从AOP角度看,也是横切关注点-异常通知
throw new RuntimeException(e);

} finally {

//从AOP的角度看,也是一个横切关注点-最终通知
System.out.println("方法最终结束-日志-方法名-" + method.getName());

}
return result;
}

SpringMVC笔记

@RequestParam注解:

1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping("/vote")
public class VoteHandler {
@RequestMapping(value = "/test01")
public String test01(@RequestParam(value = "name", required = false) String username){
System.out.println("username= " + username);
return "success";
}
}

@RequestParam(value = “name”, required = false)注解说明:

1.获取到超链接传递的数据,请求http://localhost:8080/springmvc/vote/test01?name=xx
2.@RequestParam 表示会接收提交的参数
3.value = “name” 表示提交的参数名为name
4.required = false 表示该参数可以没有,默认是ture,表示必须要传这个参数
5.当我使用@RequestParam(value = “name”, required = false)后就可以让请求的的参数名和方法的形参名可以不一致

@ModelAttribute注解:

1
2
3
4
5
6
7
8
@Controller
@RequestMapping("/vote")
public class VoteHandler {
@ModelAttribute
public void prepareModel(){
System.out.println("——————prepareModel()完成准备工作——————");
}
}

1.当VoteHandler的方法被标识@ModelAttribute就视为一个前置方法
2.当调用该VoteHandler类的其他的方法时,都会先执行该前置方法
3.类似AOP的前置通知
4.prepareModel前置方法,会切入到其他方法前执行
5.该用法一般用在用户管理

@InitBinder注解:

1
2
3
4
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
webDataBinder.setDisallowedFields("birthday");
}

1.方法上需要标注@InitBinder springmvc底层会初始化WebDataBinder
2.调用webDataBinder.setDisallowedFields(“birthday”);表示取消指定属性的绑定即:当表单提交字段为birthday时,
就不会把接收到的birthday值填充到model数据good的birthday属性中
3.机制:springmvc在底层通过反射调用目标方法时,接收到http请求的参数和值,使用反射+注解技术,取消对指定属性的填充
4.setDisallowedFields支持可变参数,可以填写多个字段
5.如果取消某个属性绑定,验证就没意义了,应当把验证的@NotEmpty注解去掉,birthday属性会使用默认值null

参数封装:

1.

1
2
3
4
5
@PostMapping("/test03")
public String test03(Master master){
System.out.println("master=" + master);
return "success";
}

获取提交的数据 -> 封装成java对象
1.方法的形参用对应的类型来指定即可,SpringMVC会自动的进行封装
2.如果自动的完成封装,要求提交的数据,参数名和对象的字段名保持一致
3.如果属性是对象,这里仍然是通过 字段名.字段名
4.如果提交的数据的参数名和对象的字段名不匹配,则对象的属性值就是null
5.该封装底层是反射+注解..来实现

2.

1
2
3
4
5
6
@RequestMapping("/test06")
public String test06(Master master, Map<String, Object> map){
map.put("address", "beijing");
map.put("master", null);
return "success";
}

1.通过Map<String, Object>设置数据到request域
2.通过map对象,添加属性到request中
3.原理分析:springmvc会遍历map,然后将map的k-v,存放到request域中

文件上传和下载:

1.文件上传:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@RequestMapping(value = "/upload")
@Controller
public class UploadFileHandler {
@RequestMapping("/fileUpload")
public String fileUpload(@RequestParam(value = "file") MultipartFile file,
HttpServletRequest request,
String introduceName) throws IOException {

//接收到提交得文件名
String originalFilename = file.getOriginalFilename();
System.out.println("上传得文件名:" + originalFilename);
System.out.println("上传得文件介绍:" + introduceName);

//得到要把上传文件保存到真正运行得那个路径[全路径包括文件名]
String fileFullPath =
request.getServletContext().getRealPath("/img/" + originalFilename);

//创建文件
File saveToFile = new File(fileFullPath);

//将上传得文件,转存到saveToFile文件里
file.transferTo(saveToFile);

//返回到成功页面
return "success";
}
}

文件下载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@RequestMapping("/down")
@Controller
public class DownFileHandler {

//响应用户下载文件的请求
@RequestMapping("/downFile")
public ResponseEntity<byte[]> downFile(HttpSession session) throws IOException {

//1.先获取到下载文件的InputStream流
InputStream resourceAsStream =
session.getServletContext().getResourceAsStream("/img/copy.jpg");

//2.开辟一个存放文件的byte数组,这里使用byte[]是库支持二进制数据
byte[] bytes = new byte[resourceAsStream.available()];

//3.将下载文件的数据,读入到byte[]
resourceAsStream.read(bytes);

//public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {}
//要返回的对象要三个参数 1.要下载的文件数据 2.http响应状态 3.http响应头headers

//4.创建返回HttpStatus
HttpStatus httpStatus = HttpStatus.OK;

//5.创建headers
HttpHeaders httpHeaders = new HttpHeaders();
//指定返回的数据,客户端应当以附件形式处理
httpHeaders.add("Content-Disposition", "attachment;filename=copy.jpg");

//构建一个ResponseEntity对象放入需要的参数
ResponseEntity<byte[]> responseEntity =
new ResponseEntity<byte[]>(bytes, httpHeaders, httpStatus);
return responseEntity;
}
}

一月和二月总结

一月和二月总结:

1.将近一个月的时间完成制作代码生成器项目,部署和上线。

2.找到Java实习岗位。

3.学会了一丢丢的性能优化思想。

二四年前期目标

2024年前期目标规划:

学习一些代码优化技术,算法本我割舍了好久了,需要快速巩固之前学的,坚持每天在乐扣刷一两道题。

1.学习JUC

2.深入学习JVM

3.刷算法

十一月和十二月总结

十一月和十二月总结:

23年最后这三月真是闹腾,先是中耳炎再到甲流和支原体肺炎,真的是一波未平一波又起,搞得我学习心思都没了,进度也是一言难尽。不过该学的都学完了,正式进入下一个更重要阶段——实习。

1.完成最常见的Spring Cloud微服务组件学习并熟练使用,如Eureka、GateWay、Nacos、OpenFeign、Sleuth+Zipkin、Sentinel、Seata。

2.完成Linux操作系统学习,了解了命令的基本使用,能够维护我买的小服务器。

3.完成Nginx学习,知道正反向代理的区别,学会自定义Nginx的config配置文件,来实现负载均衡和请求转发。

4.完成Redis系统学习。

十一月清单

十一月清单:

1.继续SpringCloud组件学习

2.学习Linux操作系统

3.学习Nginx

十月总结

​ 十月耳朵旧病复发,学习进度又拖延了,还要连续每周去趟医院,只能带一边耳机学习,不过现在好点了。在此之前完成了毕业设计项目并部署上线了,后面可以继续优化。SpringCloud微服务组件刚学完Eureka注册中心、GateWay网关、链路追踪Sleuth和Zipkin。继续往前冲~~~~

docker前后端+mysql部署

在服务器上使用Docker输入上面命令下载mysql5.7版本:

1
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/shanghai -e MYSQL_ROOT_PASSWORD=128 mysql:5.7

后端项目镜像搭建:

1
docker build -t sixseven .

后台运行后端项目:

1
docker run -d --name sixseven -p 9090:9090 -v /root/docker/dist/src:/root/docker/dist/src sixseven:v1.1.3

前端项目镜像搭建:

1
docker build -t sixseven-frontend:v1.1.1 ./docker

后台运行前端:

1
docker run -d --name nginx -p 80:80 -v /root/docker/dist/html:/user/share/nginx/html sixseven-frontend:1.2.3

十月清单

续九月未完成的:

1.完成毕业设计
2.优化简历

九月清单

九月开学内卷计划:

1.学习SpringBoot框架
2.完成毕业设计
3.准备简历(可能赶不上秋招了)

七八月暑假总结

六月+暑假两月完成了Spring、SpringMVC、Mybatis的学习

包括了底层代码的解读和原理机制实现,比如:ioc容器的底层实现、aop的动态代理机制,还亲自动手写了SpringMVC底层实现,从前端发送url->DispatcherServlet->映射器->返回到DispatcherServlet->处理器适配器->Controller->正常自己实现的业务代码->返回到Controller->ModelAndView返回到处理器适配器->返回给DispatcherServlet->ViewResovler->再返回给DispatcherServlet->视图渲染->返回响应。属于是收获满满^_^

五月的学习清单

系统学习框架知识:

1.前端框架Vue+Axios[要求:看得懂、能维护、会调api即可]
2.后端框架SSM

四月总结

四月完成数据库复习,就进入了web[servlet+jsp那一套]学习。自己动手写了个简单版的小tomcat,运用到了dom4j、反射、网络编程、IO等java基础,加强了对tomcat的底层机制理解。原本计算机基础系统学习是在四月完成的,但里面大多数都是理论知识,太枯燥了,只能一天看一点,一步一步的往前推进。这个属于是考虑不全,临时改变计划,不过四月一边学web一边把前端的h5、c3、js、jquery、ajax学了,不过只是简单的学习了一下,前端对自己的要求是能看懂、能维护、会调api的一个层面。

四月的学习清单

接下来四月补习一下计算机基础知识:

1.数据结构与算法基础
2.计算机操作系统
3.计算机网络
4.复习数据库知识

三月巩固Java基础

每天坚持自学八小时以上!终于把Java基础复习完辣!!!
如梦初醒,醍醐灌顶。哈哈哈哈
给爷冲冲冲冲冲冲冲冲冲冲冲冲!!!!!!

回不到的过去

高考已过两年之久,每次睡前都会回想,我整个中学生涯浑浑噩噩,全是在电脑游戏颓废中度过。有人会问我,你学习有没有目标,每次都只是敷衍过去,其实我根本不知道什么是目标,未来会怎么样,只是在温室里躺平,没有一点儿动力。有的人说现在大部分人都是这个状态,做好当下的任务就好了,不用考虑未来会怎么样,可我没得选了,就算不能证明我可以,那也要证明我不可以。
我绝对不能让自己这样继续懒散下去了,你会说没有考上好的大学会有遗憾吗,那当然是有,但我在高中的最后那段时间里学会了,如何去学习,如何去进步,这都比什么都宝贵。这何尝不是一种成长,加油!!!未来仍可握于手中。

寒假总结

在摸索了一学期之后,终于确定了自己今后的学习路线和未来规划————java后端开发方向。

整个寒假,为了往后看得懂源码,我巩固了Java一些基础知识,发现之前学得全是皮毛,对基础知识并没有很深刻的印象,我开始在b站找资源去学习Java,来为之后学习主流Spring框架做准备。
不过Java还没复习完就开学了,有点可惜,希望三月份能复习完。然后再去学习框架知识和做两个项目来熟练掌握其使用。
也希望我在暑假之前能具备去实习标准。

别滑辣,没有辣

就到这啦!真心感谢你能看完我的成长之路……