JavaWeb开发(后端Web开发【一】)

文章目录

  • 前言
  • 一、Maven
    • 1.Maven概述-介绍
      • 1.1.Maven概述-介绍
      • 1.2.Maven概述-安装
    • 2.IDEA集成Maven
      • 2.1.IDEA集成Maven-配置Maven环境
      • 2.2.IDEA集成Maven-创建Maven项目
      • 2.3.IDEA集成Maven-导入Maven项目
    • 3.Maven-依赖管理
      • 3.1.Maven-依赖管理-依赖配置
      • 3.2.Maven-依赖管理-依赖传递
      • 3.3.Maven-依赖管理-依赖范围
      • 3.4.Maven-依赖管理-生命周期
  • 二、SpringBoot+Web入门
    • 1.SpringBootWeb入门
      • 1.1.Spring&SpringBoot介绍
      • 1.2.SpringBootWeb快速入门
    • 2.HTTP协议
      • 2.1.HTTP协议-概述
      • 2.2.HTTP协议-请求协议
      • 2.3.HTTP协议-响应协议
      • 2.4.HTTP协议-协议解析
    • 3.Web服务器-Tomcat
      • 3.1.Tomcat-介绍
      • 3.2.Tomcat-基本使用
      • 3.3.Tomcat-入门程序解析(内嵌Tomcat)
  • 三、请求响应
    • 1.请求响应-概述
    • 2.请求响应-请求
      • 2.1.请求响应-请求-postman工具
      • 2.2.请求响应-请求-简单参数
      • 2.3.请求响应-请求-实体参数
      • 2.4.请求响应-请求-数组集合参数
      • 2.5.请求响应-请求-日期参数
      • 2.6.请求响应-请求-JSON参数
      • 2.7.请求响应-请求-路径参数
    • 3.请求响应-响应
      • 3.1.请求响应-响应-@ResponseBody
      • 3.2.请求响应-响应-统一响应结果
  • 四、分层解耦
    • 1.分层解耦-三层架构
    • 2.分层解耦-分层解耦(IOC-DI引入)
    • 3.分层解耦-IOC&DI-IOC详解
    • 4.分层解耦-IOC&DI-DI详解
  • 五、MySQL
    • 1.MySQL- 介绍
    • 2.MySQL-概述
      • 2.1.MySQL-概述-安装配置
      • 2.2.MySQL-概述-数据模型
      • 2.3.MySQL-概述-数据模型-SQL简介
    • 3.MySQL-DDL
      • 3.1.MySQL-DDL-数据库操作
      • 3.2.MySQL-DDL-图形化工具
      • 3.3.MySQL-DDL-表结构操作-创建
      • 3.4.MySQL-DDL-表结构操作-数据类型
      • 3.5.MySQL-DDL-表结构操作-查询&修改&删除
    • 4.MySQL-DML
      • 4.1.MySQL-DML-添加数据(insert)
      • 4.2.MySQL-DML-修改数据(update)
      • 4.3.MySQL-DML-删除数据(delete)
    • 5.MySQL-DQL
      • 5.1.MySQL-DQL-基本查询
      • 5.2.MySQL-DQL-条件查询
      • 5.3.MySQL-DQL-聚合函数
      • 5.4.MySQL-DQL-分组查询
      • 5.5.MySQL-DQL-排序查询
      • 5.6.MySQL-DQL-分页查询
    • 6.MySQL-多表设计
      • 6.1.MySQL-多表设计-一对多
      • 6.2.MySQL-多表设计-一对多-外键
      • 6.3.MySQL-多表设计-一对一
      • 6.4.MySQL-多表设计-多对多
    • 7.MySQL-多表查询
      • 7.1.MySQL-多表查询-概述
      • 7.2.MySQL-多表查询-内连接
      • 7.3.MySQL-多表查询-外连接
      • 7.4.MySQL-多表查询-子查询-概述&分类
      • 7.5.MySQL-多表查询-子查询-标量子查询&列子查询
      • 7.6.MySQL-多表查询-子查询-行子查询&表子查询
    • 8.MySQL-事务
      • 8.1.MySQL-事务-介绍
      • 8.2.MySQL-事务-操作
      • 8.3.MySQL-事务-四大特性
    • 9.MySQL-索引
      • 9.1.MySQL-索引-介绍
      • 9.2.MySQL-索引-结构
      • 9.3.MySQL-索引-操作语法
  • 五、Mybatis
    • 1.Mybatis-入门
      • 1.1.Mybatis-入门-介绍
      • 1.2.Mybatis-入门-快速入门程序
      • 1.3.Mybatis-入门-配置SQL提示
      • 1.4.Mybatis-入门-JDBC
      • 1.5.Mybatis-入门-数据库连接池
      • 1.6.Mybatis-入门-lombok工具包介绍
    • 2.Mybatis-基础操作
      • 2.1Mybatis-基础操作-环境准备
      • 2.2Mybatis-基础操作-删除
      • 2.3Mybatis-基础操作-删除(预编译SQL)
      • 2.4Mybatis-基础操作-新增
      • 2.5Mybatis-基础操作-新增(主键返回)
      • 2.6Mybatis-基础操作-更新
      • 2.7Mybatis-基础操作-查询(根据ID查询)
      • 2.8Mybatis-基础操作-查询(条件查询)
    • 3.Mybatis-XML映射文件
    • 4.Mybatis-动态SQL
      • 4.1Mybatis-动态SQL-if
      • 4.2Mybatis-动态SQL-if-案例
      • 4.3Mybatis-动态SQL-foreach
      • 4.4Mybatis-动态SQL-sql&include

此文档来源于网络,如有侵权,请联系删除!

前言

在这里插入图片描述

一、Maven

什么是Maven

Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。

Apache

Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。

开源项目:https://www.apache.org/index.html#projects-list

Maven的作用

  • 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
  • 统一项目结构:提供标准,统一的项目结构
  • 项目构建:标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式

1.Maven概述-介绍

1.1.Maven概述-介绍

Maven介绍

  • Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。
  • 作用
    1.方便的依赖管理
    2.统一的项目结构
    3.标准的项目构建流程
  • 官网:https://maven.apache.org/

在这里插入图片描述

  • 仓库:用于存储资源,管理各种jar包。
    1.本地仓库:自己计算机上的一个目录。
    2.中央仓库:由Maven团队维护的全球唯一的。仓库地址:https://repo1.maven.org/maven2/
    3.远程仓库(私服):一般由公司团队搭建的私有仓库。

1.2.Maven概述-安装

Maven下载

  • 官网:https://maven.apache.org/

    在这里插入图片描述

    在这里插入图片描述

Maven安装

  1. 将下载好的压缩包解压到无中文名的目录下
    在这里插入图片描述

  2. 配置本地仓库:修改conf/settings.xml配置文件中的<localRepository>为一个指定目录

    #创建一个名为maven_repository文件夹。D:\develop\apache-maven-3.9.2\maven_repository(代表本地仓库,jar包存放的地方)
    <localRepository>D:\develop\apache-maven-3.9.2\maven_repository</localRepository>
    

    在这里插入图片描述

  3. 配置阿里云私服:修改conf/settings.xml配置文件中的<mirrors>标签,为其添加如下子标签:

    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>  
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
    

    在这里插入图片描述

    阿里maven配置指南:https://developer.aliyun.com/mvn/guide

  4. 配置环境变量:MAVEN_HOME 为Maven的解压目录,并将其bin目录加入PATH环境变量

    在这里插入图片描述
    在这里插入图片描述

  5. 测试Mavem是否安装配置完毕

    #能查看到Maven版本代表安装配置完毕(安装Maven需要依赖JDK,我这里安装的是jdk-11.0.15.1版本)
    mvn -v
    

    在这里插入图片描述

