[toc]
Maven
01 Maven概述
- Maven 时apache 旗下的一个开源软件,是一款用于管理和构建java项目的工具
- 他基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建
- 作用
- 依赖管理:方便快件的管理项目依赖的资源(jar包),避免版本冲突
- 统一项目结构:提供标准,同一的项目结构
- 项目构建:标准跨平台(Linux,Windows,MacOS)的自动化项目构建方式
- 官网
02 IDEA集成Maven
-
Maven安装:按视频走即可
-
根据视频进行maven的配置。
-
IDEA创建Maven项目
- 创建模块,选择Maven,点击Next
- 填写模块名称,坐标信息,点击Finish,创建完成
- 编写程序运行
-
Maven坐标
- 什么是坐标?
- Maven中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置
- 使用坐标来定义项目或引入项目中的依赖
- Maven坐标的主要组成
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写)
- artifactId:定义当前Maven项目名称(通常是模块名称)
- version:定义当前项目版本号
- 什么是坐标?
-
IDEA导入Maven项目
- 法一:打开IDEA,选择右侧Maven面板,点击+号,选中对应醒目的pom.xml文件,双击即可。
- 法二:打开IDEA中File中Project Structure -> moudle -> import mode 选中pom.xml文件即可
03 依赖管理
- 依赖配置
- 依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖
- 配置
-
- 在pos.xml中编写<dependencies>标签
-
- 在<dependencies>标签中使用<dependency>引入坐标
-
- 定义坐标的 groupId,artifactId,version
-
- 定义刷新按钮,引入最新加入的坐标
依赖仓库,每次可以直接在这里找到所需依赖和对应坐标
如果引入的依赖不存在,将会连接远程仓库/中央仓库 然后下载依赖
- 定义刷新按钮,引入最新加入的坐标
-
<!-- 坐标代码示例 -->
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
-
依赖传递
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其它资源,当前项目间接依赖其它资源
- 可以在maven的项目文件夹中看到依赖项,同时在xml文件中右键选择 Diagrams可以看到依赖的可视化界面
- <exclusions>与
可以排除指定依赖
- 依赖具有传递性
-
依赖范围
- 依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>…<\scope>设置其作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包运行(package指令范围内)
- 依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>…<\scope>设置其作用范围:
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | lo4g4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
- 生命周期
- Maven的生命周期就是为了对所有的Maven项目构建过程进行抽象和统一
- Maven中有三套相互独立的生命周期
- clean:清理工作
- default:核心工作,如:编译,测试,打包,安装,部署等
- site:生成报告,发布站点
- 在同一个生命周期中,当运行后面的阶段时,前面的阶段都会运行
- 重点掌握5个
- clean:移除上一次构建生成的文件
- compile:编译项目源代码
- test:使用合适的单元测试框架运行测试(junt)
- package:将编译后的文件打包,如:jar,war
- install:安装项目到本地仓库
- 执行生命周期的两种方式:
- 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行
- 在命令行中,通过命令执行
Web 入门
01 SpringBootWeb入门
- 需求:
- 使用springboot开发一个web应用,浏览器发起/hello后,给浏览器返回字符串“hello world”
- 步骤:
-
- 创建springboot工程,并勾选web开发相关依赖
-
- 定义helloController类,添加方法hello,并添加注解
-
- 运行测试
-
02 HTTP协议
- HTTP概述
- 概念:Hyper Text Transfer Protocol 超文本传输协议,规定了浏览器和服务器之间的数据传输
- 特点:
-
- 基于TCP协议:面向连接,安全
-
- 基于请求-响应模型:一次请求对应一次响应
-
- HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求和响应都是独立的
- 缺点:多次请求之间不能共享数据(可以克服)
- 优点:速度快
-
- HTTP请求协议
- 请求数据格式
- 请求行:请求数据的第一行(请求方式,资源路径,协议)
- 请求头:从第二行开始,格式key:value
- 请求体:POST请求,存放请求参数
- 请求方式GET:请求参数在请求行中,没有请求体,GET请求大小是有限的
- 请求方式POST:请求参数在请求体中,POST请求大小是没有限制的
- 请求数据格式
- HTTP响应协议
- 响应数据格式
- 响应行:响应数据的第一行(协议,状态码,描述)
状态码大类 - 响应头:第二行开始,格式key:value
- 响应体:最后一部分,存放响应数据
- 响应行:响应数据的第一行(协议,状态码,描述)
- 响应数据格式
状态码分类 | 说明 |
---|---|
1xx | 响应中–临时状态码,标识请求已经接受,告诉客户端应该继续请求或者如果已完成则忽略 |
2xx | 成功–标识请求已经成功被接受,处理已经完成 |
3xx | 重定向–重定向到其他地方:他让客户端再发起一个请求以完成整个处理 |
4xx | 客户端错误–处理发生错误,责任在客户端,如:客户端请求一个不存在的资源,客户端未被授权,禁止访问等 |
5xx | 服务器端错误–处理发生错误,责任在服务端,如:服务端抛出异常,路由错误,HTTP版本不支持等 |
- HTTP协议解析
- HTTP协议解析代码将会很复杂,但因为HTTP的广泛使用,且协议的标准型,已经有公司提供出专用的web服务器软件,Tomcat便是一种
03 Web服务器-Tomcat
Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议操作,让web开发更加便捷。主要功能是“提供网上信息浏览服务”
- 简介
- 概念:Tomcat是Apache软件基金会的一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
- JavaEE:Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范的总和
- JavaSE:Java标准版 JavaME:java小型版,多用于嵌入式
- Tomcat也被称为Web容器,Servlet容器。Servlet程序需要依赖于Tomcat才能运行
- 官网
- 基本使用:发现本地使用不了,寄
- 入门程序解析:
- 起步依赖,原理是maven依赖传递
- spring-boot-stater-web
- spring-boot-stater-test
- 内嵌tomcat服务器:springboot自带tomcat作为服务器,tomcat白雪,不用运行
- 起步依赖,原理是maven依赖传递
请求响应
- 前端控制器 DispatchServlet,提供了两个对象
- 请求对象 HttpServletRequest : 获取请求程序
- 响应对象 HttpServletResponse : 设置响应数据
- BS架构: Browser/Server,浏览器/服务器架构。客户端只需要浏览器,应用程序和逻辑都存储在服务器端(维护方便,体验一般)
- CS架构: Client/Server,客户端/服务器模式 (开发,维护麻烦,但体验不错)
01 请求
-
当前最主流开发模式:前后端分离,原型+需求决定接口文档,前后端依据接口文档进行开发
-
postman的使用:
- postman是一款功能强大的网页调试与发送网页http请求的chrome插件,常用于接口测试
-
简单参数
- 原始方式:在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取。但这种方法繁琐,需要手动转换类型
@RequestMapping("/simpleParam") public String simpleParam(HttpServletRequest request){ String name=request.getParameter("name"); String ageStr=request.getParameter("age"); int age = Integer.parseInt(ageStr); System.out.println(name+":"+age); return "OK"; }
- springboot方式:只要参数名和形参变量名相同,定义形参即可接受参数
@RequestMapping("/simpleParam") public String simpleParam(String name,Integer age){ System.out.println(name+":"+age); return "OK"; }
- springboot方式中,如果方法形参名称与请求参数名称不匹配,可以使用
@RequestParam
进行映射。@RequestParam
中的required
属性值默认为true,代表该参数必须传递,不传递将会报错。如果该参数是可选的,可以将required
值设置为false
@RequestMapping("/simpleParam") public String simpleParam(@RequestParam(name="name") String username, Integer age){ System.out.println(username+":"+age); return "OK"; }
-
实体参数
- 简单实体参数:请求参数名和形参对象属性名相同,定义POJO接受即可
- 复杂实体参数:即实体的嵌套,请求参数名和形参对象属性名相同,按照对象层次结构关系即可接受嵌套POJO属性参数
//http://localhost:8080/simplePojo?name=Tom&age=10&address.province=陕西&address.city=西安 public class User { private String name; private Integer age; private address Address; } public class address { private String province; private String city; }
-
数组集合参数
- 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接受参数
//http://localhost:8080/arrayParam?hobby=game&hobby=java&hobby=sing @RequestMapping("/arrayParam") public String arrayParam(String[] hobby){ System.out.println(Arrays.toString(hobby)); return "OK"; }
- 集合参数:请求参数名与形参数组名称相同,通过@RequestParam绑定参数关系
//http://localhost:8080/listParam?hobby=game&hobby=java&hobby=sing @RequestMapping("/listParam") public String arrayParam(@RequestParam List<String> hobby){ System.out.println(hobby); return "OK"; }
-
日期参数:
- 使用
@DateTimeFormat
注解完成日期参数格式转换
//http://localhost:8080/dateParam?updateTime=2023-03-25 15:40:00 @RequestMapping("/dateParam") public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime){ System.out.println(updateTime); return "OK"; }
- 使用
-
JSON参数
- json数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用
RequestBody
标识
//http://localhost:8080/jsonParam @RequestMapping("/jsonParam") public String jsonParam(@RequestBody User user){ System.out.println(user); return "OK"; }
- json数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用
-
路径参数
- 通过请求url直接传递参数,使用{…}来标识路径参数,需要使用
@PathVariable
获取路径参数
//http://localhost:8080/path/10 @RequestMapping("/path/{id}") public String pathParam(@PathVariable Integer id){ System.out.println(id); return "OK"; } //传递两个参数 //http://localhost:8080/path/10/Tom @RequestMapping("/path/{id}/{name}") public String path2Param(@PathVariable Integer id,@PathVariable String name){ System.out.println(id+":"+name); return "OK"; }
- 通过请求url直接传递参数,使用{…}来标识路径参数,需要使用
02 响应
- 响应数据使用
@ResponseBody
注解- 类型:方法注解,类注解
- 位置:Controller方法/类上
- 作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换为JSON格式
- 说明:
@RestController=@Controller+@ResponseBody
- 使用同一响应结果,方便项目管理和维护,如设置一个result类,所有返回结果均为result类
Result(code,msg,data)
03 请求和响应综合案例分析
前端和后端的组合小案例
04 分层解耦
-
三层架构
- controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
- service:业务逻辑层,处理具体的业务逻辑
- dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查
- 三层架构 复用性强,便于维护,利于拓展
-
分层解耦
- 内聚:软件中各个功能模块内部的功能联系
- 耦合:衡量软件中各个层/模块之间的依赖和关联程度
- 软件设计原则:高内聚低耦合
-
IoC (Inversion of Control) 控制反转
- 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对像创建控制权由程序转移到外部,此思想称为控制反转
- Spring技术对IoC技术进行了实现
- Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
- IoC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象再IoC容器里称为
Bean
-
DI (Dependency Injection) 依赖注入
- 在容器中简历bean和bean之间的依赖关系的整个过程,称为依赖注入
-
IOC与DI入门程序
- 在类前加
@Component
表示将当前类交给IOC容器管理,称为IOC容器里的bean。该操作实现控制反转 - 在对象前加
@Autowired
表示在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量。该操作实现依赖注入。
- 在类前加
-
IOC详解
- Bean的声明:要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
注解 说明 位置 @Component 声明bean的基础解释 不属于以下三类时,用此注解 @Controller @Component的衍生注解 标注在控制器类上 @Service @Component的衍生注解 标注在业务类上 @Repository @Component的衍生注解 标注在数据访问类上(由于与mybatis整合,用的很少) - 注意事项:
- 声明bean时,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用
@Controller
- Bean的组件扫描
- 前面声明的bean的四大注解,想要生效,还需要被组件扫描注解
@ComponentScan
扫描 @ComponentScan
注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication
中,默认扫描范围时启动类所在包及其子包- 可以手动设置扫描范围以覆盖默认扫描范围,但推荐还是把项目中的所有bean都放在启动类中
- 前面声明的bean的四大注解,想要生效,还需要被组件扫描注解
-
DI详解
@Autowired
:默认安装类型自动装配- 如果同类型的bean存在多个
@Primary
:放到bean的注解前,用来指定优先级@AutoWired+@qualifier("bean的名称")
根据名称选择@Resource(name="bean的名称")
根据名称选择
@AutoWired
和@Resource
的区别@Resource
是JDK提供的注解,@AutoWired
是spring框架提供的注解@AutoWired
默认按照类型进行注入,@Resource
默认按照名称进行注入
MySQL
以下内容可分为三个部分
- 数据库设计
- MySQL概述
- 数据库设计-DDL
- 多表设计
- 数据库操作
- 数据库操作-DML
- 数据库操作-DQL
- 事务
- 查询
- 数据库优化
- 索引
- SQL优化
01 MySQL概述
-
安装社区版MySQL,官网
安装步骤视频讲的很细 -
MySQL连接:
mysql -u用户名 -p 密码 [-h数据库服务器IP地址 -P端口号]
-
MySQL-企业开发使用方式
- 远程使用服务器
-
MySQL数据库模型
- 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库
- 特点:
- 使用表存储数据,格式统一,便于维护
- 使用SQL语言操作,标准统一,使用方便,可用于复杂查询
-
SQL简介
- SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准
- 通用语法:
- SQL语句可以单行或者多行书写,以分号结尾
- SQL语句可以使用空格或缩进来增强语句可读性
- MYSQL数据库的SQL语句不区分大小写
- 注释
-
- 单行注释:
-- 注释内容
或# 注释内容
(MySQL特有)
- 单行注释:
-
- 多行注释:
/*注释内容*/
- 多行注释:
-
- SQL分类
- SQL语句通常分为四类
分类 全称 说明 DDL Data Definition Language 数据定义语言,用来定义数据库对象(数据库与,表,字段) DML Data Manipulation Language 数据操作语言,用来对数据库表中的数据进行增删改 DQL Data Query Language 数据查询语言,用来查询数据库表中的数据 DCL Data Control Language 数据控制语言,用来创建数据库用户,控制数据库的访问权限
02 数据库设计-DDL
-
DDL 数据库操作
- 查询:
- 查询所有数据库:
show databases
- 查询当前数据库:
select database()
- 查询所有数据库:
- 使用
- 使用数据库:
use 数据库名
- 使用数据库:
- 创建
- 创建数据库:
create database [if not exist] 数据库名
- 创建数据库:
- 删除
- 删除数据库:
drop database [if exists] 数据库名
- 删除数据库:
- 查询:
-
用命令行使用mysql语句的缺点
- 无提示,操作繁琐,无历史记录
- 因此可以使用mysql的可视化工具,有
- SQLyog,Navicat,DataGrip
- 这里使用DataGrip,其为Jetbrains旗下的一款数据库管理工具,是管理和开发MySQL,Oracle,PostgreSQL的理想解决方案
- DataGrip为IDEA自带,(IDEA贵有贵的道理)
-
DDL表(创建,查询,修改,删除)
-
创建
create table 表名( 字段1 字段类型 [约束][comment 字段1注释] ... 字段n 字段类型 [约束][comment 字段n注释] )[comment 表注释]
-
约束
- 概念:约束是作用表中字段上的规则,用于限制存储在表中的数据
- 目的:保证数据库中数据的正确性,有效性,完整性
- SQL语句主要提供以下5种约束
约束 描述 关键字 非空约束 限制该字段值不能为null not null 唯一约束 保证字段的所有数据都是唯一,不重复的 unique 主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key (auto_increment 设置自动增长) 默认约束 保存数据时,如果未指定该字段,则使用默认值 default 外键约束 让两张表的数据建立连接,保证数据的一致性和完整性 foreign key -
数据类型:主要分为三类
- 数值类型:主要使用 tinyint,int,float,double
- 字符串类型:char(定长字符,性能高),varchar(边长字符,性能低但占空间少)
- 日期时间类型
-
表结构设计基本流程
- 页面原型+需求 -> 原型字段(类型,约束) + 基础字段(创建时间,上一次更改时间)-> 得到需要的表
-
-
查询
- 查询当前数据库的所有表:
show tables
- 查询表结构:
desc 表名
- 查询建表语句:
show create table 表名
- 查询当前数据库的所有表:
-
修改
- 添加字段:
alter 表名 add 字段名 类型(长度) [comment 注释][约束]
- 修改字段类型:
alter table 表名 modify 字段名 新数据类型(长度)
- 修改字段名和字段类型:
alter table 表名 change 旧字段名 新字段名(长度)[comment 注释][约束]
- 删除字段:
alter table 表名 drop column 字段名
- 修改表明:
rename table 表名 to 新表名
- 添加字段:
-
删除
- 删除表:
drop table [if exists] 表名
- 在删除表的首,表中的数据也会删除
- 删除表:
03 数据库设计-DML
DML(Data Manipulation Language) 数据操作语言,用来对数据库表中的数据进行增删改操作
-
insert 插入
- 语法
- 指定字段添加数据:
insert 表名 (字段名1,字段名2) values (值1,值2)
- 全部字段添加数据:
insert 表名 values(值1,值2)
- 批量添加数据(指定字段)
insert 表名 (字段名1,字段名2) values (值1,值2),values (值1,值2)
- 鼻梁添加数据(全部字段)
insert 表名 values(值1,值2),values(值1,值2)
- 指定字段添加数据:
- 注意事项
-
- 插入数据时,指定的字段顺序需要和值的顺序是一一对应的
-
- 字符串和日期类型数据应该包含在引号里
-
- 插入的数据大小,应该在字段的规定范围内
-
- 语法
-
update 更新
- 语法
- 修改数据:
updata 表名 set 字段值1=值1,字段值2=值2,...[where 条件]
- 修改数据:
- 注意事项
- 修改语句的条件可有可无,如无,则会修改整张表
- 语法
-
delete 删除
- 语法
- 删除数据:
delete from 表名 [where 条件]
- 删除数据:
- 注意事项
-
- DELETE语句的条件可有可无,若没有则会删除整张表
-
- DELETE语句不能删除某一个字段的值(如果操作,可以使用UPDATE,将该字段值置为NULL)
-
- 语法
04 数据库设计-DQL
-
DQL(Data Query Language)(数据查询语言),用来查询数据库表中的数据
-
关键词 SELECT
- 语法:
- 语法:
-
基本查询
- 查询多个字段:
selcet 字段1,字段2,字段3 from 表名
- 查询所有字段(通配符):
select * from 表名
(该方法不直观,且效率低) - 设置别名:
select 字段1 [as 别名1], 字段2 [as 别名2] from 表名
- 去除重复记录:
select distinct 字段列表 from 表名
- 查询多个字段:
-
条件查询
- 语法:
select 字段列表 from 表名 where 条件列表
- 比较运算符:
>,>=,<,<=,=,<>或!=(不等于),between ... and ..., in(...),like (字符串和占位符),is null
- 逻辑运算符:
and或&&,or或||,not或!
- 语法:
-
分组查询
- 聚合函数
- 介绍:将一列数据作为一个整体,并进行纵向计算
- 语法:
select 聚合函数(字段列表) from 表名
- 常见聚合函数
count,max,min,avg,sum
- 注意事项:null不参与聚合函数
- 语法:
- 分组查询:
select 字段列表 from 表名 [where 条件] group 分组字段名 [having 分组过滤后的条件]
- 分组查询:
- where和having区别
-
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
-
- 判断条件不同:where不能对聚合函数进行判断,而having可以
-
- 注意事项:
- 分组后,查询的字段为分组字段和聚合函数,查询其它字段无意义
- 执行顺序:where>聚合函数>having
- 聚合函数
-
排序查询
- 语法:
- 条件查询:
select 字段列表 from 表名 [where 条件列表][group by 分组字段] order by 字段1 排序方式1, 字段2 排序方式2...;
- 条件查询:
- 排序方式
ASC
升序(默认值),DESC
降序
- 语法:
-
分页查询
- 语法:
select 字段列表 from 表名 limit 起始索引,查询记录数
- 注意事项:
-
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
-
- 分页查询是数据库的方言,不同数据库实现不同
-
- 如果查询的数据是第一页的数据,起始索引可以省略
-
- 语法:
-
函数
if(表达式,tvalue,fvalue)
:当表达式为true时,取tvalue,否则取fvaluecase expr when value1 then result1 [when value2 then result2..][else result] end
类似switch语句
05 多表设计
-
一对多
- 使用外键约束,保证数据的一致性和完整性
- 外键语法:
# 创建时添加外键 create table 表名( 字段民 数据类型, ... [constraint] [外键名称] foreign key (外键字段名) references 主表 (字段名) ); # 创建后添加外键 alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(字段名)
- 物理外键
- 概念:使用
foreign key
定义外键关联另一张表 - 缺点:
- 影响增删改的效率(需要查外键关系)
- 仅用于单节点数据库,不适用于分布式,集群场景
- 容易引发数据库的死锁问题,消耗性能
- 引起缺点在企业中已经很少使用,甚至明文禁止
- 概念:使用
- 逻辑外键
- 概念:在业务层逻辑,解决外键连接
- 通过逻辑外键,可以很方便解决
-
一对一
- 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其它字段放在另一张表中,以提升效率
- 实现:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的。
-
多对多
- 关系:一个学生可以选多个课程,一个课程可供多个学生选择
- 实现:建立第三张表,中间表至少包含两个外键,分别关联两方主键
06 多表查询
-
概念:从多个表中查询数据
- 笛卡尔积
- 内连接
- 外连接
- 左外连接:查询左表所有数据(包括两张表交集部分数据)
- 右外连接:查询右表所有数据(包括两张表交集部分数据)
- 子查询
-
内连接
- 语法
- 隐式内连接:
select 字段列表 from 表1,表2 where 条件 ...;
- 显式内连接:
select 字段列表 from 表1 [inner] join 表2 on 条件;
- 隐式内连接:
- 语法
-
左外连接:
select 字段列表 from 表1 left [outer] join 表2 on 连接条件
-
左外连接:
select 字段列表 from 表1 right [outer] join 表2 on 连接条件
-
子查询
- 介绍:SQL语句种嵌套select语句,称为嵌套查询,又称子查询
- 形式:
select * from t1 where column1 = (select column1 from t2 ..)
- 子查询外部的语句可以是insert/update/delete/select的任何一个,最常见的是select
- 分类
- 标量子查询,列子查询,行子查询,表子查询
07 事务
- 介绍
- 概念:事务是一组操作集合,他是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
- 注意事项:默认MySQL的事务是自动提交的,即当执行依据DML语句,MySQL会立即隐式地提交事务
- 事务控制
- 开启事务:
start transaction; / begin
- 提交事务:
commit
- 回归事务:
rollback
- 开启事务:
- 事务四大特性
- 原子性Atomicity :事务是不可分割的最小单位,要么全部成功,要么全部失败
- 一致性Consistency:事务完成时,必须使所有的数据都保持一致性
- 隔离性Isolation :数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性Durability :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
08 索引
-
概念:帮助数据库高效获取数据的数据结构
-
优点:
- 提高数据查询效率,降低数据库IO成本
- 通过索引列对数据进行排序,降低数据排序成本,降低CPU消耗
-
缺点
- 索引会占据存储空间
- 索引大大提高了查询效率,但降低了增删改的效率
- 然而缺点影响不大,当今企业存储空间已经不是问题,且一个正常的数据库系统90%是查询操作
-
结构
- MySQL数据库支持的索引结构很多,如:hash索引,B+Tree索引,Full-Text索引等。但MySQL默认索引为B+Tree结果组织的索引。
-
语法
- 创建索引:
creat [unique] index 索引名 on 表名(字段名)
- 查看索引:
show index from 表名
- 删除索引:
drop index 索引名 on 表名
- 创建索引:
-
注意事项:
- 主键字段,在建表时,会自动创建主键索引
- 添加唯一约束时,数据库实际上会添加唯一索引
MyBaits
- Mybaits是一款优秀的持久层(即三层中的第三层)框架,用于简化JDBC的开发
01 Mybatis入门
-
使用Mybatis查询所有用户数据
- 1 准备工作(创建springboot工程,数据库表user,实体类User)
- 2 引入Mybatis的相关依赖,配置Mybaits(数据库连接信息)
- 3 编写SQL语句(注解/XML)
-
配置SQL提示
-
JDBC(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API
- 本质
- sun公司官方定义的一套操作所用关系型数据的规范,即接口
- 各个数据库厂商去实现这套接口,提供数据库的驱动jar包
- 使用这套接口编程,真正执行的是驱动jar包中的代码
- 本质
-
数据库连接池
- 概念
- 数据库连接池是一个容器,负责分配,管理数据库连接
- 允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
- 优势
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
- 便准接口:DataSource
- 官方sun提供的供数据库连接池接口,由第三方组织实现该接口
- 功能:获取连接
- 概念
-
lombok
- 定义:Lombok是一个实用的java类库,能通过注解的形式自动生成构造器getter/setter,equals,hashcode,toString等方法,并可以自动化生成日志变量,简化java开发,提高效率
注解 作用 @Getter/@Setter 为所有属性提供get/set方法 @ToString 会给类自动生成易读的toString方法 @EqualsAndHashCode 根据类所拥有的非静态字段自动重写equals方法和hashcode方法 @Data 提供了更综合的生成代码功能(包含以上四个方法) @NoArgsConstructor 为实体类生成无参的构造器方法 @AllArgsConstructor 为实体类生成除static修饰的字段之外带有各参数的构造器方法
02 Mybatis基础操作
-
准备
-
删除
- SQL语句:
delete from emp where id=17
- 接口方法:
@Delete("delete from emp where id=#{id}") //也可以是@Delete("delete from emp where id=${id}") //但#{}为预编译,${}为直接嵌入 public void delete(Integer id);
- 如果mapper接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,否则要对应
- 日志输出:再application.properties中配置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
,打开mybatis日志,并指定输出到控制台中 - 预编译
- 性能更高
- 更安全(防止SQL注入 )
- sQL注入:通过操作输入的数据来修改实现定义好的SQL语句,以达到执行代码对服务器进行攻击的方法
- SQL语句:
-
新增
- SQL语句
insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values ('Tom','汤姆','1','1.jpg',1,'2005-01-01',1,now(),now())
- 接口方法
@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);
-
更新
- SQL语句
update emp set username='',name='',gender='',image='',job='', entrydate='',dept_id='',create_time='',update_time='' where id=1;
- 接口方法
@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);
-
查询
- SQL语句:
select * from emp where id=15
- 接口方法:
@Select("select * from emp where id=#{id}") public Emp getById(Integer id);
- mybatis数据封装
- 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
- 不一致时解决方案:
-
- 在sql语句中起别名
-
- 通过
@Results,@Result
注解手动映射
- 通过
-
- 通过mybaits的驼峰命名自动映射开关
-
- SQL语句:
-
条件查询
- SQL语句
select * from emp where name like '%张%' and gender = 1 and entrydate between '2010-01-01' and '2020-01-01' order by update_time desc
- 接口方法
@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<Emp> list(String name, short gender, LocalDate begin,LocalDate end);
03 XML映射文件
//之后在本次突击还没用到,以后闲了看看
04 Mybatis动态SQL
Spring
Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>90%
-
简化开发,降低企业级开发的复杂性
-
框架整合,高效整合其它技术,提高企业级应用开发和运行效率
-
学什么?
- IoC
- AOP
- 事务处理
- 框架整合
-
怎么学?
- 学习Spring框架的设计思想
- 学习基础操作,思考操作与思想间的联系
- 学习案例,熟练应用操作的同时,体会思想
1 Spring 初识
- Spring 既是一门技术,也是一套项目,已经形成了开发的生态圈,Spring 全家桶
- 包含重点:
- Spring Framework:基础框架,全家桶所有都基于此
- Spring Boot:Spring开发已经更简单,该技术让Spring开发更迅速
- Spring Cloud:提供分布式开发相关技术
2 Spring Framework
- 该项目为Spring生态圈最基础的项目
- 然而该架构配置繁琐,入门难度大
- 为此推出Spring Boot 简化配置和快速开发
3 Spring 核心概念
-
Ioc/DI
-
IoC容器
-
Bean
-
IoC (Inversion of Control) 控制反转
- 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对像创建控制权由程序转移到外部,此思想称为控制反转
-
Spring技术对IoC技术进行了实现
- Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
- IoC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象再IoC容器里称为
Bean
-
DI (Dependency Injection) 依赖注入
- 在容器中简历bean和bean之间的依赖关系的整个过程,称为依赖注入
-
核心概念
- 目标:充分解耦
- 使用IoC容器管理bean(IoC)
- 在IoC容器内将有依赖关系的bean进行关系绑定(DI)
- 最终效果
- 使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
- 目标:充分解耦
4 IoC入门案例
- 管理什么?(Service与Dao)
- 如何将管理的对象告知IoC容器(配置)
- 被管理的对象交给IoC容器,如何获取IoC容器(接口)
- IoC容器得到后,如何获得其中bean(接口方法)
- 使用Spring导入哪些坐标(pos.xml)