[toc]

Maven

视频地址

01 Maven概述

  • Maven 时apache 旗下的一个开源软件,是一款用于管理和构建java项目的工具
  • 他基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建
  • 作用
    • 依赖管理:方便快件的管理项目依赖的资源(jar包),避免版本冲突
    • 统一项目结构:提供标准,同一的项目结构
    • 项目构建:标准跨平台(Linux,Windows,MacOS)的自动化项目构建方式
  • 官网

Maven介绍

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包,一个项目中可以引入多个依赖
    • 配置
        1. 在pos.xml中编写<dependencies>标签
        1. 在<dependencies>标签中使用<dependency>引入坐标
        1. 定义坐标的 groupId,artifactId,version
        1. 定义刷新按钮,引入最新加入的坐标
          依赖仓库,每次可以直接在这里找到所需依赖和对应坐标
          如果引入的依赖不存在,将会连接远程仓库/中央仓库 然后下载依赖
<!-- 坐标代码示例 -->
<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指令范围内)
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”
    • 步骤:
        1. 创建springboot工程,并勾选web开发相关依赖
        1. 定义helloController类,添加方法hello,并添加注解
        1. 运行测试

02 HTTP协议

  • HTTP概述
    • 概念:Hyper Text Transfer Protocol 超文本传输协议,规定了浏览器和服务器之间的数据传输
    • 特点:
        1. 基于TCP协议:面向连接,安全
        1. 基于请求-响应模型:一次请求对应一次响应
        1. 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白雪,不用运行

请求响应

视频连接

  • 前端控制器 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";
      }
    
  • 路径参数

    • 通过请求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";
      }
    

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都放在启动类中
  • 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语句不区分大小写
      • 注释
          1. 单行注释:-- 注释内容# 注释内容(MySQL特有)
          1. 多行注释:/*注释内容*/
    • 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)
    • 注意事项
        1. 插入数据时,指定的字段顺序需要和值的顺序是一一对应的
        1. 字符串和日期类型数据应该包含在引号里
        1. 插入的数据大小,应该在字段的规定范围内
  • update 更新

    • 语法
      • 修改数据:updata 表名 set 字段值1=值1,字段值2=值2,...[where 条件]
    • 注意事项
      • 修改语句的条件可有可无,如无,则会修改整张表
  • delete 删除

    • 语法
      • 删除数据:delete from 表名 [where 条件]
    • 注意事项
        1. DELETE语句的条件可有可无,若没有则会删除整张表
        1. DELETE语句不能删除某一个字段的值(如果操作,可以使用UPDATE,将该字段值置为NULL)

04 数据库设计-DQL

  • DQL(Data Query Language)(数据查询语言),用来查询数据库表中的数据

  • 关键词 SELECT

    • 语法:
      DQL语法
  • 基本查询

    • 查询多个字段: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区别
        1. 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
        1. 判断条件不同:where不能对聚合函数进行判断,而having可以
    • 注意事项:
      • 分组后,查询的字段为分组字段和聚合函数,查询其它字段无意义
      • 执行顺序:where>聚合函数>having
  • 排序查询

    • 语法:
      • 条件查询:select 字段列表 from 表名 [where 条件列表][group by 分组字段] order by 字段1 排序方式1, 字段2 排序方式2...;
    • 排序方式
      • ASC升序(默认值),DESC降序
  • 分页查询

    • 语法:select 字段列表 from 表名 limit 起始索引,查询记录数
    • 注意事项:
        1. 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
        1. 分页查询是数据库的方言,不同数据库实现不同
        1. 如果查询的数据是第一页的数据,起始索引可以省略
  • 函数

    • if(表达式,tvalue,fvalue):当表达式为true时,取tvalue,否则取fvalue
    • case 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语句
    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会自动封装
      • 不一致时解决方案:
          1. 在sql语句中起别名
          1. 通过@Results,@Result注解手动映射
          1. 通过mybaits的驼峰命名自动映射开关
  • 条件查询

    • 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生态圈最基础的项目
    Spring4.0架构图
  • 然而该架构配置繁琐,入门难度大
  • 为此推出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入门案例

  1. 管理什么?(Service与Dao)
  2. 如何将管理的对象告知IoC容器(配置)
  3. 被管理的对象交给IoC容器,如何获取IoC容器(接口)
  4. IoC容器得到后,如何获得其中bean(接口方法)
  5. 使用Spring导入哪些坐标(pos.xml)