2.IDEA集成Maven

2.1.IDEA集成Maven-配置Maven环境

配置Maven环境(当前工程)

  1. 创建一个名为web_project的项目

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  2. 配置项目需要使用的JDK版本

    在这里插入图片描述

    此处我使用的是JDK11版本,自己安装了JDK版本选择不了就点击旁边的New添加自己安装的JDK版本

    在这里插入图片描述

  3. 配置Maven环境

    在这里插入图片描述

    设置IDEA使用本地安装的 Maven,并修改配置文件及本地仓库路径

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

配置Maven环境(全局)

  1. File→Close Project

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.2.IDEA集成Maven-创建Maven项目

创建Maven项目

  1. 创建模块,选择Maven

    在这里插入图片描述
    在这里插入图片描述

  2. 填写模块信息

    在这里插入图片描述 在这里插入图片描述

  3. 编写 HelloWorld,并运行

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

中途出现了报错,下面是解决方法

报错: Unable to import maven project: See logs for details 无法导入maven项目:请参阅日志了解详细信息

在这里插入图片描述

查看日志:Help→Show Log in Explorer

在这里插入图片描述

日志错误信息

在这里插入图片描述
在这里插入图片描述

原因:IDEA与Maven版本不兼容所致

解决方法(跟换Maven安装包——重新配置Maven——重新加载项目)

重新加载项目

在这里插入图片描述

Maven坐标

  1. 什么是坐标?
    • Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
    • 使用坐标来定义项目或引入项目中需要的依赖。
  2. Maven坐标主要组成
    • groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.xiongjian)
    • artifactld:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
    • version:定当前项目版本号
      在这里插入图片描述

2.3.IDEA集成Maven-导入Maven项目

导入Maven项目

  • 方式一:

    1.选择右侧Maven面板,点击 + 号

    在这里插入图片描述

    2.选中对应项目的pom.xml文件

    在这里插入图片描述

  • 方式二:

    1.File→Project Structure

    在这里插入图片描述
    2.点击 + 号→Import Module

    在这里插入图片描述
    3.选中对应项目的pom.xml文件

    在这里插入图片描述

3.Maven-依赖管理

3.1.Maven-依赖管理-依赖配置

依赖配置

  • 依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
  • 配置:
    1.在 pom.xml 中编写<dependencies>标签
    2.在标签中使用<dependency>引入坐标
    3.定义坐标的groupld,artifactld,version
    4.点击刷新按钮,引入最新加入的坐标

在这里插入图片描述
在这里插入图片描述

注意事项

  • 如果引入的依赖,在本地仓库不存在,将会连接远程仓虑/中央仓库,然后下载依赖。 (这个过程会比较耗时,耐心等待)
  • 如果不知道依赖的坐标信息,可以到https://mvnrepository.com/中搜索

3.2.Maven-依赖管理-依赖传递

依赖传递

  • 依赖具有传递性

    • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
    • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

    在这里插入图片描述

  • 排除依赖
    排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。
    在这里插入图片描述

3.3.Maven-依赖管理-依赖范围

依赖范围

  • 依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>…</ scope> 设置其作用范围。
  • 作用范围:
    • 主程序范围有效。(main文件夹范围内)
    • 测试程序范围有效。(test文件夹范围内)
    • 是否参与打包运行。(package指令范围内)
      在这里插入图片描述
scope值主程序测试程序打包(运行)范例
compile(默认)YYYlog4j
test-Y-junit
providedYY-servlet-api
runtime-YYjdbc驱动

3.4.Maven-依赖管理-生命周期

生命周期
Maven的生命周期就是为了对所有的Maven项目构建过程进行抽象和统一。

  • Maven中有3套相互独立的生命周期
    • clean:清理工作。
    • default:核心工作,如:编译、测试、打包、安装、部署等。
    • site:生成报告、发布站点等。

每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。
在这里插入图片描述

  • 生命周期阶段

    • clean:移除上一次构建生成的文件
    • compile:编译项目源代码
    • test:使用合适的单元测试框架运行测试(junit)
    • package:将编译后的文件打包,如:jar、war等
    • install:安装项目到本地仓库
  • 注意事项:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。

执行指定生命周期的两种方式:

  • 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。
  • 在命令行中,通过命令执行。

在这里插入图片描述

mvn clean
mvn compile
mvn package
mvn test
...

在这里插入图片描述
在这里插入图片描述

二、SpringBoot+Web入门

1.SpringBootWeb入门

1.1.Spring&SpringBoot介绍

Spring

  • 官网:https://spring.io/
  • Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。
    在这里插入图片描述

SpringBoot

  • Spring Boot 可以帮助我们非常快速的构建应用程序、简化开发、提高效率。

    在这里插入图片描述

1.2.SpringBootWeb快速入门

SpringBootWeb快速入门

需求:使用 SpringBoot 开发一个web应用,浏览器发起请求hello后,给浏览器返回字符串"Hello World~"。

步骤

①.创建springboot工程,并勾选web开发相关依赖。

1.File→New→Module

在这里插入图片描述

2.选择JDK版本→Next

在这里插入图片描述

3.填写相关配置信息→Next

在这里插入图片描述

4.Web→勾选Spring Web→Next

在这里插入图片描述

5.填写信息,选择项目存放路径→Finish

在这里插入图片描述

6.等待联网下载(需要等待几分钟)

在这里插入图片描述

7.SpringBoot项目创建完成→可以删除如图所示没有用的文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:不同的JDK版本与SpringBoot版本不兼容,会导致创建完成启动报错

②.定义HelloController类,添加方法 hello,并添加注解。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

③.运行测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 浏览器访问:localhost:8080/hello

在这里插入图片描述
在这里插入图片描述

2.HTTP协议

2.1.HTTP协议-概述

HTTP

  • 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
    在这里插入图片描述
  • 特点:
    1.基于TCP协议:面向连接,安全。
    2.基于请求-响应模型的:一次请求对应一次响应。
    3.HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
    • 缺点:多次请求间不能共享数据。
    • 优点:速度快

2.2.HTTP协议-请求协议

请求协议

在这里插入图片描述

请求方式-GET:请求参数在请求行中,没有请求体,如:/brand/findAll?name=OPPO&status=1。GET请求大小是有限制的
请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的。

