①: 方便快捷的项目管理以来的资源(jar包更新等),避免版本冲突问题
②: 提供标准、统一的项目结构、使项目能够在 eclipse、myeclipse、IDEA都能使用
③: 标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式
总而言之,我们需要Maven管理庞大的jar包、脱离IDE环境执行构建操作
清理: 删除上一次构建的结果,为下一次构建做好准备
编译: Java源程序编译成*.class字节码文件
测试: 运行提前准备好的测试程序
报告: 针对刚才测试的结果生成一个全面的信息
打包:
(1): Java工程: jar包
(2): Web工程: war包
安装: 把一个 Maven工程经过打包操作生成的 jar 包或 war 包存入Maven仓库
部署:
(1): 部署 jar 包: 把一个 jar 包部署到 Nexus 私服服务器上
(2): 部署war包: 借助相关 Maven 插件(例如 cargo), 将 war 包部署到 Tomcat 服务器上
如果A工程里面用到了B工程的类、接口、配置文件等等资源,那我们就可以说A以来B
依赖管理中要解决的具体问题:
(1): jar 包的下载: 使用 Maven 之后,iar 包会从规范的远程仓库下载到本地
(2): jar 包之间的依赖: 通过依赖的传递性自动完成
(3): jar 包之间的冲突: 通过对依赖的配置进行调整,让某些 jar 包不会被导入
着重关注Maven核心配置文件: conf/settings.xml
conf/settings.xml 当中,默认是注释的。仓库路径在C盘
命令符三问
java -version
echo %JAVA_HOME%
echo %PATH%
教程一堆不赘述、最后命令符mvn -v
验证
(1).向量说明
使用三个 向量
在 Maven的仓库
中唯一
的定位到一个 jar
包。
groupld: 公司或组织的 id.
artifactld: 一个项目或者是项目中的一个模块的 id.
version: 版本号
例如:
(2).坐标和仓库中 jar 包的存储路径之间对应关系
能够看到坐标一层层对应着路径、重点
Maven核心程序、Maven本地仓库、本地工作空间。三个目录并不是同一个
(1).含义
POM: 项目对象模型
DOM: 文档对象模型
它们都是模型化思想的具体体现
(2).对应配置文件
POM理念集中体现在 Maven 工程根目录下 pom.xml
配置文件中
主体程序指的是被测试的程序、同时也是将来在项目中真正要使用的程序
配置Maven: IDEA3.6.2及以上版本存在兼容性问题、为避免冲突、IDEA使用3.6.1
创建空项目: ctrl + shift + alt + s
新版本创建Maven方式!
target里面存放着我们程序的字节码文件!
依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖
配置:
(1). 在 pom.xml 中编写 < dependencies > 标签
(2). 在 < dependencies > 标签中 使用 < dependency > 引入坐标
(3). 定义坐标的 groupld,artifactld,version
(4). 点击刷新按钮,引入最新加入的坐标
<dependencies>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.3version>
dependency>
dependencies>
依赖项大全 : 依赖项仓库
引入完新的依赖项坐标、记得右上角重置标志点一下才能起作用
如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。
(这个过程会比较耗时,耐心等待)
排除依赖
排除依赖指主动断开以来的资源,被排除的资源无需指定版本
<dependency>
<exclusions>
<exclusion>
<groupId>junitgroupId>
<artifactId>junitartifactId>
exclusions>
exclusions>
dependency>
junit的位置可以写想取消依赖项名称
依赖的jar包,默认情况下,可以在任何地方使用。可以通过< scope >... scope >
设置其作用范围作用范围:
主程序范围有效。(main文件夹范围内)
测试程序范围有效。(test文件夹范围内)
是否参与打包运行。(package指令范围内)
<dependencies>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.3version>
<scope>testscope>
dependency>
dependencies>
Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。
Maven中有三套相互独立
的生命周期:
具体的生命周期有非常多的阶段、我们具体研究五个阶段:
clean 属于 clean 生命周期、 其余属于default 生命周期
同一套生命周期中、当运行后面的阶段时、前面的阶段都会运行
Spring Framework配置繁琐、市场流行和官方推荐都适用SpringBoot
简单的Springbootweb流程:
HTTP协议规定了浏览器和服务器之间数据传输的规则
(1). 基于TCP协议: 面向连接,安全
(2). 基于请求-响应模型的:一次请求对应一次响应
(3). HTTP协议是无状态的协议: 对于事务处理没有记忆能力。每次请求-响应都是独立的。
缺点: 多次请求间不能共享数据。
优点: 速度快
最基本的协议是在Java网络编程的时候手动写入
Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷主要功能是“提供网上信息浏览服务”。
Tomcat
一个轻量级的web服务器,支持servlet、jsp等少量javaEE规范
也被称为web容器、servlet容器。
两个问题注意一下: 端口占用、配置是否正确
Tomcat配置端口号:
项目部署: 将项目放置到webapps目录下,即部署完成
可以把postman当作是客户端或者是浏览器、在后端开发的时候用来测试代码
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
作用: 常用于进行接口测试
原始的方式、获取请求参数要通过HttpServletRequest方法
public class RequestController {
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
String name = request.getParameter("name");
String ageStr = request.getParameter("age");
int age = Integer.parseInt(ageStr);
System.out.println(name + ":" + age);
return "OK";
}
SpringBoot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name, Integer age){
System.out.println(name + ":" + age);
return "ok";
}
在springboot里面编写的获取请求参数名通常要跟post中的key一样、否则接收不到就是null
如果你希望springboot当中的参数名与postman当中不同也是可以的、需要用到 @RequestParam
@RequestParam
中的 required 属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,以将required属性设置为false
由于参数量大、属性多、所以可以在IDEA包装成一个实体类并封装、把所有的属性都存进去。切记要同名!
若类当中的属性还有实体类、可以采用以下方式:
规则: 请求参数名与形参对象属性名相同,即可直接通过POJO接收
数组参数: 请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
集合参数: 集合参数: 请求参数名与形参集合名称相同且请求参数为多个,@RequestParam
绑定参数关系
postman 请求参数和数组一样。
记得其中的内容用双引号标记
JSON参数: JSON数据键名
与形参对象属性名
相同,定义POJO类型形参即可接收参数,需要使用 @RequestBody
标识
类型: 方法注解、类注解
位置: Controller方法上/类上
作用: 将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为]SON格式响应
说明: @RestController = @Controller + @ResponseBody ;
在我们响应给前端数据的时候、是可以返回各种各样的数据的。
这样不便于开发管理、前端还需要花时间解析,效率很低。因此我们采用一套格式:
创建一个Result类,统一形式来返回结果
controller: 控制层,接收前端发送的请求,对请求进行处理,并响应数据。
service: 业务逻辑层,处理具体的业务逻辑。
dao: 数据访问层(Data Access object)(持久层),负责数据访问操作,包括数据的增、删、改、查。
内聚: 软件中各个功能模块内部的功能联系
耦合: 衡量软件中各个层/模块之间的依赖、关联的程度
软件设计原则: 高内聚低耦合
控制反转:
在要交给IOC容器管理的类上方
注释 @Component
该类就会变成IOC容器中的Bean
依赖注入:
在需要创建接口类型实例的语句上方
注释 @Autowired
IOC容器会提供该类型的Bean对象,并赋值给该变量
如果一个接口有几个方法、那该如何控制运行的时候具体走哪一个实例呢?
只需要把你想用的方法注释@Component交给IOC、不用的把注释给删了就可以
注:
(1). 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
(2). 使用以上四个注解都可以声bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller.
(1). 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
(2). @ComponentScan
注解虽然没有显式配置,但是实际上已经包含在
了启动类
声明注解 @SpringBootApplication
中,默认扫描的范围是启动类所在包及其子包。
@SpringBootApplication
: 默认扫描当前包及其子包
如果你要调用的Bean类不在同一个包下,就使用:
@ComponentScan
{(“要扫描的包,要扫描的包,还是要扫描的包…”)}
第4点中提到、如果一个接口只能有一个方法去交给IOC、如果是有两个方法必须有一个删掉或者注释掉。
这种情况有几种解决方案:
@Primary: 如果你在多个同类型的Bean类前都加了一样的注释、那么你可以再加一个Primary、哪个类加了Primary就代表要使用哪个类
@Autowired + @Qualifier: 主要是按照注解来进行注入
在Controller 类中变量前加入 Qualifier(“Bean类名”)
注意: 这里面填入Bean类名的时候默认是首字母小写的
(1). 准备工作(创建springboot工程、数据库表xxx、实体类xxx)
(2). 引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
(3). 先配置好你的sql
(4). 创建springboot项目
(5). 根据自身情况配置好resources
# 配置数据库的连接信息
# 在resources文件下的 application.properties 文件中配置
# 驱动类名称
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
# 数据库连接的URL
spring.datasource.url = jdbc:mysql://localhost:3306
# 连接数据库的用户名
spring.datasource.username=root
# 连接数据库时的密码
spring.datasource.password=528339
(6). 创建一个JavaBean类、类中成员对应数据库中数据类型
写一下get、set、toString、有参、无参构造器
(7). 编写查询方法
这里时自动创建了一个 UserMapper 类型对象,而且放到IOC容器中
(8). 测试
(9). 文件位置之分配
此时表明还是报红、因为IDEA和数据库没有建立连接,不识别表信息
因此我们需要配置IDEA中MySQL数据库连接
sun公司提供的一套操作关系型数据库的API(规范)
(1). sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
(2). 各个数据库厂商去实现这套接口,提供数据库驱动jar包
(3). 我们可以使用这套接口(DBC)编程,真正执行的代码是驱动iar包中的实现类
(1). 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
(2). 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
(3). 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
在以往客户端需要新建一个连接对象、然后执行SQL语句、执行完毕了之后需要关闭连接来释放资源
每次都需要新建、使用、关闭是很浪费资源的!
如果有了连接池、那么程序就会初始化一系列的连接对象、当对象执行SQL语句的时候
它就会自动从连接池中获取一个连接、执行语句、然后把连接归还给连接池、这样来做到连接的复用
而不是每次都需要新建连接。如果有某一个对象获取了连接但是却一直没有操作数据库(占着茅坑不拉屎)
那么只要空闲时间超出了连接池规定的最大时间,这个连接将会释放。
优势:
资源重用、提升系统响应速度、避免数据库连接遗漏
标准接口: DataSource
官方(sun)提供的数据库连接池接口,由第三方组织实现此接口
功能:获取连接 Connection getConnection() throws SOLException;
Lombok是一个实用的ava类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString
等方法,并可以自动化生成日志变量,简化java开发、提高效率。
以往创建Javabean类的时候太繁琐、各种重写、构造器、getxx、setxx
引入:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
注意事项:
如果mapper接口方法形参只有一个普通类型的参数,#{...}
小里面的属性名可以随便写,如: #{id}、#{value}
优势: 性能更高、更安全(防止SQL注入)
SQL注入 :SQL注入是通过操作输入的数据来修改事先定义好的SQL语句、
以达到执行代码对服务器进行攻击
的方法
注意: 在SQL表命名数据名经常会使用下划线,但JavaBean当中一般不会用下划线
因此:SQL: dept_id 在写接口方法的时候 要写成驼峰命名 deptId
在真正实施插入方法的时候、我们通常会将所有数据在方法中包装起来、方法形参写我们的包装类
接口定义: 测试时与增加语句中一样、包装进类当中然后调用接口对象方法
根据ID查询:
但是查询之后我们会发现我们的时间都显示为null、并没有获取到
实体类属性名和数据库表查询返回的字段名一致
,mybatis会自动封装
如果实体类属性名和数据库表查询返回的字段名不一致
,不能自动封装
方法一: 将 * 改成我们数据库表格字段的名字、在后面加上驼峰命名(起别名)
这样就能自动封装获取到信息
方法二(繁琐很少用): 通过Mybatis的注解 @Results , @Result注解手动映射封装
方法三: 开启Mybatis的驼峰命名自动映射开关 它能够自动把 a_show 封装成 aShow
在 application.properties 中打出下列代码
之后你只需要按平常的方式去查询、他一样能给你输出有下划线的字段
我们知道 使用 $ 会出现SQL注入问题、性能i的又不安全
所以我们又想出一个方法、那就是使用函数 concat()
拼接 预编译 #{}
resources
中先建立同包同名文件
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.gangan.mapper.UserMapper">
mapper>
如果是简单的CURD可以采用注释来完成、如果是复杂的程序最好是使用XML配置
说明: Mybatis Plus
是基于Mybatis框架基础上开发的增强型工具、旨在简化开发、提高效率。
开发方式:
基于 MyBatis 使用 MyBatisPlus
基于 Spring 使用 MyBatisPlus
基于 SpringBoot 使用 MyBatisPlus
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.1version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.1.16version>
dependency>
修改 application.properties为 application.yml 详情
同时并配置 application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 数据库连接池
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db01 # 表路径
username: root
password: 528339
Springboot每次输出都一堆废话、因此我们可以在
application.properties中输入以下两条语句:
mybatis-plus.global-config.banner=false
spring.main.banner-mode=off
在同包resources下建立 logback.xml
,这样控制台输出内容就没有废话了
MyBatisPlus将书写复杂的SOL查询条件进行了封装,使用编程的形式完成查询条件的组合
第一种:
第二种:
第三种:
LamdaQuerWrapper就像一个添加条件的对象,你把条件都添加进去、查询它等于查询后加where限制
存在多个要求的情况下:
查询条件关于null值处理:
可以在application中配置全局文件:
mybatis-plus.global-config.db-config.id-type: assign_id
有些数据、是不能真的删除掉的。可能目前没有作用但是往后有很重要的作用。但为了不影响我们使用
我们可以逻辑上删除、加一条字段做一个标记,来表示它其实已经作废了。
当项目中类很多的时候、经典全局配置
一下
如果乐观锁永远是1、那每一条线程都能够得到了。也就失去了意义,它实质上是每当有人拿到锁
都会 version = version + 1
这样一来,锁一直在变化,每次也就一个人能使用了
模板: MyBatisPlus提供
数据库相关配置: 读取数据库获取信息
开发者自定义配置: 手工配置
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>3.5.2version>
dependency>
<dependency>
<groupId>org.apache.velocitygroupId>
<artifactId>velocity-engine-coreartifactId>
<version>2.3version>
dependency>
用户认证就是判断一个用户的身份是否合法的过程。用户访问系统资源时,系统要求验证身份的信息,如用户名密码、二维码登录、手机短信登录、指纹认证
等
为避免用户的每次操作都需要进行认证,可以将用户的信息保证在会话中。你可以理解为记住密码
保持当前用户的登陆状态,常见的有基于session方式、基于token方式等