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

文章目录

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

前言

一、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下载

Maven安装

  1. 将下载好的压缩包解压到无中文名的目录下

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

    javascript 复制代码
    #创建一个名为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>标签,为其添加如下子标签:

    javascript 复制代码
    <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是否安装配置完毕

    javascript 复制代码
    #能查看到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(默认) Y Y Y log4j
test - Y - junit
provided Y Y - servlet-api
runtime - Y Y jdbc驱动

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

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

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

每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

  • 生命周期阶段

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

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

  • 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。
  • 在命令行中,通过命令执行。
javascript 复制代码
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-入门程序解析

起步依赖


三、请求响应

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 Server MicroSoft公司收费的中型的数据库。C#、.net等语言常使用。
PostgreSQL 开源免费中小型的数据库。
DB2 IBM公司的大型收费数据库产品。
SQLite 嵌入式的微型数据库。如:作Android内置数据库
MariaDB 开源免费的中小型的数据库。

2.MySQL-概述

2.1.MySQL-概述-安装配置

MySQL安装

2.2.MySQL-概述-数据模型

MySQL数据模型

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

SQL简介

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

SQL分类

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

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

3.MySQL-DDL

3.1.MySQL-DDL-数据库操作

DDL(数据库操作)

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

查询

  • 查询所有数据库

    sql 复制代码
    show databases;
  • 查询当前数据库

    sql 复制代码
    select database();

创建

  • 创建数据库

    sql 复制代码
    create database [if not exists] 数据库名;

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

使用

  • 使用数据库

    sql 复制代码
    use 数据库名;

删除

  • 删除数据库

    sql 复制代码
    drop database [if exists] 数据库名;


    if exists 可选项,表示数据库存在则删除,不存在则不用删除

注意事项

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

3.2.MySQL-DDL-图形化工具

图形化工具

我这直接使用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-表结构操作-创建

创建

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

约束

  • 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
  • 目的:保证数据库中数据的正确性、有效性和完整性。
