javaweb学习
三.请求响应
6.日期参数
日期参数:使用@DateTimeFormat注解完成日期参数格式转换
7.json参数
JSON参数:JSON数据键名与形参属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识
8.路径参数
路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
9.响应-@ReponseBody
@ResponseBody
类型:方法注解、类注解
作用:Controller方法上/类上
说明:@RestController = @Controller + @ResponseBody
10.统一响应结果
![图片消失了](https://img-blog.csdnimg.cn/direct/f4f60219159b4d5d9448a1889aa481aa.png)
代码实例:
常用
dom4j的依赖可以解析xml文件
四.分层解耦
1.三层架构
controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
service:业务逻辑层,处理具体的业务逻辑
dao:数据访问层(data access object)(持久层),负责素具访问操作,包括数据的增、删、改、查
2.分层解耦
内聚:软件各个模块内部的功能联系
耦合:衡量软件中各个层/模块之间的依赖、关联的程度
软件设计原则:高内聚低耦合
控制反转(IOC):对象的创建控制权由程序自身转移到外部(容器)
依赖注入(DI):容器为应用程序提供运行时,所依赖的资源,称之为依赖注入
Bean对象:IOC容器中创建、管理的对象,称之为Bean
3.IOC&DI入门
@Component:将对象交给IOC容器管理
@AutoWired:运行时,IOC容器会提供该类型的bean对象,并赋值给变量
代码实例:
4.IOC详解
Bean对象的声明:
要把某个对象交给IOC容器管理,需要在对应的类上加上如下的注解之一
注意:
- 声明Bean的时候,可以通过Value属性指定Bean的名字,如果没有指定,默认为类名首字母小写
- 使用上述四个注解都可以声明Bean,但是在springboot集成web开发中,声明控制器Bean只能写@Controller
前面声明Bean的四大注解,想要生效,还需要被组件扫描注解@ComponentScan扫描
@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
5.DI详解
@AutoWired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
可以通过以下几种方案来解决:
@Resource与@Autowired区别:
@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解
@Autowired默认是按照类型注入,而@Resource默认是按照名称注入
五.MySQL
1.介绍
数据库:DataBase(DB),是存储和管理数据的仓库
数据库管理系统:操作和管理数据库的大型软件
SQL:操作关系型数据库的编程语言,定义了一套操作关系数据库统一标准
数据库产品:
2.安装、配置
MySQL官方提供了两种不同的版本:商业版和社区版
官网下载地址:https://dev.mysql.com/downloads/mysql/
配置:需要配置MySQL的环境变量
初始化MySQL:以管理员身份,运行命令mysqld --initialize-insecure
注册MySQL服务:运行命令mysqld -install
启动MySQL服务:运行命令net start mysql
停止MySQL服务:net stop mysql
修改默认账号密码:mysqladmin -u root password 1234,这里的密码指的是默认管理员的密码,可以自行修改成你喜欢的
登录MySQL:mysql -u用户名(root) -p密码 [ -h数据库服务器IP地址 -P端口号 ]
企业开发使用:mysql -u用户名 -p密码 [ -h数据库服务器IP地址 -P端口号 ]
3.MySQL数据模型
关系型数据库:建立在关系模型上,由多张相互连接的二维表组成的数据库
4.SQL简介
SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准
通用语法:
- SQL语句可以单行或多行书写,以分号结尾
- SQL语句可以使用空格/缩进来增强语句的可读性
- MySQL数据库的SQL语句不区分大小写
- 注释:单行:–注释内容 或 # 注释内容(MySQL特有),多行注释/* 注释内容 */
SQL语句通常被分为四大类:
5.DDL-数据库操作
DDL:数据定义语言,用来定义数据库对象(数据库、表对象)
查询:
- 查询所有数据库:show databases;
- 查询当前数据库:select database();
使用:
- use 数据库名;
创建:
- 创建数据库:create database[ if not exists] 数据库名;
删除:
- 删除数据库:drop database[ if not exists] 数据库名;
注意:上述语法中的database,也可以换成schema
6.DDL-图形化工具
![图片消失了](https://img-blog.csdnimg.cn/direct/57388926534e47db919eaa3dfe21a767.png)
注意:idea内置了datagrip,但是需要先下载驱动
7.DDL-表结构创建
创建:
create table 表名(
字段1 字段类型 [约束] [comment 字段1注释],
...
字段n 字段类型 [约束] [comment 字段n注释],
)[comment 表注释];
字段类型varchar、char(n)表示字符串的最大长度
约束:作用于字段上的规则,用于限制存储在表中的数据
8.字段类型
字段类型很多,主要分为三类:数值类型、字符串类型、日期类型
数值类型:
注意:默认有符号,后面加unsigned表示为无符号
字符串类型:
注意:char(n)不管字符长度,都占用n个字符空间,性能高但浪费空间,varchar(n)按照实际长度存储,性能低但节省空间
日期类型:
注意:一般图表都有create_time和update_time这两个字段
9.查询和修改和删除
查询:
修改:
删除:
注意:日常中一般不写这些代码,而是直接用图形化界面工具
10.DML-insert
insert语法:
MySQL内置了一个函数now(),可以获取当前时间
注意:
- 插入数据时,指定的字段顺序需要与值的顺序一一对应
- 字符串和日期型数据应该包含在引号中
- 插入的数据大小,应该在字段的规定范围内
11.DML—update
update语法:
修改数据:update 表名 set 字段名1 = 值1, 字段名2 = 值2, …[ where 条件 ];
12.DML-delete
delete语法:
删除数据:delete from 表名 [ where 条件 ];
注意:
- delete语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
- delete语句不能删除某一个字段的值(如果要操作,可以使用update,将该字段的值置为null)
13.DQL-基本查询
关键字:select
语法:
注意:开发中查询所有字段一般不用通配符,而是把所有字段罗列出来,因为通配符不直观且性能低
14.DQL-条件查询
条件查询:select 字段1, 字段2, … from 表名 where 条件1 逻辑运算符 条件2 逻辑运算符 …;
条件中可以用的运算符:
15.DQL-聚合函数
介绍:将一列数据作为一个整体,进行纵向计算
语法:select 聚合函数(字段列表) from 表名;
聚合函数:
注意:
- null值不参与所有聚合函数运算
- 同级数量可以用:count(*)、count(字段)、count(常量),推荐使用count(*)
16.DQL-分组查询
语法:select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]
如:select job,count(*) from tb_tmp where entrydate <= ‘1111-11-11’ group by job having count(*) >=2;
where和having的区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组,而having是分组之后对结果进行过滤
- 判断条件不同:where不能对聚合函数进行判断。而having可以
注意:
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其它字段无任何意义
- 执行顺序:where>聚合函数>having
17.排序查询
语法:
排序方式:ASC:升序(默认),DESC:降序
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
18.分页查询
语法:select 字段列表 from 表名 limit 起始索引,查询记录数;
注意:
- 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数
- 分页查询是数据库的方言,不同的数据库有不同的实现
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10
MYSQL中有流程控制函数:
IF(condition, value_if_true, value_if_false)
condition 是一个条件表达式,如果为真则返回value_if_true,否则返回value_if_false
value_if_true 是在condition为真时返回的值
value_if_false 是在condition为假时返回的值
如:
SELECT name, IF(age > 18, 'Adult', 'Minor') AS age_group
FROM people;
上面的查询将根据age字段的值返回不同的年龄组标签,如果age大于18,则返回’Adult’,否则返回’Minor’
流程控制函数:
CASE
表达式
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
condition1, condition2等是条件表达式,用于检查不同的情况
result1, result2等是在满足相应条件时要返回的结果
default_result是在所有条件都不满足时返回的默认结果
如:
SELECT
name,
CASE
WHEN age < 18 THEN 'Minor'
WHEN age BETWEEN 18 AND 65 THEN 'Adult'
ELSE 'Senior'
END AS age_group
FROM people;
这个查询将根据age字段的不同取值返回不同的年龄组标签
19.多表设计
(1)一对多
一对多实现:在数据库表中多的一方,添加字段,来关联一的一方的主键
有点类似于链表
如:
(2)一对多-外键
问题:数据的一致性和完整性可能会被破坏,改一个数据,需要动多个表
外键语法:
实际开发中一般用图形化工具操作
物理外键:
概念:使用foreign key定义外键关联另一张表
缺点:
逻辑外键:
概念:在业务逻辑中,解决外键关联
通过逻辑外键,就可以解决上述问题
(3)一对一
一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其它字段放在另一张表中,提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的
如:
(4)多对多
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
如:
20.多表查询
(1)概述
多表查询:指从多张表当中查询
笛卡尔积:指在数学中,两个集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)
分类:
(2)内连接
语法:
(3)外连接
语法:
左外连接会返回左表中的所有行以及右表中与之匹配的行
右外连接则相反,返回右表中的所有行以及左表中与之匹配的行
(4)子查询概述
介绍:sql语句中嵌套select语句,称为嵌套查询,又称子查询
形式:select * from t1 where column = (select column1 from t2 …);
子查询外部的语句可以是insert/update/delete/select的任何一个,最常见的是select
分类:
(5)标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
常用的操作符:= <> >= < <=
如:
SELECT
student_name,
(SELECT MAX(grade) FROM grades WHERE student_id = students.id) AS highest_grade
FROM
students;
在这个例子中,子查询 (SELECT MAX(grade) FROM grades WHERE student_id = students.id) 返回了每个学生的最高分数,并将其作为 highest_grade 列返回给主查询结果
(6)列子查询
子查询返回的值是一列(可以是多行)
常用的操作符:in、not in等