请求头标签含义
HOST请求的主机名
User-Agent浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 … Chrome/79,IE浏览器的标识类似Mozila/5.0(WindowsNT …) like Gecko
Accept表示浏览器能接收的资源类型,如text/*,image/或者/*表示所有
Accept-Language表示浏览器偏好的语言,服务器可以据此返回不同语言的网页
Accept-Encoding表示浏览器可以支持的压缩类型,例如gzip,deflate等
Content-Type请求主体的数据类型
Content-Length请求主体的大小(单位:字节)

2.3.HTTP协议-响应协议

响应协议

在这里插入图片描述

响应状态码含义
1xx响应中-临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它
2xx成功-表示请求已经被成功接收,处理已完成
3xx重定向-重定向到其他地方;让客户端再发起一次请求以完成整个处理
4xx客户端错误-处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等
5xx服务器错误-处理发生错误,责任在服务端。如:程序抛出异常等

状态码大全 https://cloud.tencent.com/developer/chapter/13553

响应头含义
Content-Type表示该响应内容的类型,例如text/html,application/json
Content-Length表示该响应内容的长度 (字节数)
Content-Encoding表示该响应压缩算法,例如gzip
Cache-Control指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
Set-Cookie告诉浏览器为当前页面所在的域设置cookie

2.4.HTTP协议-协议解析

在这里插入图片描述

3.Web服务器-Tomcat

Web服务器

Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”。

3.1.Tomcat-介绍

Tomcat

  • 概念:Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。
  • JavaEE:Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF。
  • Tomcat 也被称为 Web容器、Servlet容器。Servlet程序需要依赖于Tomcat才能运行
  • 官网:https://tomcat.apache.org/

3.2.Tomcat-基本使用

Tomcat-基本使用

  • 下载:官网下载,地址:https://tomcat.apache.org/download-90.cgi

    在这里插入图片描述

    在这里插入图片描述

  • 安装:绿色版,直接解压即可

    在这里插入图片描述

  • 卸载:直接删除目录即可

  • 启动:双击:bin\startup.bat

    在这里插入图片描述

    • 控制台中文乱码:修改conf/logging.properties文件
      在这里插入图片描述
      在这里插入图片描述
  • 关闭:

    • 直接x掉运行窗口:强制关闭
    • bin\shutdown.bat:正常关闭
    • Ctrl+C:正常关闭
  • 浏览器访问:http://localhost:8080/

    在这里插入图片描述
    常见问题

  • 双击启动窗口一闪而过:检查JAVA_HOME环境变量是否正常配置

  • 端口号冲突:找到对应程序,将其关闭掉(或者是修改Tomcat的端口号)
    在这里插入图片描述

修改Tomcat的端口号

  • 修改conf/server.xml配置文件
    在这里插入图片描述

注意事项

HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。

Tomcat项目部署

将项目放置到webapps目录下,即部署完成

3.3.Tomcat-入门程序解析(内嵌Tomcat)

SpringBootWeb-入门程序解析
在这里插入图片描述
起步依赖

  • spring-boot-starter-web:包含了web应用开发所需要的常见依赖。
  • spring-boot-starter-test:包含了单元测试所需要的常见依赖。
  • 官方提供的starter:https://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#using.build-systems.starters

在这里插入图片描述
在这里插入图片描述

三、请求响应

1.请求响应-概述

在这里插入图片描述

请求响应:

  • 请求(HttpServletRequest):获取请求数据
  • 响应(HttpServletResponse):设置响应数据
  • BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。
    • 优点:维护方便
    • 缺点:体验一般
  • CS架构:Client/Server,客户端/服务器架构模式。
    • 优点:体验不错
    • 缺点:开发、维护麻烦

2.请求响应-请求

2.1.请求响应-请求-postman工具

postman

  • Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。

  • 作用:常用于进行接口测试

  • 下载地址:https://app.getpostman.com/app/download/win64
    在这里插入图片描述

  • 安装:双击下载好的安装包会自己安装

    在这里插入图片描述

  • 注册:需要连接网络

    在这里插入图片描述
    在这里插入图片描述

  • 登录

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 创建工作空间

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 请求测试

    在这里插入图片描述

    在这里插入图片描述

  • 请求保存

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

2.2.请求响应-请求-简单参数

简单参数

  • 原始方式

    在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。
    在这里插入图片描述

  • SpringBoot方式
    简单参数:参数名与形参变量名相同,定义形参即可接收参数。

    get方式请求

    在这里插入图片描述
    在这里插入图片描述

    post方式请求

    在这里插入图片描述

在这里插入图片描述

2.3.请求响应-请求-实体参数

实体参数

  • 简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可

    在这里插入图片描述

    在这里插入图片描述

    定义一个User对象类,添加get&set&toString方法

    在这里插入图片描述
    测试
    在这里插入图片描述

  • 复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。

    在这里插入图片描述
    定义一个User对象类,添加get&set&toString方法在这里插入图片描述
    定义一个Address类,添加get&set&toString方法在这里插入图片描述
    测试
    在这里插入图片描述

2.4.请求响应-请求-数组集合参数

数组集合参数

  • 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数

    在这里插入图片描述

    在这里插入图片描述

  • 集合参数:请求参数名与形参数组名称相同且请求参数为多个,@RequestParam 绑定参数关系

    在这里插入图片描述
    在这里插入图片描述

2.5.请求响应-请求-日期参数

日期参数

  • 日期参数:使用 @DateTimeFormat 注解完成日期参数格式转换

    在这里插入图片描述

    在这里插入图片描述

2.6.请求响应-请求-JSON参数

JSON参数

  • JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用 @RequestBody 标识

    在这里插入图片描述

    定义一个User对象类,添加get&set&toString方法

    在这里插入图片描述

    定义一个Address类,添加get&set&toString方法

    在这里插入图片描述

    测试

    在这里插入图片描述

2.7.请求响应-请求-路径参数

路径参数

  • 路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用 @PathVariable 获取路径参数

    单个路径参数

    在这里插入图片描述

    在这里插入图片描述

    多个路径参数

    在这里插入图片描述
    在这里插入图片描述

3.请求响应-响应

3.1.请求响应-响应-@ResponseBody

@ResponseBody

在这里插入图片描述

  • 类型:方法注解、类注解
  • 位置:Controller方法上/类上
  • 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
  • 说明:@RestController = @Controller + @ResponseBody

3.2.请求响应-响应-统一响应结果

统一响应结果

在这里插入图片描述
在这里插入图片描述

四、分层解耦

1.分层解耦-三层架构

三层架构

  • 三层架构:
    • ①Controller:接收请求、响应数据
    • ②Service:逻辑处理
    • ③Dao:数据访问
  • controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
  • service:业务逻辑层,处理具体的业务逻辑。
  • dao:数据访问层(Data Access Obiect)(持久层),负责数据访问操作,包括数据的增、删、改、查。

2.分层解耦-分层解耦(IOC-DI引入)

分层解耦

  • 内聚:软件中各个功能模块内部的功能联系。
  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
  • 软件设计原则:高内聚低耦合。
  • 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程席自身转移到外部(容器),这种思想称为控制反转。
  • 依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • Bean对象:IOC容器中创建、管理的对象,称之为bean

3.分层解耦-IOC&DI-IOC详解

Bean的声明

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

注解说明位置
@Component声明bean的基础注解不属于以下三类时,用此注解
@Controller@Component的衍生注解标注在控制器类上
@Service@Component的衍生注解标注在业务类上
@Repository@Component的衍生注解标注在数据访问类上(由于与mybatis整个,用的少)

注意事项

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
  • 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。

Bean组件扫描

  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  • @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SprinaBootApplication中,默认扫描的范围是启动类所在包及其子包。

4.分层解耦-IOC&DI-DI详解

Bean注入

  • @Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,讲会报出如下错误

    在这里插入图片描述

  • 通过以下几种方案来解决

    在这里插入图片描述

    • @Primary
      在这里插入图片描述

    • @Qualifier
      在这里插入图片描述

    • @Resource
      在这里插入图片描述

@Resource 与 @Autowired区别

  • @Autowired 是spring框架提供的注解、而@Resource是JDK提供的注解。
  • @Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。

五、MySQL

1.MySQL- 介绍

什么是数据库?

  • 数据库:DataBase(DB),是存储和管理数据的仓库。
  • 数据库管理系统:DataBase Management System(DBMS),操纵和管理数据库的大型软件。
  • SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。
数据库介绍
Oracle收费的大型数据库,Oracle公司的产品。
MySQL开源免费的中小型数据库。Sun公司收购了MySQL,Oracle收购Sun公司。
SQL ServerMicroSoft公司收费的中型的数据库。C#、.net等语言常使用。
PostgreSQL开源免费中小型的数据库。
DB2IBM公司的大型收费数据库产品。
SQLite嵌入式的微型数据库。如:作Android内置数据库
MariaDB开源免费的中小型的数据库。

2.MySQL-概述

2.1.MySQL-概述-安装配置

MySQL安装

  • 官网下载地址:https://dev.mysql.com/downloads/mysql/

  • 通过图形化(.msi 安装文件)安装MySQL教程参考:https://blog.csdn.net/weixin_44904239/article/details/130480731

  • 通过图形化(.msi 安装文件)安装MySQL的卸载教程参考:https://blog.csdn.net/weixin_44904239/article/details/111568476

  • 通过(.zip 压缩文件)安装及卸载MySQL教程参考:https://blog.csdn.net/weixin_44904239/article/details/131653062

  • 登录语法

    mysql -u用户名 -p密码 [-h数据库服务器IP地址 -p端口号]
    

    在这里插入图片描述
    SQL数据模型

  • 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。

    特点

    • 使用表存储数据,格式统一,便于维护。
    • 使用SQL语言操作,标准统一,使用方便,可用于复杂查询。

2.2.MySQL-概述-数据模型

MySQL数据模型

在这里插入图片描述

2.3.MySQL-概述-数据模型-SQL简介

SQL简介

  • SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。
  • 通用语法:
    • SQL语句可以当行或多行书写,以分号结尾。
    • SQL语句可以使用空格/缩进来增强语句的可读性。
    • MySQL数据库的SQL语句不区分大小写。
    • 注释:
      1.单行注释:-- 注释内容 或 # 注释内容(MySQL特有)
      2.多行注释:/* 注释内容 */

