此文档来源于网络,如有侵权,请联系删除!
什么是Maven
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。
Apache
Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
开源项目:https://www.apache.org/index.html#projects-list
Maven的作用
Maven介绍
Maven下载
Maven安装
配置本地仓库:修改conf/settings.xml配置文件中的
#创建一个名为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配置文件中的
<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
配置Maven环境(当前工程)
创建一个名为web_project的项目
配置项目需要使用的JDK版本
此处我使用的是JDK11版本,自己安装了JDK版本选择不了就点击旁边的New添加自己安装的JDK版本
配置Maven环境
设置IDEA使用本地安装的 Maven,并修改配置文件及本地仓库路径
配置Maven环境(全局)
创建Maven项目
中途出现了报错,下面是解决方法
报错:
Unable to import maven project: See logs for details
无法导入maven项目:请参阅日志了解详细信息
查看日志:Help→Show Log in Explorer
日志错误信息
原因:
IDEA与Maven版本不兼容所致
解决方法(跟换Maven安装包——重新配置Maven——重新加载项目)
重新加载项目
Maven坐标
导入Maven项目
方式一:
1.选择右侧Maven面板,点击 + 号
2.选中对应项目的pom.xml文件
方式二:
1.File→Project Structure
依赖配置
注意事项
依赖传递
依赖范围
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
生命周期
Maven的生命周期就是为了对所有的Maven项目构建过程进行抽象和统一。
每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。
生命周期阶段
clean
:移除上一次构建生成的文件compile
:编译项目源代码test
:使用合适的单元测试框架运行测试(junit)package
:将编译后的文件打包,如:jar、war等install
:安装项目到本地仓库注意事项:
在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。
执行指定生命周期的两种方式:
mvn clean
mvn compile
mvn package
mvn test
...
Spring
SpringBoot
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,并添加注解。
③.运行测试
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 | 请求主体的大小(单位:字节) |
响应协议
响应状态码 | 含义 |
---|---|
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 |
Web服务器
Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”。
Tomcat
Tomcat-基本使用
下载:官网下载,地址:https://tomcat.apache.org/download-90.cgi
安装:绿色版,直接解压即可
卸载:直接删除目录即可
启动:双击:bin\startup.bat
关闭:
浏览器访问:http://localhost:8080/
常见问题
双击启动窗口一闪而过:检查JAVA_HOME环境变量是否正常配置
修改Tomcat的端口号
注意事项
HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。
Tomcat项目部署
将项目放置到webapps目录下,即部署完成
请求响应:
postman
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
作用:常用于进行接口测试
安装:双击下载好的安装包会自己安装
注册:需要连接网络
登录
创建工作空间
请求测试
请求保存
简单参数
原始方式
在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。
SpringBoot方式
简单参数:参数名与形参变量名相同,定义形参即可接收参数。
get方式请求
post方式请求
实体参数
简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可
定义一个User对象类,添加get&set&toString方法
复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。
定义一个User对象类,添加get&set&toString方法
定义一个Address类,添加get&set&toString方法
测试
数组集合参数
日期参数
JSON参数
JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用 @RequestBody
标识
定义一个User对象类,添加get&set&toString方法
定义一个Address类,添加get&set&toString方法
测试
路径参数
@ResponseBody
统一响应结果
三层架构
分层解耦
IOC
。对象的创建控制权由程席自身转移到外部(容器),这种思想称为控制反转。DI
。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。bean
。Bean的声明
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
注解 | 说明 | 位置 |
---|---|---|
@Component | 声明bean的基础注解 | 不属于以下三类时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整个,用的少) |
注意事项
Bean组件扫描
Bean注入
@Resource 与 @Autowired区别
什么是数据库?
数据库 | 介绍 |
---|---|
Oracle | 收费的大型数据库,Oracle公司的产品。 |
MySQL | 开源免费的中小型数据库。Sun公司收购了MySQL,Oracle收购Sun公司。 |
SQL Server | MicroSoft公司收费的中型的数据库。C#、.net等语言常使用。 |
PostgreSQL | 开源免费中小型的数据库。 |
DB2 | IBM公司的大型收费数据库产品。 |
SQLite | 嵌入式的微型数据库。如:作Android内置数据库 |
MariaDB | 开源免费的中小型的数据库。 |
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端口号]
关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点
MySQL数据模型
SQL简介
SQL分类
SQL语句通常被分为四大类:
分类 | 全程 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
DDL(数据库操作)
查询
创建
使用
删除
注意事项
上述语法中的database,也可以替换成 schema。如: create schema db01;
图形化工具
我这直接使用IntelliJ IDEA操作数据库,IntelliJ IDEA集成了DataGrip
1.打开IntelliJ IDEA→点击DataBase
2.点击+号→Data Source→MySQL
3.输入用户名和密码→Test Connection(测试数据库连接)→测试连接成功点击OK
4.显示所有数据库
5.编写SQL语句操作数据库
6.关掉console标签页以后如何打开
创建
-- 语法
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 '用户表';
数据类型
数值类型
类型 | 大小(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 | 混合日期和时间值,时间戳 |
查询
查询当前数据库所有表:
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] 表名;
注意事项
在删除表时,表中的全部数据也会被删除。
DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
添加数据(INSERT
)
修改数据((UPDATE)
)
删除数据(DELETE
)
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,...);
注意事项
插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
字符串和日期型数据应该包含在引号中。
插入的数据大小,应该在字段的规定范围内。
update语法
修改数据:
update 表名 set 字段名1=值1,字段名2=值2,... [where 条件];
注意事项
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
delete语法
删除数据:
delete from 表名 [where 条件];
注意事项
DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。
DQL
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
关键字:SELECT
语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
DQL-基本查询
查询多个字段:
select 字段1,字段2,字段3 from 表名;
查询所有字段(通配符):
select * from 表名;
设置别名:
select 字段1 [as 别名1],字段2 [别名2] from 表名;
去除重复记录:
select distinct 字段列表 from 表名;
注意事项
* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
DQL-条件查询
条件查询
select 字段列表 from 表名 where 条件列表;
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between … and … | 在某个范围之内(含最小、最大值) |
in(…) | 在in之后的列表中的值,多选一 |
like 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
is null | 是null |
逻辑运算符 | 功能 |
---|---|
and huo && | 并且(多个条件同时成立) |
or 或 || | 或者(多个条件任意一个成立) |
not 或 ! | 非,不是 |
聚合函数
介绍:将一列数据作为一个整体,进行纵向计算。
语法:
select 聚合函数(字段列表) from 表名;
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
注意事项
null值不参与所有聚合函数运算。
统计数量可以使用:count(*) count(字段) count(常量),推荐使用count(*)。
DQL-分组查询
分组查询:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
where与having区别
where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
where不能对聚合函数进行判断,而having可以。
注意事项
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
执行顺序:where > 聚合函数 > having 。
DQL-排序查询
排序查询
select 字段列表 from 表名 [where 条件列表] [group by 分组字段名] order by 字段1 排序方式1,字段2 排序方式2 ...;
排序方式
1.ASC:升序(默认值)
2.DESC:降序
注意事项
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
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
多表设计-概述
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
一对多
在多的一方添加外键,关联另一方的主键。
外键
外键语法
创建表时指定
create table 表名(
字段名 数据类型,
...
[constraint] [外键名称] foreign key (外键字段名) references 主表(字段名)
);
建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(字段名);
外键约束
物理外键
逻辑外键
一对一
在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
多对多
建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
多表查询-概述-介绍
多表查询:指从多张表中查询数据
select 字段列表 from 表1,表2;
笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合 和 B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
多表查询-概述-分类
连接查询
子查询
内连接
隐式内连接:
select 字段列表 from 表1,表2 where 条件...;
显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
外连接
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 连接条件...;
右外连接
select 字段列表 from 表1 right [outer] join 表2 on 连接条件...;
子查询-概述
介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
形式:
select * from 表1 where column1 = (select column1 from 表2 ...);
子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select。
子查询-分类
标量子查询
列子查询
行子查询
表子查询
介绍
注意事项
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
操作
开启事务:
start transaction;/begin;
提交事务:
commit;
回滚事务:
rollback;
四大特性(ACID)
介绍
优点
:
缺点
:
结构
B+Tree
结构组织的索引。操作语法
创建索引
create [unique] index 索引名 on 表名(字段名,...);
查看索引
show index from 表名;
删除索引
drop index 索引名 on 表名;
注意事项
主键字段,在建表时,会自动创建主键索引。
添加唯一约束时,数据库实际上会添加唯一索引。
什么是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语句
四、运行程序测试
配置SQL提示
默认在mybatis中编写SQL语句是不识别的。可以做如下配置:
1.选中编写的SQL语句→按住Alt+Enter→选择 Inject language or reference
2.选择MySQL(然后重新编写SQL语句就会有提示)
如果表名没有提示
JDBC
本质
数据库连接池
数据库连接池优势
标准接口:DataSource
官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。
功能:获取连接
Connection getConnection() throws SQLExeption;
常见产品:C3P0、DBCP、Druid、Hikari(springboot默认)
Druid(德鲁伊)
切换Druid数据库连接池
运行项目测试发现以换成druid了连接池
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时,还需要安装一个lombok的插件
准备数据库表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表中对应id的数据是否被删除
注意事项
,#…里面的属性名可以随便写,如: #id、#valuel。
日志输出
可以在application.properties文件中,打开mybatis的日志,并指定输出到控制台。
#指定mybatis输出日志的位置,输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
预编译SQL优势
SQL注入
参数占位符
#{...}
${...}
新增
运行测试程序,查看数据库emp表中是否新增了数据
新增(主键返回)
更新
运行测试程序,查看数据库emp表中数据是否修改了
查询(根据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?
解决方案一:给字段起别名,让别名与实体类属性一致
解决方案二:通过@Results,@Result注解手动映射封装
解决方案三:开启mybatis的驼峰命名自动映射开关 a_column → aColumn
查询(条件查询)
由于根据name字段进行模糊查询,引号里面有占位符无法使用
#{}
预编译SQL,只能使用${}
进行字符串拼接。会造成性能低、不安全、存在SQL注入问题。
为了解决此问题可以使用SQL中的concat()
函数进行字符串拼接。
XML映射文件
(同包同名)
。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插件
使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。
动态SQL
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为
动态SQL
。
动态SQL-if
:
用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。:
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,解决方法如下,
使用
标签包裹 标签
动态SQL-if-案例
动态地在行首插入 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>
动态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>
动态SQL-sql&include
:
定于可重用的SQL片段。:
通过属性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>
此文档来源于网络,如有侵权,请联系删除!