JavaWeb开发(后端Web开发【一】)
文章目录
此文档来源于网络,如有侵权,请联系删除!
前言
一、Maven
什么是Maven
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。
Apache
Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
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安装
-
将下载好的压缩包解压到无中文名的目录下
-
配置本地仓库:修改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>
-
配置阿里云私服:修改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
-
配置环境变量:MAVEN_HOME 为Maven的解压目录,并将其bin目录加入PATH环境变量
-
测试Mavem是否安装配置完毕
#能查看到Maven版本代表安装配置完毕(安装Maven需要依赖JDK,我这里安装的是jdk-11.0.15.1版本) mvn -v
2.IDEA集成Maven
2.1.IDEA集成Maven-配置Maven环境
配置Maven环境(当前工程)
-
创建一个名为web_project的项目
-
配置项目需要使用的JDK版本
此处我使用的是JDK11版本,自己安装了JDK版本选择不了就点击旁边的New添加自己安装的JDK版本
-
配置Maven环境
设置IDEA使用本地安装的 Maven,并修改配置文件及本地仓库路径
配置Maven环境(全局)
-
File→Close Project
2.2.IDEA集成Maven-创建Maven项目
创建Maven项目
-
创建模块,选择Maven
-
填写模块信息
-
编写 HelloWorld,并运行
中途出现了报错,下面是解决方法
报错:
Unable to import maven project: See logs for details
无法导入maven项目:请参阅日志了解详细信息
查看日志:Help→Show Log in Explorer
日志错误信息
原因:
IDEA与Maven版本不兼容所致
解决方法(跟换Maven安装包——重新配置Maven——重新加载项目)
重新加载项目
Maven坐标
- 什么是坐标?
- Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
- 使用坐标来定义项目或引入项目中需要的依赖。
- 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工具栏,选中对应的生命周期,双击执行。
- 在命令行中,通过命令执行。
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文件
- 控制台中文乱码:修改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插件。
-
作用:常用于进行接口测试
-
安装:双击下载好的安装包会自己安装
-
注册:需要连接网络
-
登录
-
创建工作空间
-
请求测试
-
请求保存
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安装
-
通过图形化(.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语句通常被分为四大类:
分类 | 全程 | 说明 |
---|---|---|
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,数据定义语言,用来定义数据库对象(数据库、表)。
查询
-
查询所有数据库
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 '用户表';
约束
- 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
- 目的:保证数据库中数据的正确性、有效性和完整性。
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段值不能为null | not 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)范围 | 描述 | 备注 |
---|---|---|---|---|---|
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-表结构操作-查询&修改&删除
查询
-
查询当前数据库所有表:
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,...);
注意事项
插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
字符串和日期型数据应该包含在引号中。
插入的数据大小,应该在字段的规定范围内。
4.2.MySQL-DML-修改数据(update)
update语法
-
修改数据:
update 表名 set 字段名1=值1,字段名2=值2,... [where 条件];
注意事项
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
4.3.MySQL-DML-删除数据(delete)
delete语法
-
删除数据:
delete from 表名 [where 条件];
注意事项
DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
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 | 求和 |
注意事项
null值不参与所有聚合函数运算。
统计数量可以使用:count(*) count(字段) count(常量),推荐使用count(*)。
5.4.MySQL-DQL-分组查询
DQL-分组查询
-
分组查询:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
-
where与having区别
- 执行时机不同:
where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:
where不能对聚合函数进行判断,而having可以。
- 执行时机不同:
注意事项
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
执行顺序: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 起始索引,查询记录数;
注意事项
起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数。
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
如果查询的是第一页数据,起始索引可以省略,直接简写为 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 字段列表 from 表1,表2;
-
笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合 和 B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
多表查询-概述-分类
-
连接查询
- 内连接:相当于A、B交集部分数据
- 外连接
- 左外连接:查询左表所有数据(包括两张表交集部分数据)
- 右外连接:查询右表所有数据(包括两张表交集部分数据)
-
子查询
7.2.MySQL-多表查询-内连接
内连接
-
隐式内连接:
select 字段列表 from 表1,表2 where 条件...;
-
显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
7.3.MySQL-多表查询-外连接
外连接
-
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 连接条件...;
-
右外连接
select 字段列表 from 表1 right [outer] join 表2 on 连接条件...;
7.4.MySQL-多表查询-子查询-概述&分类
子查询-概述
-
介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
-
形式:
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-事务-操作
操作
-
开启事务:
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-基础操作-环境准备
-
准备数据库表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());
-
创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)
参考前面Mybatis入门程序进行创建springboot工程
-
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
-
创建对应的实体类Emp(实体类属性采用驼峰命名)
-
准备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来配置映射语句。
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>
此文档来源于网络,如有侵权,请联系删除!
更多推荐
所有评论(0)