SQL分类

SQL语句通常被分为四大类:

分类全程说明
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Language数据查询语言,用来查询数据库中表的记录
DCLData Control Language数据控制语言,用来创建数据库用户、控制数据库的访问权限

3.MySQL-DDL

3.1.MySQL-DDL-数据库操作

DDL(数据库操作)

  • DDL 英文全称是Data Definition Language,数据定义语言,用来定义数据库对象(数据库、表)。

查询

  • 查询所有数据库

    show databases;
    

    在这里插入图片描述

  • 查询当前数据库

    select database();
    

    在这里插入图片描述

创建

  • 创建数据库

    create database [if not exists] 数据库名;
    

    在这里插入图片描述

    if not exists 可选项,表示数据库存在则不创建,不存在则创建

    在这里插入图片描述

使用

  • 使用数据库

    use 数据库名;
    

    在这里插入图片描述

删除

  • 删除数据库

    drop database [if exists] 数据库名;
    

    在这里插入图片描述
    if exists 可选项,表示数据库存在则删除,不存在则不用删除

    在这里插入图片描述

注意事项

上述语法中的database,也可以替换成 schema。如: create schema db01;

3.2.MySQL-DDL-图形化工具

图形化工具

  • 介绍:DataGrip是letBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostreSQL的理想解决方案。
  • 官网:https://www.jetbrains.com/zh-cn/datagrip/

我这直接使用IntelliJ IDEA操作数据库,IntelliJ IDEA集成了DataGrip

1.打开IntelliJ IDEA→点击DataBase

在这里插入图片描述

2.点击+号→Data Source→MySQL

在这里插入图片描述

3.输入用户名和密码→Test Connection(测试数据库连接)→测试连接成功点击OK

在这里插入图片描述

在这里插入图片描述

4.显示所有数据库

在这里插入图片描述

5.编写SQL语句操作数据库

在这里插入图片描述

6.关掉console标签页以后如何打开

在这里插入图片描述
在这里插入图片描述

3.3.MySQL-DDL-表结构操作-创建

创建

-- 语法
create table 表名(
	字段1 字段类型 [约束] [comment 字段1注释],
	......
	字段1 字段类型 [约束] [comment 字段1注释]
)[comment 表注释];
-- 创建用户表
create table user(
    id int comment 'id,唯一标识',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char(1) comment '性别'
) comment '用户表';

约束

  • 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
  • 目的:保证数据库中数据的正确性、有效性和完整性。
约束描述关键字
非空约束限制该字段值不能为nullnot null
唯一约束保证字段的所有数据都是唯一、不重复的unique
主键约束主键是一行数据的唯一标识,要求非空且唯一primary key(auto_increment自增)
默认约束保存数据时,如果未指定该字段值,则采用默认值default
外键约束让两张表的数据建立连接,保证数据的一致性和完整性foreign key
-- 创建用户表(添加约束)
create table user(
    id int primary key auto_increment comment 'id,唯一标识',
    username varchar(20) not null unique comment '用户名',
    name varchar(10) not null comment '姓名',
    age int comment '年龄',
    gender char(1) default '男' comment '性别'
) comment '用户表';

3.4.MySQL-DDL-表结构操作-数据类型

数据类型

  • MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。

数值类型

类型大小(byte)有符号(SIGNED)范围无符号(UNSIGNED)范围描述备注
tinyint1(-128,127)(0,255)小整数值
smallint2(-32768,32767)(0,65535)大整数值
mediumint3(-8388608,8388607)(0,16777215)大整数值
int4(-2147483648,2147483647)(0,4294967295)大整数值
bigint8(-263,263-1)(0,2^64-1)极大整数值
float4(-3.402823466 E+38,3.402823466351 E+38)0 和 (1.175494351 E-38,3.402823466 E+38)单精度浮点数值float(5,2):5表示整个数字长度,2 表示小数位个数
double8(-1.7976931348623157 E+308,1.7976931348623157 E+308)0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308)双精度浮点数值double(5,2):5表示整个数字长度,2 表示小数位个数
decimal小数值(精度更高)decimal(5,2):5表示整个数字长度,2 表示小数位个数

字符串类型

类型大小描述
char0-255 bytes定长字符串
varchar0-65535 bytes变长字符串
tinyblob0-255 bytes不超过255个字符的二进制数据
tinytext0-255 bytes短文本字符串
blob0-65 535 bytes二进制形式的长文本数据
text0-65 535 bytes长文本数据
mediumblob0-16 777 215 bytes二进制形式的中等长度文本数据
mediumtext0-16 777 215 bytes中等长度文本数据
longblob0-4 294 967 295 bytes二进制形式的极大文本数据
longtext0-4 294 967 295 bytes极大文本数据

日期类型

类型大小(byte)范围格式描述
date31000-01-01 至 9999-12-31YYYY-MM-DD日期值
time3-838:59:59 至 838:59:59HH:MM:SS时间值或持续时间
year11901 至 2155YYYY年份值
datetime81000-01-01 00:00:00 至 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
timestamp41970-01-01 00:00:01 至 2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS混合日期和时间值,时间戳

3.5.MySQL-DDL-表结构操作-查询&修改&删除

查询

  • 查询当前数据库所有表:

    show tables;
    
  • 查询表结构:

    desc 表名;
    
  • 查询建表语句:

    show create table 表名;
    

修改

  • 添加字段:

    alter table  表名 add 字段名 类型(长度) [comment 注释] [约束];
    
  • 修改字段类型:

    alter table 表名 modify 字段名 新数据类型(长度);
    
  • 修改字段名和字段类型:

    alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
    
  • 删除字段:

    alter table 表名 drop column 字段名;
    
  • 修改表名:

    rename table 表名 to 新表名;
    