约束 描述 关键字
非空约束 限制该字段值不能为null not null
唯一约束 保证字段的所有数据都是唯一、不重复的 unique
主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key(auto_increment自增)
默认约束 保存数据时,如果未指定该字段值,则采用默认值 default
外键约束 让两张表的数据建立连接,保证数据的一致性和完整性 foreign key
sql 复制代码
-- 创建用户表(添加约束)
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)范围 描述 备注
tinyint 1 (-128,127) (0,255) 小整数值
smallint 2 (-32768,32767) (0,65535) 大整数值
mediumint 3 (-8388608,8388607) (0,16777215) 大整数值
int 4 (-2147483648,2147483647) (0,4294967295) 大整数值
bigint 8 (-263,263-1) (0,2^64-1) 极大整数值
float 4 (-3.402823466 E+38,3.402823466351 E+38) 0 和 (1.175494351 E-38,3.402823466 E+38) 单精度浮点数值 float(5,2):5表示整个数字长度,2 表示小数位个数
double 8 (-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 表示小数位个数

字符串类型

类型 大小 描述
char 0-255 bytes 定长字符串
varchar 0-65535 bytes 变长字符串
tinyblob 0-255 bytes 不超过255个字符的二进制数据
tinytext 0-255 bytes 短文本字符串
blob 0-65 535 bytes 二进制形式的长文本数据
text 0-65 535 bytes 长文本数据
mediumblob 0-16 777 215 bytes 二进制形式的中等长度文本数据
mediumtext 0-16 777 215 bytes 中等长度文本数据
longblob 0-4 294 967 295 bytes 二进制形式的极大文本数据
longtext 0-4 294 967 295 bytes 极大文本数据

日期类型

类型 大小(byte) 范围 格式 描述
date 3 1000-01-01 至 9999-12-31 YYYY-MM-DD 日期值
time 3 -838:59:59 至 838:59:59 HH:MM:SS 时间值或持续时间
year 1 1901 至 2155 YYYY 年份值
datetime 8 1000-01-01 00:00:00 至 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
timestamp 4 1970-01-01 00:00:01 至 2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

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

查询

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

    sql 复制代码
    show tables;
  • 查询表结构:

    sql 复制代码
    desc 表名;
  • 查询建表语句:

    sql 复制代码
    show create table 表名;

修改

  • 添加字段:

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

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

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

    sql 复制代码
    alter table 表名 drop column 字段名;
  • 修改表名:

    sql 复制代码
    rename table 表名 to 新表名;

删除

  • 删除表:

    sql 复制代码
    drop table [if exists] 表名;
  • 注意事项

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

4.MySQL-DML

DML

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

  • 添加数据(INSERT)

  • 修改数据((UPDATE))

  • 删除数据(DELETE)

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

insert语法

  • 指定字段添加数据:

    sql 复制代码
    insert into 表名 (字段名1,字段名2) values (值1,值2);
  • 全部字段添加数据:

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

    sql 复制代码
    insert into 表名 (字段名1,字段名2) values (值1,值2),(值1,值2);
  • 批量添加数据(全部字段):

    sql 复制代码
    insert into 表名 values (值1,值2,...),(值1,值2,...);

注意事项

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

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

update语法

  • 修改数据:

    sql 复制代码
    update 表名 set 字段名1=值1,字段名2=值2,... [where 条件];

注意事项

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

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

delete语法

  • 删除数据:

    sql 复制代码
    delete from 表名 [where 条件];

注意事项

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

5.MySQL-DQL

DQL

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

  • 关键字:SELECT

  • 语法

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

5.1.MySQL-DQL-基本查询

DQL-基本查询

  • 查询多个字段:

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

    sql 复制代码
    select * from 表名;
  • 设置别名:

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

    sql 复制代码
    select distinct 字段列表 from 表名;

注意事项

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

5.2.MySQL-DQL-条件查询

DQL-条件查询

  • 条件查询

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

5.3.MySQL-DQL-聚合函数

聚合函数

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

  • 语法:

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

注意事项

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

5.4.MySQL-DQL-分组查询

DQL-分组查询

  • 分组查询:

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

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

注意事项

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

5.5.MySQL-DQL-排序查询

DQL-排序查询

  • 排序查询

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

    1.ASC:升序(默认值)

    2.DESC:降序

注意事项

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

5.6.MySQL-DQL-分页查询

DQL-分页查询

  • 分页查询

    sql 复制代码
    select 字段列表 from 表名 limit 起始索引,查询记录数;

注意事项

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

函数

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

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

    sql 复制代码
    case expr when value1 then result1 [when value2 then value2 ...] [else resultl] end

6.MySQL-多表设计

多表设计-概述

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

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

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

一对多

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

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

外键

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

外键语法

  • 创建表时指定

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

    sql 复制代码
    alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(字段名);

外键约束

物理外键

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

逻辑外键

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

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

一对一

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

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

多对多

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

7.MySQL-多表查询

7.1.MySQL-多表查询-概述

多表查询-概述-介绍

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

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

多表查询-概述-分类

  • 连接查询

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

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

内连接

  • 隐式内连接:

    sql 复制代码
    select 字段列表 from 表1,表2 where 条件...;
  • 显式内连接

    sql 复制代码
    select 字段列表 from 表1 [inner] join 表2 on 连接条件...;

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

外连接

  • 左外连接

    sql 复制代码
    select 字段列表 from 表1 left [outer] join 表2 on 连接条件...;
  • 右外连接

    sql 复制代码
    select 字段列表 from 表1 right [outer] join 表2 on 连接条件...;

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

子查询-概述

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

  • 形式:

    sql 复制代码
    select * from 表1 where column1 = (select column1 from 表2 ...);
  • 子查询外部的语句可以是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-事务-操作

操作

  • 开启事务:

    sql 复制代码
    start transaction;/begin;
  • 提交事务:

    sql 复制代码
    commit;
  • 回滚事务:

    sql 复制代码
    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-索引-操作语法

操作语法

  • 创建索引

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

    sql 复制代码
    show index from 表名;
  • 删除索引

    sql 复制代码
    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表及插入数据

sql 复制代码
#创建用户表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配置文件

sql 复制代码
#配置数据库的连接信息---四要素
#驱动类名称
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)提供的数据库连接池接口,由第三方组织实现此接口。

  • 功能:获取连接

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

  • Druid(德鲁伊)

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

  • 运行项目测试发现以换成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配置文件引入依赖

    java 复制代码
    <dependency>
    	<groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

注意事项

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

2.Mybatis-基础操作

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

  1. 准备数据库表emp

    sql 复制代码
    #创建部门表
    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中引入数据库连接信息

    java 复制代码
    #配置数据库的连接信息---四要素
    #驱动类名称
    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的日志,并指定输出到控制台。

    java 复制代码
    #指定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查询)




数据封装

sql 复制代码
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接口全限定名一致

java 复制代码
<?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 接口中的方法名一致,并保持返回类型一致

java 复制代码
<?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来配置映射语句。

4.Mybatis-动态SQL

动态SQL

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

4.1Mybatis-动态SQL-if

动态SQL-if

  • <if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
  • <where>:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。
java 复制代码
<?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语句中)

案例:动态更新员工内容


java 复制代码
<!-- 动态更新员工信息 -->
<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:遍历结束后拼接的片段


java 复制代码
<!-- 批量删除员工信息 -->
<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片段


java 复制代码
	<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>


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

相关推荐
掘金-我是哪吒14 分钟前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪40 分钟前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm43 分钟前
spring事件使用
java·后端·spring
微风粼粼1 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄1 小时前
设计模式之中介者模式
java·设计模式·中介者模式
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温3 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2743 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba3 小时前
Maven
java·maven
张人玉3 小时前
C# 常量与变量
java·算法·c#