删除

  • 删除表:

    drop table [if exists] 表名;
    
  • 注意事项

    在删除表时,表中的全部数据也会被删除。

4.MySQL-DML

DML

  • DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。

  • 添加数据(INSERT)

  • 修改数据((UPDATE))

  • 删除数据(DELETE)

4.1.MySQL-DML-添加数据(insert)

insert语法

  • 指定字段添加数据:

    insert into 表名 (字段名1,字段名2) values (1,2);
    
  • 全部字段添加数据:

    insert into 表名 values (1,2,...);
    
  • 批量添加数据(指定字段):

    insert into 表名 (字段名1,字段名2) values (1,2),(1,2);
    
  • 批量添加数据(全部字段):

    insert into 表名 values (1,2,...),(1,2,...);
    

注意事项

  1. 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
  2. 字符串和日期型数据应该包含在引号中。
  3. 插入的数据大小,应该在字段的规定范围内。

4.2.MySQL-DML-修改数据(update)

update语法

  • 修改数据:

    update 表名 set 字段名1=1,字段名2=2,... [where 条件];
    

注意事项

修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。

4.3.MySQL-DML-删除数据(delete)

delete语法

  • 删除数据:

    delete from 表名 [where 条件];
    

注意事项

  1. DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
  2. DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。

5.MySQL-DQL

DQL

  • DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。

  • 关键字:SELECT

  • 语法

    select
        字段列表
    from
        表名列表
    where
        条件列表
    group by
        分组字段列表
    having
        分组后条件列表
    order by
        排序字段列表
    limit
        分页参数
    

在这里插入图片描述

5.1.MySQL-DQL-基本查询

DQL-基本查询

  • 查询多个字段:

    select 字段1,字段2,字段3 from 表名;
    
  • 查询所有字段(通配符):

    select * from 表名;
    
  • 设置别名:

    select 字段1 [as 别名1],字段2 [别名2] from 表名;
    
  • 去除重复记录:

    select distinct 字段列表 from 表名;
    

注意事项

* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。

5.2.MySQL-DQL-条件查询

DQL-条件查询

  • 条件查询

    select 字段列表 from 表名 where 条件列表;
    
比较运算符功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
between … and …在某个范围之内(含最小、最大值)
in(…)在in之后的列表中的值,多选一
like 占位符模糊匹配(_匹配单个字符,%匹配任意个字符)
is null是null
逻辑运算符功能
and huo &&并且(多个条件同时成立)
or 或 ||或者(多个条件任意一个成立)
not 或 !非,不是

5.3.MySQL-DQL-聚合函数

聚合函数

  • 介绍:将一列数据作为一个整体,进行纵向计算。

  • 语法:

    select 聚合函数(字段列表) from 表名;
    
函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和

注意事项

  1. null值不参与所有聚合函数运算。
  2. 统计数量可以使用:count(*) count(字段) count(常量),推荐使用count(*)。

5.4.MySQL-DQL-分组查询

DQL-分组查询

  • 分组查询:

    select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
    
  • where与having区别

    1. 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
    2. 判断条件不同:where不能对聚合函数进行判断,而having可以。

注意事项

  1. 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  2. 执行顺序:where > 聚合函数 > having 。

5.5.MySQL-DQL-排序查询

DQL-排序查询

  • 排序查询

    select 字段列表 from 表名 [where 条件列表] [group by 分组字段名] order by 字段1 排序方式1,字段2 排序方式2 ...;
    
  • 排序方式

    1.ASC:升序(默认值)
    2.DESC:降序

注意事项

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

5.6.MySQL-DQL-分页查询

DQL-分页查询

  • 分页查询

    select 字段列表 from 表名 limit 起始索引,查询记录数;
    

注意事项

  1. 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数。
  2. 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
  3. 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。

函数

  • if(表达式,tvalue,fvalue):当表达式为true时,取值tvalue;当表达式为false时,取值fvalue

    if(表达式,tvalue,fvalue)
    
  • case expr when value1 then result1 [when value2 then value2 ...] [else resultl] end

    case expr when value1 then result1 [when value2 then value2 ...] [else resultl] end
    

6.MySQL-多表设计

多表设计-概述

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一)
  • 多对多
  • 一对一

6.1.MySQL-多表设计-一对多

一对多

  • 案例:部门 与 员工的关系
  • 关系:一个部门有多个员工,一个员工只所在一个部门中。
  • 实现:在多的一方添加外键,关联另一方的主键。

6.2.MySQL-多表设计-一对多-外键

外键

  • 外键:保证数据的一致性和完整性。

外键语法

  • 创建表时指定

    create table 表名(
        字段名 数据类型,
        ...
        [constraint] [外键名称] foreign key (外键字段名) references 主表(字段名)
    
    );
    
  • 建完表后,添加外键

    alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(字段名);
    

外键约束

物理外键

  • 概念:使用foreign key 定义外键关联另外一张表。
  • 缺点:
    • 影响增、删、改的效率(需要检查外键关系)。
    • 仅用于单节点数据库,不适用与分布式、集群场景。
    • 容易引发数据库的死锁问题,消耗性能。

逻辑外键

  • 概念:在业务层逻辑中,解决外键关联。
  • 通过逻辑外键,就可以很方便的解决上述问题。

6.3.MySQL-多表设计-一对一

一对一

  • 案例:用户 与 身份证信息 的关系
  • 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率
  • 实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

6.4.MySQL-多表设计-多对多

多对多

  • 案例:学生 与 课程的关系
  • 关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
  • 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

7.MySQL-多表查询

7.1.MySQL-多表查询-概述

多表查询-概述-介绍

  • 多表查询:指从多张表中查询数据

    select 字段列表 from1,2;
    
  • 笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合 和 B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)

多表查询-概述-分类

  • 连接查询

    • 内连接:相当于A、B交集部分数据
    • 外连接
      • 左外连接:查询左表所有数据(包括两张表交集部分数据)
      • 右外连接:查询右表所有数据(包括两张表交集部分数据)
  • 子查询

7.2.MySQL-多表查询-内连接

内连接

  • 隐式内连接:

    select 字段列表 from1,2 where 条件...;
    
  • 显式内连接

    select 字段列表 from1 [inner] join2 on 连接条件...;
    

7.3.MySQL-多表查询-外连接

外连接

  • 左外连接

    select 字段列表 from1 left [outer] join2 on 连接条件...;
    
  • 右外连接

    select 字段列表 from1 right [outer] join2 on 连接条件...;
    

7.4.MySQL-多表查询-子查询-概述&分类

子查询-概述

  • 介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。

  • 形式:

    select * from1 where column1 = (select column1 from2 ...);
    
  • 子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select。

子查询-分类

  • 标量子查询:子查询返回的结果为单个值
  • 列子查询:子查询返回的结果为一列
  • 行子查询:子查询返回的结果为一行
  • 表子查询:子查询返回的结果为多行多列

7.5.MySQL-多表查询-子查询-标量子查询&列子查询

标量子查询

  • 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
  • 常用的操作符:= 、 <> 、 > 、 >= 、 < 、 <=

列子查询

  • 子查询返回的结果是一列(可以是多行)
  • 常用的操作符:in 、not in等

7.6.MySQL-多表查询-子查询-行子查询&表子查询

行子查询

  • 子查询返回的结果是一行(可以是多列)。
  • 常用的操作符:= 、<> 、in 、not in

表子查询

  • 子查询返回的结果是多行多列,常作为临时表
  • 常用的操作符:in

8.MySQL-事务

8.1.MySQL-事务-介绍

介绍

  • 概念:事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。

注意事项

  • 默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

8.2.MySQL-事务-操作

操作

  • 开启事务:

    start transaction;/begin;
    
  • 提交事务:

    commit;
    
  • 回滚事务:

    rollback;
    

8.3.MySQL-事务-四大特性

四大特性(ACID)

  • 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,他对数据库中的数据的改变就是永久的。

9.MySQL-索引

9.1.MySQL-索引-介绍

介绍

  • 索引(index)是帮助数据库高效获取数据的数据结构。

在这里插入图片描述

  • 优缺点:
    • 优点
      • 提高数据查询的效率,降低数据库的IO成本。
      • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。
    • 缺点
      • 索引会占用存储空间。
      • 索引大大提高了查询效率,同时也降低了insert、update、delete的效率。

9.2.MySQL-索引-结构

结构

  • MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的
    B+Tree 结构组织的索引。
  • B+Tree(多路平衡搜索树)

在这里插入图片描述

9.3.MySQL-索引-操作语法

操作语法

  • 创建索引

    create [unique] index 索引名 on 表名(字段名,...);
    
  • 查看索引

    show index from 表名;
    
  • 删除索引

    drop index 索引名 on 表名;
    

注意事项

  • 主键字段,在建表时,会自动创建主键索引。
  • 添加唯一约束时,数据库实际上会添加唯一索引。

五、Mybatis

1.Mybatis-入门

1.1.Mybatis-入门-介绍

什么是Mybatis?

  • Mybatis是一款优秀的持久层框架,用于简化JDBC的开发。
  • Mybatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

1.2.Mybatis-入门-快速入门程序

快速入门程序

使用Mybatis查询所有用户数据

一、准备工作(创建springboot工程、数据库表user、实体类User)

1.打开IDEA创建一个springboot工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.创建user表及插入数据

#创建用户表user
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 '用户表';

#向user表中添加数据
insert into user(id, name, age, gender, phone) VALUES (null,'张三',18,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'李四',20,'2','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'王五',25,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'赵六',19,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'麻子',21,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'赢七',24,'1','18800000005');

3.创建实体类User,添加有参构造、无参构造、get方法、set方法、toString()

在这里插入图片描述

二、引入Mybatis的相关依赖,配置Mybatis

1.创建springboot项目的时候已经引入了Mybatis的相关依赖

2.配置Mybatis中的application.properties配置文件

#配置数据库的连接信息—四要素
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url(db01代表是db01数据库)
spring.datasource.url=jdbc:mysql://localhost:3306/db01
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root

在这里插入图片描述

三、编写SQL语句(注解/XML)

1.创建一个UserMapper接口,通过注解的方式编写SQL语句
在这里插入图片描述
在这里插入图片描述

四、运行程序测试

在这里插入图片描述

在这里插入图片描述

1.3.Mybatis-入门-配置SQL提示

配置SQL提示

  • 默认在mybatis中编写SQL语句是不识别的。可以做如下配置:

    1.选中编写的SQL语句→按住Alt+Enter→选择 Inject language or reference

    在这里插入图片描述

    2.选择MySQL(然后重新编写SQL语句就会有提示)

    在这里插入图片描述

  • 如果表名没有提示

    • 产生原因:ldea和数据库没有建立连接,不识别表信息
    • 解决方式:在ldea中配置MySQL数据库连接

在这里插入图片描述
在这里插入图片描述

1.4.Mybatis-入门-JDBC

JDBC

  • JDBC:(Java DataBase Connectivity),就是使用java语言操作关系型数据库的一套API。

    在这里插入图片描述

本质

  • sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
  • 各个数据库厂商去实现这套接口,提供数据库驱动iar包。
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

在这里插入图片描述

1.5.Mybatis-入门-数据库连接池

数据库连接池

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏

数据库连接池优势

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

标准接口:DataSource

  • 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。

  • 功能:获取连接

    Connection getConnection() throws SQLExeption;
    
  • 常见产品:C3P0、DBCP、Druid、Hikari(springboot默认)

    在这里插入图片描述

  • Druid(德鲁伊)

    • Druid连接池是阿里巴巴开源的数据库连接池项目
    • 功能强大,性能优秀,是Java语言最好的数据库连接池之一
  • 切换Druid数据库连接池

    • 官方地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
      在这里插入图片描述

    • pom.xml配置文件引入依赖

      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid-spring-boot-starter</artifactId>
          <version>1.1.17</version>
      </dependency>
      
  • 运行项目测试发现以换成druid了连接池

    在这里插入图片描述

1.6.Mybatis-入门-lombok工具包介绍

lombok

  • Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发,提高效率。

    注解作用
    @Getter/@Setter为所有的属性提供get/set方法
    @ToString会给类自动生成易阅读的toString 方法
    @EqualsAndHashCode根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法
    @Data提供了更综合的生成代码功能(@Getter + @Setter + @ToString +@EqualsAndHashCode)
    @NoArgsConstructor为实体类生成无参的构造器方法
    @AllArgsConstructor为实体类生成除了static修饰的字段之外带有各参数的构造器方法
  • pom.xml配置文件引入依赖

    <dependency>
    	<groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    

在这里插入图片描述

注意事项

  • Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件

2.Mybatis-基础操作

2.1Mybatis-基础操作-环境准备

  1. 准备数据库表emp

    #创建部门表
    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, 'zhangsan', '123456', '张三', 1, '1.jpg', 4, '2000-01-01', 2, now(), now()),
           (2, 'lisi', '123456', '李四', 1, '2.jpg', 2, '2015-01-01', 2, now(), now()),
           (3, 'wangwu', '123456', '王五', 1, '3.jpg', 2, '2008-05-01', 2, now(), now()),
           (4, 'zhaoliu', '123456', '赵六', 1, '4.jpg', 2, '2007-01-01', 2, now(), now()),
           (5, 'mazi', '123456', '麻子', 1, '5.jpg', 2, '2012-12-05', 2, now(), now()),
           (6, 'damimi', '123456', '大幂幂', 2, '6.jpg', 3, '2013-09-05', 1, now(), now()),
           (7, 'guijianchou', '123456', '鬼见愁', 2, '7.jpg', 1, '2005-08-01', 1, now(), now()),
           (8, 'yushen', '123456', '雨神', 2, '8.jpg', 1, '2014-11-09', 1, now(), now()),
           (9, 'fanbingbing', '123456', '范冰冰', 2, '9.jpg', 1, '2011-03-11', 1, now(), now()),
           (10, 'maoqiu', '123456', '毛球', 2, '10.jpg', 1, '2013-09-05', 1, now(), now()),
           (11, 'luofeng', '123456', '罗峰', 1, '11.jpg', 5, '2007-02-01', 3, now(), now()),
           (12, 'mahongjun', '123456', '马红俊', 1, '12.jpg', 5, '2008-08-18', 3, now(), now()),
           (13, 'daimubai', '123456', '戴沐白', 1, '13.jpg', 5, '2012-11-01', 3, now(), now()),
           (14, 'ningrongrong', '123456', '宁荣荣', 1, '14.jpg', 2, '2002-08-01', 2, now(), now()),
           (15, 'tangsan', '123456', '唐三', 1, '15.jpg', 2, '2011-05-01', 2, now(), now()),
           (16, 'bibidong', '123456', '比比东', 1, '16.jpg', 2, '2010-01-01', 2, now(), now()),
           (17, 'tangchen', '123456', '唐晨', 1, '17.jpg', NULL, '2015-03-21', NULL, now(), now());
    
  2. 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)

    参考前面Mybatis入门程序进行创建springboot工程

  3. application.properties中引入数据库连接信息

    #配置数据库的连接信息—四要素
    #驱动类名称
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    #数据库连接的url(db01代表是db01数据库)
    spring.datasource.url=jdbc:mysql://localhost:3306/db01
    #连接数据库的用户名
    spring.datasource.username=root
    #连接数据库的密码
    spring.datasource.password=root
    
  4. 创建对应的实体类Emp(实体类属性采用驼峰命名)
    在这里插入图片描述

  5. 准备Mapper接口EmpMapper
    在这里插入图片描述

2.2Mybatis-基础操作-删除

根据主键删除

在这里插入图片描述
在这里插入图片描述

运行程序,查看数据库emp表中对应id的数据是否被删除

注意事项

  • 如果mapper接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,如:#id、#valuel。

,#…里面的属性名可以随便写,如: #id、#valuel。

2.3Mybatis-基础操作-删除(预编译SQL)

日志输出

  • 可以在application.properties文件中,打开mybatis的日志,并指定输出到控制台。

    #指定mybatis输出日志的位置,输出到控制台
    mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    

    在这里插入图片描述

预编译SQL优势

  • 性能更高
  • 更安全(防止SQL注入)

SQL注入

  • SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

参数占位符

  • #{...}
    • 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值。
    • 使用时机:参数传递,都使用#{…}
  • ${...}
    • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
    • 使用时机:如果对表名、列表进行动态设置时使用。

2.4Mybatis-基础操作-新增

新增

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行测试程序,查看数据库emp表中是否新增了数据

2.5Mybatis-基础操作-新增(主键返回)

新增(主键返回)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6Mybatis-基础操作-更新

更新

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行测试程序,查看数据库emp表中数据是否修改了

2.7Mybatis-基础操作-查询(根据ID查询)

查询(根据ID查询)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据封装

Emp(id=19, username=huoyuhao2, password=123456, name=霍雨浩2, gender=1, image=2.jpg, job=1, entrydate=2001-01-01, deptId=null, createTime=null, updateTime=null)

deptId=null, createTime=null, updateTime=null这三个字段为什么为null?

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
  • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。

在这里插入图片描述

解决方案一:给字段起别名,让别名与实体类属性一致

在这里插入图片描述

解决方案二:通过@Results,@Result注解手动映射封装

在这里插入图片描述

解决方案三:开启mybatis的驼峰命名自动映射开关 a_column → aColumn

在这里插入图片描述
在这里插入图片描述

2.8Mybatis-基础操作-查询(条件查询)

查询(条件查询)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

由于根据name字段进行模糊查询,引号里面有占位符无法使用#{}预编译SQL,只能使用${}进行字符串拼接。会造成性能低、不安全、存在SQL注入问题。为了解决此问题可以使用SQL中的concat()函数进行字符串拼接。

在这里插入图片描述

在这里插入图片描述

3.Mybatis-XML映射文件

XML映射文件

  • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
  • XML映射文件的namespace属性为Mapper接口全限定名一致。
  • XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持返回类型一致。

1.resources目录下创建一个同包同名的xml文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.XML映射文件的namespace属性为Mapper接口全限定名一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiongjian.mapper.EmpMapper">

</mapper>

在这里插入图片描述

mybatis官网示例:https://mybatis.net.cn/getting-started.html

在这里插入图片描述
3.XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持返回类型一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiongjian.mapper.EmpMapper">
    <select id="list" resultType="com.xiongjian.pojo.Emp">
        select * from emp where name like concat('%',#{name},'%') and gender = #{gender}
        and entrydate between #{begin} and #{end} order by update_time desc
    </select>
</mapper>

在这里插入图片描述
在这里插入图片描述

启动程序测试

在这里插入图片描述

MybatisX插件

  • MybatisX插件是一款基于IDEA的快速开发Mybatis的插件,为效率而生。
  • 安装
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 使用:MybatisX插件安装以后会显示一个小鸟图标,点击小鸟可以切换到对应的接口和SQL语句
    在这里插入图片描述
    在这里插入图片描述

使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。

  • 官方说明: https://mybatis.net.cn/getting-started.html

在这里插入图片描述

4.Mybatis-动态SQL

动态SQL

随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL

4.1Mybatis-动态SQL-if

动态SQL-if

  • <if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
  • <where>:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。
<?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiongjian.mapper.EmpMapper">
	<!--resultType:单条记录所封装的类型-->
	<select id="list" resultType="com.xiongjian.pojo.Emp">
	    select * from emp where
	        <if test="name != null">
	          name like concat('%',#{name},'%')
	        </if>
	        <if test="gender != null">
	          and gender = #{gender}
	        </if>
	        <if test="begin != null and end != null">
	          and entrydate between #{begin} and #{end}
	        </if>
	    order by update_time desc
	</select>
</mapper>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改参数后继续启动测试程序进行测试,发现报错,原因是sql语句拼接结果where后面多了个and,解决方法如下,使用<where></where>标签包裹<if>标签

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2Mybatis-动态SQL-if-案例

动态SQL-if-案例
<set>: 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)

案例:动态更新员工内容

在这里插入图片描述
在这里插入图片描述

<!-- 动态更新员工信息 -->
<update id="update2">
    update emp
        <set>
            <if test="username != null">username = #{username},</if>
            <if test="name != null">name = #{name},</if>
            <if test="gender != null">gender = #{gender},</if>
            <if test="image != null">image = #{image},</if>
            <if test="job != null">job = #{job},</if>
            <if test="entrydate != null">entrydate = #{entrydate},</if>
            <if test="deptId != null">dept_id = #{deptId},</if>
            <if test="updateTime!= null">update_time = #{updateTime}</if>
        </set>
    where id = #{id}
</update>

在这里插入图片描述
在这里插入图片描述

4.3Mybatis-动态SQL-foreach

动态SQL-foreach

  • 属性
    • collection:集合名称
    • item:集合遍历出来的元素/项
    • separator:每一次遍历使用的分隔符
    • open:遍历开始前拼接的片段
    • close:遍历结束后拼接的片段

在这里插入图片描述
在这里插入图片描述

<!-- 批量删除员工信息 -->
<delete id="deleteByIds">
    delete from emp where id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
</delete>

在这里插入图片描述
在这里插入图片描述

4.4Mybatis-动态SQL-sql&include

动态SQL-sql&include

  • <sql>:定于可重用的SQL片段。
  • <include>:通过属性refid,指定包含的sql片段

在这里插入图片描述
在这里插入图片描述

	<sql id="comonSelect">
        select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time
        from emp
    </sql>
    <!--resultType:单条记录所封装的类型-->
    <select id="list" resultType="com.xiongjian.pojo.Emp">
        <include refid="comonSelect" />
            <where>
                <if test="name != null">
                  name like concat('%',#{name},'%')
                </if>
                <if test="gender != null">
                  and gender = #{gender}
                </if>
                <if test="begin != null and end != null">
                  and entrydate between #{begin} and #{end}
                </if>
            </where>
        order by update_time desc
    </select>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

此文档来源于网络,如有侵权,请联系删除!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/45422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

九五从零开始的运维之路(其二十五)

文章目录 前言一、概述二、配置环境及搭建服务1.关闭防火墙、网络图形化工具及SElinux2.配置yum源3.测试网络连通性4.分配磁盘容量5.安装targetcli包6.服务器端进行配置7.客户端 总结 前言 本篇将简述的内容&#xff1a;Linux系统下的ISCSI服务 一、概述 iscsi全称&#xff1…

笔试题:统计字符串中某字符串在其出现的字符个数

笔试题&#xff1a;统计字符串中某一子串的字符个数&#xff1a;例如字符串aabbcd,有aabb:4,ab:2 哈哈&#xff0c;这道题是小编面试音视频龙头企业的笔试题&#xff0c;以下是我写的代码&#xff1a;如果有错误&#xff0c;希望可以指正!!! 解题思路&#xff1a;利用双指针i和…

synchronized 关键字

目录 背景过程历史概念实际应用方法1&#xff1a;放方法名前形成同步方法&#xff1b;方法2&#xff1a;使用同步块修改上面的例子&#xff1b; 应用方法锁住对象&#xff1a;锁住类&#xff1a; 总结 背景 学习并发&#xff0c;为解决并发带来的问题&#xff0c;引入synchron…

React Dva项目中模仿网络请求数据方法

我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…

ES6 (js)

学习了很多vue的视频&#xff0c;还有nuxt的&#xff0c;还是不会。 还是要学ES6 本文的大部分出自小马老师的资料&#xff0c;还有曾大佬的文章 变量&#xff08;Let 和 const&#xff09; 在es6中&#xff0c;多用let 和const 来声明变量类型。因为var 会提前声明&#xff0…

flink cdc环境搭建

1.下载flink https://archive.apache.org/dist/flink/flink-1.12.2/ 2.修改flink-conf.yaml #根据自己电脑核数修改&#xff0c;这里我设置为4&#xff0c;因为系统分配了4核 jobmanager.rpc.address: localhost #主机名根据自己设定 taskmanager.numberOfTaskSlots: 4 3.下载…

mysql进阶2——prosysql实现mysql读写分离

文章目录 一、读写分离方案类型1.1 最简单的读写分离1.2 多个读组或写组的分离模式 二、案例2.1 初始化操作2.2 mysql主添加proxysql连接用户2.3 Proxysql添加连接mysql集群参数2.4 添加健康检测用户2.5 添加读写分离的路由规则2.6 验证 一、读写分离方案类型 基本了解&#xf…

【uniapp】更改富文本编辑器图片大小

代码块 //<view v-html"productDetails"></view><rich-text :nodes"productDetails"></rich-text>// 假设htmlContent字段是后台返回的富文本字段var htmlContent res.result.productDetailsconst regex new RegExp(<img, gi…

STM32MP157驱动开发——按键驱动(休眠与唤醒)

文章目录 “休眠-唤醒”机制&#xff1a;APP执行过程内核函数休眠函数唤醒函数 休眠与唤醒方式的按键驱动程序(stm32mp157)驱动程序框架button_test.cgpio_key_drv.cMakefile修改设备树文件编译测试 “休眠-唤醒”机制&#xff1a; 当应用程序必须等待某个事件发生&#xff0c…

爬虫001_Pip指令使用_包管理工具_pip的使用_和源的切换---python工作笔记019

scrapy是一个爬虫的框架 确认一下pip这个python中的包管理工具是否已经安装好了 python的环境变量配置完了以后,还需要配置一下pip的环境变量 把这个目录配置好,这个pip的环境变量的配置很简单不多说了. 我们用pip安装一下包,我们安装到上面这个路径里面,就是python的安装路…

Qt - .ui 文件的使用

文章目录 目录工具栏Dock Widget代码控制 ui添加资源添加文件 目录 子目录只能输入英文&#xff0c;想要显示中文&#xff0c;可以修改右下方表中的 text 属性&#xff1a; 工具栏 让工具栏共用 菜单栏的 new 和 open&#xff0c;只需将下方列表的控件&#xff0c;拖拽到工具栏…

【RS】基于规则的面向对象分类

ENVI使用最多的工具就是分类&#xff0c;这也是很多卫星影像的用途。在ENVI中有很多分类工具&#xff0c;如最基础的监督分类&#xff08;最大似然法、最小距离、支持向量机、随机森林&#xff09;、非监督分类&#xff08;K-means、IsoData&#xff09;&#xff0c;还有面向对…

安卓开发后台应用周期循环获取位置信息上报服务器

问题背景 最近有需求&#xff0c;在APP启动后&#xff0c;退到后台&#xff0c;还要能实现周期获取位置信息上报服务器&#xff0c;研究了一下实现方案。 问题分析 一、APP退到后台后网络请求实现 APP退到后台后&#xff0c;实现周期循环发送网络请求。目前尝试了两种方案是…

随笔--更改已经启动中的容器的配置文件

文章目录 docker 容器的配置信息地址修改文件映射 docker 容器的配置信息地址 # 一般在 sudo su cd /cd /var/lib/docker/containers/{容器id}/ # 查看容器的id,CONTAINER ID就是容器id的前部分 docker ps修改文件映射 进入容器的配置文件位置一般包含这些文件 # 先stop容器…

Docker--harbor私有仓库部署与管理

目录 一、构建私有库 1.下载 registry 镜像 2.在 daemon.json 文件中添加私有镜像仓库地址 3.运行 registry 容器 4.为镜像打标签 5.上传到私有仓库 6.列出私有仓库的所有镜像 7.列出私有仓库的centos镜像有哪些tag 8.测试私有仓库下载 二、Harbor 简介 1.什么是Harb…

iOS--属性关键字

定义 chat&#xff1a; 在iOS开发中&#xff0c;属性关键字是用于声明类的属性&#xff08;实例变量&#xff09;的修饰符。属性关键字可以影响属性的访问权限、内存管理和生成相关的getter和setter方法。 属性关键字有哪些&#xff1f; 分类属性关键字原子性atomic、nonato…

Spring MVC-基础概念(定义+创建和连接+@RequestMappring的描述)

目录 1.什么是Spring MVC&#xff1f; 2. MVC 和 Spring MVC 的关系 3.Spring MVC 项目创建 4. RequestMappring实现用户和程序的映射 4.1 RequestMappring 注解解释 4.2 方法1: RequestMapping(“/xxx”) 4.4 RequestMapping(method xxxx, value “xxx”) 是POST/GET…

协作实现时序数据高效流转链路 | 7.20 IoTDB X RocketMQ 技术沙龙线上直播回顾

7 月 20 日&#xff0c;IoTDB X RocketMQ 技术沙龙线上直播圆满结束。工业物联网时序数据库研发商天谋科技、云原生事件流平台 Apache RocketMQ 社区的四位技术专家&#xff0c;针对实时数据接入、多样数据处理与系统的高扩展、高可靠特性的数据流转处理平台实现难点&#xff0…

Java日志框架JUL、Log4j、logback、log4j2使用

随着软件系统的发展系统业务越来越多、逻辑越来越复杂、代码量越来越多&#xff0c;伴随着容易出现的bug也会越来越多&#xff0c;不论是开发测试阶段还是生产阶段都需要将这些错误及时的捕捉记录下来&#xff0c;方便解决这些问题&#xff0c;否则针对出现的异常无从下手&…

【三维点云处理】顶点、面片、邻接矩阵、邻接距离矩阵以及稀疏存储概念

文章目录 vts和faces基础知识vertices-节点&#xff08;3是点的三维坐标&#xff09;faces-面片&#xff08;3是构成三角形面片的3个点&#xff09; 邻接矩阵邻接距离矩阵&#xff08;NN500&#xff09;稀疏矩阵 vts和faces基础知识 vertices-节点&#xff08;3是点的三维坐标…