Java项目的学习
2021-08-05 10:47:17 7 举报
AI智能生成
登录查看完整内容
java学习
作者其他创作
大纲/内容
项目一
项目二
多个参数赋值的时候使用,(记得和数据库的字段名一样)
@Param()
Mybatis注解
value:接收集合数据(可以不写)
required:前端必须提供参数,否则会报错
defaultValue:给参数提供默认值
name:解决前后端参数名不一致
@RequestParam
同步
将结果转换成json,交给前端
@ResponseBody
异步
GetMapper(\"\")
PostMapper()
PutMapper()
DeleteMapper()
@RestController(相当于@Controller+@ResponseBody)
@Controller
@Service
@Component
请求体中的数据
@RequestBoby
请求头中的参数
常用注解
Spring注解
在controller所有方法执行之前执行
@ModelAttribute
多个请求之间共用数据
SpringMVC
@SpringBootApplication
SpringBoot
@TableName(\"数据库表名\")
表名和数据库名不一致
随机生成的id(数字很长)
@TableId(type=IdType.AUTO)
解决方案(自动增长)
数据库会自动生成id
MybatisPlus
相当于一个单例对象,每次不能直接创建对象,用类名.成员变量来使用,用buil()结束
@Builder
Lombok
常用注解整理
xxx.getClass().getClassLoader();
参数1:目标对象的类加载器
xxx.getClass().getInterface();
参数2:目标对象的接口数组
参数1:jdk工具类生产的代理对象
proxy
参数2:当前用户执行的某个方法
method
参数3:当前用户执行的某个具体方法的实际参数列表
args
参数3:实现增强的业务逻辑
jdk动态代理
子主题
参数1:目标对象的class类
参数1:cglib生产出来的代理对象
参数2:执行代理对象(子)被拦截的方法
参数3:objects:执行代理对象,被拦截的方法中的参数列表
参数4:执行目标对象(子)被拦截的方法
intercept代理对象方法入口
参数2:实现增强的业务逻辑
CGLab动态代理
重写注解
@Override
方法已经过期
@Deprecated
比如大家使用集合的时候,有时候为了偷懒,会不写泛型,像这样: List heros = new ArrayList(); 那么就会导致编译器出现警告,而加上 @SuppressWarnings({ \"rawtypes\
@SuppressWarnings 有常见的值,分别对应如下意思1.deprecation:使用了不赞成使用的类或方法时的警告(使用@Deprecated使得编译器产生的警告);2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 关闭编译器警告3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;4.path:在类路径、源文件路径等中有不存在的路径时的警告;5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;6.finally:任何 finally 子句不能正常完成时的警告;7.rawtypes 泛型类型未指明8.unused 引用定义了,但是没有被使用9.all:关于以上所有情况的警告。
忽略警告信息
@SuppressWarnings
当使用可变数量的参数的时候,而参数的类型又是泛型T的话,就会出现警告。 这个时候,就使用@SafeVarargs来去掉这个警告
@SafeVarargs注解只能用在参数长度可变的方法或构造方法上,且方法必须声明为static或final,否则会出现编译错误。一个方法使用@SafeVarargs注解的前提是,开发人员必须确保这个方法的实现中对泛型类型参数的处理不会引发类型安全问题。
public class Hero { String name; @SafeVarargs public static <T> T getFirstOne(T... elements) { return elements.length > 0 ? elements[0] : null; }}
@SafeVarargs
约定函数式接口
函数式接口概念: 如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法),该接口称为函数式接口。函数式接口其存在的意义,主要是配合Lambda 表达式 来使用。
@FunctionalInterfacepublic interface AD { public void adAttack();}
@FunctionalInterface(JDK1.8新增的注解)
反射技术
java基础
速度更快
代码更少
更强大的API
便于并行
减少了空指针异常
允许在JVM上运行js应用
Nashorn引擎
概述
(o2)->{System.out.println(o1+o2);}
(o1)->{System.out.println(o1+o2);}
-> 左边:参数类型,可以省略(类型推断) 如果只有一个参数,可以不用写变量名
->右边:应该写{},如果只有一句话,并且有return ,return和{}可以省略
常用语法
只包含一个抽象方法的接口,称为函数式接口
在接口上使用@FunctionalInterface可以检查他是否为函数式接口
自定义函数式接口
类(对象)::方法名
使用格式
类(对象)::非静态方法
类::静态方法
类::非静态方法
使用情况
如何使用
方法引用
Lambda
stream关注的是数据,与cpu打交道
集合关注的是数据存储,与内存打交道
stream和collection区别
通过集合
通过数组
Stream.of()
通过of
迭代
生成
Stream.generate(Math::random).limit(10).forEach(输出)
创建无限流
实例化
all.stream().filter(e->e.getRid()>40).forEach(System.out::println);
filter过滤
skip跳过
distinct去重
筛选和切片
将集合中的元素,解析出来,变成另外一个stream流
map
如果集合中,有集合,可以解析出来变成另一个stream流
flatMap
映射
排序
中间操作
检查是否匹配所有元素
allMatch()
检查是否匹配至少有一个元素
anyMatch()
检查匹配是否没有匹配的元素
noneMatch()
返回第一个元素
findFirst
返回任意一个元素
findAny
返回流中元素的总个数
count
返回流中的最大值
max
返回流中的最小值
min
forEach
匹配与查找
终止操作
执行流程
可以将流中的元素结合起来,得到一个值
reduce
规约
List<Route> list = all.stream().collect(Collectors.toList());
转换为list
List<Route> list = all.stream().collect(Collectors.toSet());
转换为set
转换为map
collect
收集
stream(主要用于计算)
不会报异常不管什么都可以为空
ofNullable
创建optional实例
如果当前的optional为空,就用orElse中的T(条件)
如果不为空,则返回内部的值
orElse()
isPresent();
如果不为空可以使用get,获取改值
如果要获取里面的值,但是怕抛出其他异常,可以先进行判断
optional方法
Optional(避免空指针)
java8新特性
java进阶
Java SE阶段
超文本标记语言
HTML
绝对地址
./当前目录
../上一级目录
相对地址
href
_self
打开一个新窗口
_bland
target
a标签
h1-h6
标题标签
hr
水平线
ul
ol
li
列表标签
src路径
img图片标签
div
span
容器
英文空格
中文空格
 
大于
>
小于
<
&
&
转义字符
table
tr
td
th
表格
action
数据在请求地址中
get
在请求体中post提交需要一个<input type=\"hidden\" name=\"xxx\" value=\"xxx\"/>
post
上传文件必须写
enctype=\"multipart/form-data\"
from
checked用于设置单选和复选默认选中
text
password
date
radio
checkbox
file
reset
submit
button
type
input
label
select
textarea
type
表单标签
表单
常用标签
html
行内样式
内部样式
外部样式
css样式
#
id选择器
标签选择器
.
class选择器
基本选择器
层级选择器
空格
并集选择器
扩展选择器
文字文本
background
背景
块元素
block
内联元素
inline
隐藏
none
display
显示
绝对位置
absolute
从第一个点的位置开始计算
相对位置
relative
position
位置
left
right
float
清理周围的元素,左边left,右边right,两边both
clear清理
浮动
box-sizing:content-box
标准盒模型
box-sizing: border-box
IE盒模型
margin(外边距)
border(边框)
padding(内边距)
content(内容)
组成部分
盒子模型
css常用样式
css基础语法
css
网页交互
JavaScript
ECMAScript
浏览器对象模型
BOM
文档对象模型
DOM
js组成
js概述
数值可以与字符串进行数学运算,底层进行了转换
算数运算符
===恒等 先比较类型,然后比较内容
!==恒不等 先比较类型后比较内容
比较运算符
运算符
代码从上往下,逐行执行
顺序
if...else if...else
switch..case..default
条件语句
分支
while
do...while
for...i
数组的索引index
for...in
数组的元素
for...of
循环
流程控制语句
window.onload
页面加载完毕事件
onfocus
获取焦点
onblur
失去焦点
onchange
值改变时
onclick
单击时
常用事件
<script src=\"\"></script>
外部
内部
HTML引入js
alert();
document.write()
console.log()
js三种输出方式
let
ECMA6以后的语法
var
常量
const
js变量声明
alert()
confim()
prompt()
三种弹框
clearTimeout(定时器)
clearInterval(定时器)
两种定时器
Window对象
重新加载当前文档。
reload()
加载新的文档
assign()
用新的文档替换当前文档
replace()
Location 对象方法
可以进行页面的跳转
Location对象
BOM对象
getElementById
ES5
querySelect(css选择器)
querySelectAll(css选择器)
ES6
获取元素
innerHtml
innerText
操作内容
原生属性
js对象.properties
操作属性
js对象.style.样式名
js对象.style.cssText
js对象.className
操作样式
js对象.innerHTML +=追加内容
parentNode.appendChild(newNode)
document.createjs对象(标签)
添加元素
操作元素
DOM对象
let rege = new RegExp(“正则表达式”);
let regex = /正则表达式/;
创建
正则对象.test(字符串)
验证方法
正则表达式
基础语法
js
jquery是js轻量级框架
<script src=\"../js/jquery-3.2.1.min.js\"></script>
html引入jquery
$(js对象)
jq对象.get(索引)
只能定义一次
window.onload=function(){}\t只能定义一次
可以定义多次
$(function(){})
页面加载事件
$(\"标签名\")
$(\"#id选择器)
$(\".class选择器\")
$(\"A B\")
$(\
$(\"A > B\")
$(\"A[属性名='值']\")
$(\"A[属性名='值'][]...\")
属性选择器
:first
:last
:even
:odd
:eq(index)
基本过滤选择器
对象遍历
选择器
html()
text()
val()
attr()
checked
selected
removeProp()
prop()
属性
jq对象.css()
jq对象.removeClass()
jq对象.addClass()
样式
创建jq标签对象
$(\"<a></a>\")
父添加子,放在一个位置
prepend()
父添加子,放在最后一个
append
所有删除
remove()
删除所有并且删除所有子标签
empty()
元素
jquery的DOM
js对象.事件属性=function(){}
jq对象.事件函数(function(){})
jquery事件绑定
Jquery
当浏览器发送请求之后,就会处于等待状态,此时不能做任何操作,不然会取消当前操作
会影响当前页面的数据
同步概念
ajax是异步请求,用于快速创建动态网页的技术
当浏览器发送请求之后,他不会处于等待状态,还可以做其他的操作,这就是异步操作
异步请求不会影响其他的数据
异步概念
原生ajax
必须的
请求地址
请求参数
响应回调函数
响应数据类型
四个参数
1.$.get()
2.$.post()
此方法中的参数是一个json格式的数据,就是有key和value
post/get
url
data
响应内容的预定义类型(html/text/json/xml)
dataType
执行成功后的回调函数
success
请求正文的MIME类型
contentType
参数以(:)隔断
$.ajax({});
建议使用
3.ajax()
jquery方式的ajax
// 将任意对象转json字符串objectMapper.writeValueAsString(对象/map/list);
new ObjectMapper();
Jackson
Gson
JSON.toJSONString(对象);
将对象转为json
//对象是单个元素JSON.parseObject(json串,CLAZZ);//对象包含多个元素JSON.parseArray(json串,CLAZZ);
将json转为java对象
String jsonString = JSON.toJSONString(stringList);
list-->json
json-->list
String jsonString2 = JSON.toJSONString(map);
map-->json
json-->map
https://www.jianshu.com/p/f20ffefeec4d
JavaBean-->Json
Fastjson(阿里巴巴)
Json转换方式
AJAX
Vue的出现是为了简化前端页面的编写
一个前端项目,可以使用vue特性,也可以不使用vue特性
他是一个渐进式框架
Vue概述
<script src=\"../js/vue-2.6.12.js\"></script>
1.引入vue的js类库
<!--2.vue管理视图--><div id=\"app\"> <h3>获取input中输入的文字</h3> <input type=\"text\" v-model=\"message\"> <div style=\"border:red 1px solid; height: 25px;\">{{message}}</div></div>
2.创建出vue的视图
3.创建出vue的脚本(js代码)
使用的步骤
视图
脚本
Vue注意方面
网络不好的情况下会展示{{message}}
{{}}
插值表达式
v-text:\"Vue变量\"
v-html:\"Vue变量\"
解决插值表达式网络不好,展示原内容
文本插值
v-bind:属性名=\"Vue变量名\"
简化语法
:属性名:\"Vue变量名\"
绑定属性
<li v-for=\"user in userList\">{{user.id}}----{{user.name}}---{{user.address}}</li>
普通遍历
<li v-for=\
遍历list
遍历map
列表循环
他是直接没有
v-if=\"条件判断\"
display:none
他的底层是不会删除,会隐藏,不显示
v-show=\"条件判断\"
v-if=\"布尔表达式\"v-else-if=\"布尔表达式\"v-else
条件判断
v-on:事件名=\"方法\"
@事件名
如何使用调用方法
事件绑定
v-model
表单绑定
他可以获取到变化前后的值。
类似于onChange(是否发生改变)
监视器
常用指令
vue
bootstrap
ElementUI
前端技术
Tomcat是web应用服务器,是Apache软件基金会项目中的一个核心项目,是一个免费开源的web服务器,属于轻量级应用服务器
客户端安装专门的软件
C/S架构
浏览器作为客户端
B/S架构
架构分类
html;css;js;jpg
静态
jsp;servlet;php;.net;ruby;python
动态
资源分类
startup.bat
shutdown.bat
可执行文件
bin
server.xml可以设置应用服务器的端口,或发布目录文件(不建议修改)
配置文件
conf
所依赖的jar包
lib
日志信息
logs
零时文件
temp
1.将文件打成zip或者直接打成war包
2.把war包复制到webapps目录下,如果是zip格式的话,改一下后缀名改为war
如何发布
发布目录
默认访问的是Tomcat目录/webapps/ROOT目录
直接可以省略项目的名字/ 表示找到root目录
Root目录
webapps
在root目录中,并且jsp编译后的文件会变成两个文件,一个.class和一个java文件
jsp文件被编译后的文件存放目录
session对象被序列化后保存的位置
work
目录结构
配置java环境变量
或者是端口占用了
启动有问题
Tomcat
在客户端和服务器通信时,为了规范数据传输的格式
他是基于TCP协议来传输的
请求行
(防盗链)告诉服务器该网页是从哪个页面链接过来的
Referer
会告诉网站服务器
User-Agent
请求体的描述信息
请求头
get没有,post有
数据内容
请求体
请求格式
协议
成功
200
资源(网页等)被永久转移到其它URL
301
该资源原本确实存在,但已经被临时改变了位置
302
未修改
304
访问不到地址
404
请求的资源(网页等)不存在
405
内部服务器错误
500
状态码
响应行
Location
设置MIME类型
Content-type
Content-Disposition
表示浏览器应该在多少时间之后刷新文档,以秒计
refresh
文档的最后改动时间。
Last-Modified
文档的编码
Content-Encoding
响应描述信息
响应头
响应体
响应格式
构成
Http协议
servlet是一个运行在服务器端的一个小程序
在web.xml
<servlet> <servlet-name>aaa</servlet-name> <servlet-class>com.itheima01.Demo01</servlet-class></servlet><servlet-mapping> <servlet-name>aaa</servlet-name> <url-pattern>/demo</url-pattern></servlet-mapping>
第一步
第二步
入门
什么时候创建对象
访问Servlet类的时候就会执行service()方法
什么时候调用方法
服务器正常关闭就会自动执行distory()方法
什么时候销毁对象
生命周期
@Servlet(\"\")
Servlet注解配置
5个抽象方法
Servlet
抽象4个方法
留下了一个抽象方法
GenericServlet
没有抽象方法
doGet()
doPost()
HttpServlet
顶层接口
Servlet体系结构
Tomcat在启动时,它会为web项目创建一个ServletContext对象
ServletContext对象可以存放当前项目的一些数据
每个web项目只有一个ServletContext对象
request.getServletContext();
getServletContext()
如果继承HttpServlet后,可以直接调用
获取
域对象可以完成数据的共享
serAttribute(\"字符串\
getAttribute(\"字符串\
removeAttribute(String name)
使用
作用&使用
<!--配置全局参数--> <context-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </context-param>
//获取ServletContext ServletContext context = getServletContext();//获取全局参数 String encoding = context.getInitParameter(\"encoding\");//码表 System.out.println(encoding);
配置全局参数
获取虚拟访问路径
getContextPath()
获取真实路径
getRealPath(\"\")
获取路径
ServletContext
客户端请求
获取请求方式的类型
getMethod()
获取客户端发出请求完整URL
getRequestURL()
获取请求行中的资源名部分
getRequestURI()
获取客户机IP地址
getRemoteAddr()
获取请求行
获取浏览器的版本
request.getHeader(\"User-agent\")
获取该网页是从哪个页面链接过来的
request.getHeader(\"Referer\");
设置中文编码
response.setContentType(\"text/html;charset=utf-8\");
根据名称获取数据
getParameter(String name)
根据名称获取所有数据
getParameterValues(String name)
获取所有参数的键值对
getParameterMap()
获取请求参数
Request
服务器发送给浏览器端数据
设置状态码
response.setStatus(200);
告诉浏览器下载的方式 来接收数据
response.setHeader(\"content-disposition\
告诉浏览器在指定的时间之后跳转到指定的路径
response.setHeader(\"refresh\
使用字符流
getWriter()
使用字节流
getOutputStream()
Response
设置响应编码规范
不需要解决
request.setCharacterEncoding(\"utf-8\");
解决请求乱码问题
resp.sendRedirect(req.getContextPath() + \"/RouteServlet\");
重定向
req.getRequestDispatcher(\"/route_list.jsp\
转发
1.请求转发浏览器地址栏不会发生变化,重定向地址栏会发生变化
4. 转发可以携带数据
重定向和转发的区别
Tomcat&Servlet
客户端;会话技术
浏览器关闭会话结束
new Cookie(\"xxx\
发送cookie对象response.addCookie(c);
获取cookierequest.getCookies();
如何是用
运行一次发送多个cookie,给浏览器保存
设置多长时间就存活多长时间
如果设置-1就代表默认值
如果设置0,就是立马删除
setMaxAge(秒)
可以设置cookie的存活时间
cookie细节
cookie把数据存储在浏览器中
单个cookie有大小限制(4kb)且同一个域名下cookie的数量不能超过50个
cookie特点
1. cookie一般用于存出少量的不太敏感的数据2. 在不登录的情况下,完成服务器对客户端的身份识别
作用
记录最后一次登录时间
应用场景
Cookie
服务器会话技术
把数据保存在服务器端的会话技术
getAttribute(String name)
removeAttribute(String name)
清除会话
invalidate()
HttpSession是一个域对象
快速入门
默认情况下,浏览器关闭,再次打开二次获取的session不一样\t基于cookie实现(浏览器关闭,cookie销毁)
设置cookie的存活时间(JESSIONID)\t这里我们代替服务器,做一个小操作,覆盖这个JSESSIONID,指定持久化时间
1.客户端关闭,服务器不关闭,数据是否相同
当服务器正常关闭,重启后,二次获取的session数据一样
tomcat这哥们实现以下二个功能\t钝化(序列化)\t\t当服务器正常关闭时,session中的数据,会序列化到磁盘\t活化(反序列化)\t\t当服务器开启后,从磁盘文件中,反序列化到内存中
2.客户端不关闭,服务器关闭,数据是否相同
session细节
1. session存储数据在服务器2. session存储类型任意(Object)3. session存储大小和数量没有限制(相对于内存)4. session存储相对安全
session特点
Session
PageContext对象是JSP页面中才有的对象
PageContext
可以在一次请求范围内进行共享数据
request(请求域)
域作用范围是当前会话
session
域的范围是整个web应用
四大域对象
JSP的本质是Servlet
将Java代码和HTML语句混合在同一个文件中编写,页面动态资源使用java代码,页面静态资源使用html标签。
编写逻辑java代码
<% Java代码 %>
定义全局变量和方法
<%! Java代码 %>
向页面输出数据
<%= Java代码%>
jsp语法
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
jsp指令的格式
page
include
tablib
jsp指令
jsp页面不需要获取和创建,可以直接使用对象
当前页面中共享数据
域对象
pageContext
一次请求中共享数据
HttpServletRequest
request
一次会话中共享数据
HttpSession
整个web应用共享数据
application
响应对象
HttpServletResponse
response
当前页面(Servlet)对象
Object
输出数据
JSPWiter
out
servlet配置对象
ServletConfig
config
异常对象
Throwable
exception
内置对象
jsp九个内置对象
代替JSP里面的运算
域对象的数据获取
${}
格式: ${域名称.键名称} 获取普通值: ${域名称.键名称} 获取对象: ${域对象.键名称.成员变量名} 获取List集合: ${域对象.键名称[索引]} 获取Map集合: ${域对象.键名称.map键名称} ${域对象.键名称[\"map键名称\"]}
语法
${pageContext.request.contextPath}
获取虚拟目录
el表达式
if :相当于java代码的if语句 test 必须写的属性,接受boolean表达式 一般情况下,test属性值会结合el表达式一起使用 jstl里面的判断只有if 没有else
jstl标签
JSP
M Model
视图就是用来给用户显示数据的
V View
C Controller
MVC模式
Web层
业务逻辑处理
service层
dao层
三层架构
过滤器,用于登录验证,统一编码处理,或者铭感字符过滤
1.定义一个类实现Filter类,重写里面的抽象方法
2. 编写拦截请求
3.设置放行
<?xml version=\"1.0\" encoding=\"UTF-8\"?><web-app xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd\" version=\"3.1\"> <!--快速入门--> <!--注册filter--> <filter> <filter-name>QuickFilter</filter-name> <filter-class>cn.itcast.a_quick.QuickFilter</filter-class> </filter> <!--配置filter拦截路径--> <filter-mapping> <filter-name>QuickFilter</filter-name> <url-pattern>/quick.jsp</url-pattern> </filter-mapping></web-app>
4.在web.xml文件中配置过滤器
服务器启动项目加载,创建filter对象,执行init方法(只执行一次)
init()初始化
用户访问被拦截目标资源时,执行doFilter方法
doFilter()拦截
服务器关闭项目卸载时,销毁filter对象,执行destroy方法(只执行一次)
destroy销毁
用户访问指定目标资源(/show.jsp)时,过滤器进行拦截
精准匹配
用户访问指定目录下(/user/*)所有资源时,过滤器进行拦截
目录匹配
用户访问指定后缀名(*.html)的资源时,过滤器进行拦截
后缀匹配
用户访问该网站所有资源(/*)时,过滤器进行拦截
匹配所有
拦截路径
filter
监听器用来监听数据
可以监听应用是否启动了
ServletContextListener
监听请求对象的创建和销毁
ServletRequestListener
用于用户流量的统计
监听会话对象的创建和销毁
HttpSessionListener
监听到应用域中的属性存入,更改和移除是分别执行对应方法
ServletContextAttributeListener
监听到请求域中的属性存入,更改和移除是分别执行对应方法
ServletRequestAttributeListener
不常用
监听到会话域中的属性存入,更改和移除是分别执行对应方法
HttpSessionAttributeListener
有他替代上面的监听器,用于对象和会话域的绑定 也可以对会话域解绑
HttpSessionBindingListener
监听会话域中的数据钝化和活化
HttpSessionActivaionListener
常用监听器
listener
Java Web
CREATE DATABASE 数据库名
创建数据库
USE 数据库名;
切换数据库
DROP DATABASE 数据库名;
删除数据库
SHOW DATABASES;
查看所有数据库
ALTER DATABASE 数据库名 CHARACTER SET UTF8;
修改数据库字符集
SELECT DATABASE();
查看当前使用的数据库
CREATE DATABASE 数据库名 CHARACTER SET UTF8
创建数据库并指定字符集
数据库操作
创建表
SHOW TABLES;
查看数据库中所有表
DESC 表名;
查看表结构
drop table 表名;
表的删除
ALTER TABLE 表名 ADD 列名 INT NOT NULL;
添加列
ALTER TABLE exam CHANGE 列名 修改后的列名INT NOT NULL;
修改表的列名
RENAME TABLE 表名 TO 修改后的表名;
修改表名
ALTER TABLE 表名 CHARACTER SET GBK;
修改表的字符集
ALTER TABLE 表名DROP 列名;
删除列
表的修改
表操作
DDL(数据库定义语言)
插入数据
UPDATE 表名 SET 列名=值;
全表修改
UPDATE 表名 SET 修改的列名=值 WHERE 条件;
条件修改数据
修改数据
DELETE FROM 表名;
TRUNCATE TABLE 表名;
删除全表数据
DELETE FROM 表名 WHERE 条件;
按照条件删除
删除记录
DML(数据库操作语言)
mysql -u 用户名-p 密码;
登录
exit;
退出登录
DCL(数据控制语言)
SELECT * FROM 表名;
查询所有
查询指定字段的表数据
SELECT DISTINCT 列名 FROM 表名;
去重(DISTINCT)
SELECT 列1+列2+列三 FROM 表名;
四则运算
SELECT 列名 AS 别名 FROM 表名;
起别名
简单查询
SELECT * FROM 表名 WHERE 列名>值
简单条件查询
SELECT * FROM 表名 WHERE 列名 BETWEEN 小值 AND 大值;
区间查询
IN查询
条件查询
and &&
or ||
逻辑查询
SELECT * FROM 表名 WHERE 列名 LIKE '马%';
模糊查询
IFNULL(空值替换)
SELECT * FROM 表名 WHERE 列名 IS NULL;
null值判断
SELECT * FROM 表名 WHERE 列名 IS NOT NULL;
not null判断
空值处理
SELECT COUNT(列名) FROM 表名;
统计个数
SELECT MAX(age) FROM `user` WHERE sex='女';
最大值
SELECT MIN(math) FROM `user`;
最小值
SELECT AVG(age) FROM `user`;
平均数
SELECT SUM(age) FROM `user`;
求和
聚合函数
HAVING和WHERE区别
分组查询GROUP BY
分组
SELECT * FROM 表名 WHERE 条件 ORDER BY 列DESC;
正序排序(默认升序)ASC
降序排序DESC
分页
单表查询
DQL(数据库查询语言)
TCL(事务控制)
数据库分类
92语法
99语法
语法的分类
常用
可变的字符长度
varchar(n)
字符类型
int/integer
数值类型
numerc()
小数(浮点类型)
最大65kb数据
最大可存储4gb数据
longtext
大文本类型(不推荐使用)
1字节
取值范围1901-2155
year
用来存生日,订单日期
1000-01-01到9999-12-31
一般不使用
用来存储时分秒
time
用来存储年月日时分秒
datetime
用来存储年月日时分秒(推荐使用)
timestamp
日期类型
常用的数据类型
数据库的数据类型
初级
通常是用来拆分表,列太多,会使用一对一的关系,可以提高效率(不常用)
一对一
FOREIGN KEY (本表外键列名) REFERENCES 主键表(主表的主键列名);
一对多
多对多
表关系
两张表列同名,可以使用natural join来自动匹配列名相同的列
自然连接
隐式内连接
显示内连接
内连接(空值不显示)
左外连接
右外连接
SELECT * FROM 表名 WHERE 列名=(SELECT MAX(列名) FROM 表名);
单行单列
SELECT * FROM 表名 WHERE 列名>(SELECT AVG(列名) FROM 表名);
单行多列
SELECT 需要查询列 FROM 表名 WHERE 列名=值 || 列名=值;
多行多列
子查询
自连接
将多条查询结果拼接到一起,并且去重
union
直接累加,不去重(效率高)
union all
using(两张表相同的列名)
等值条件
on条件(between xx and xx)
非等值条件
查询的结果当一张表来使用就是伪表查询
伪表查询
多表查询
99语法(推荐使用)
中级
函数:NOW() | CURDATE() | CURTIME()\t描述:获取系统当前日期时间、日期、时间\t实例:SELECT NOW();
获取系统当前日期时间、日期、时间
函数:YEAR(DATE) | MONTH(DATE) | DAY(DATE)\t描述:从日期中选择出年、月、日\t实例:SELECT YEAR(NOW());
从日期中选择出年、月、日
函数:LAST_DAY(DATE)\t描述:返回月份的最后一天\t实例:SELECT LAST_DAY('2019-2-1');
返回月份的最后一天
计算起始日期 DATE 加(减) n 天的日期
函数:QUARTER(DATE)\t描述:返回日期 DATE 是第几季节,返回 1 到 4\t实例:SELECT QUARTER('2020-05-03');
返回季度
计算相隔天数
按照要求显示日期
日期函数
拼接字符
函数:CHAR_LENGTH(str)\t描述:返回字符串 str 的字符数\t实例:SELECT CHAR_LENGTH('传智播客');
字节数
函数:LENGTH(str)\t描述:返回字符串 s 的字节数\t编码:UTF8(一个中文字符占3个字节)\t实例:SELECT LENGTH('itcast');
字符数
函数:UCASE(s) | UPPER(s)\t描述:将字符串转换为大写\t实例:SELECT UCASE('itcast');
转换大写
函数:LCASE(s) | LOWER(s)\t描述:将字符串转换为小写\t实例:SELECT LCASE('ITCAST');
转换小写
获取字符开始位置
函数:TRIM(str) | LTRIM(str) | RTRIM(str)\t描述:字符串去空格\t实例:SELECT TRIM(' itcast ');
去除空格
替换
截取函数
字符串的比较
字符串函数
ABS(x)
绝对值
CEIL(x)
向上取整
FLOOR(x)
向下取整
取余
RAND()
随机数
ROUND(x)
四舍五入
保留几位小数
数字函数
SELECT \t\tCASE 字段\t\t\tWHEN 判断条件1 \t\t\t\tTHEN 希望的到的值1\t\t\tWHEN 判断条件2 \t\t\t\tTHEN 希望的到的值2\t\t\tELSE \t\t\t\t前面条件都没有满足情况下得到的值 \t\tEND\tFROM\t\t表名;
case表达式
if表达式
MD5(值);
MD5 加密函数
加密函数
高级函数
MySQL函数
show variables like '%query%'
查询各个变量(慢查询相关配置)
set global slow_query_log = on;
打开慢查询日志
set long_query_time=时间;
设置慢查询日志时间节点
D:\\mysql-5.7.27-winx64\\data\\LaoSun-slow.log
慢查询日志路径
慢查询日志
仅加速查询 index
普通索引
加速查询 + 列值唯一 unique (既是约束也是索引)
唯一索引
加速查询 + 列值唯一 + 非空 (既是约束也是索引)
主键索引
多列值组成一个索引
组合索引
索引分类
1. 字段内数据的辨识度不能低于70%
2. 在经常需要 搜索 的列上建索引
3. 在经常需要 连接 的列上建索引(外键字段)
4. 在经常排序的列上创建索引
5. 用的时候创建索引,不用一开始就创建索引
6. 不是索引越多越好,因为索引的建立和维护都是需要耗时的
创建索引的原则
3. 在索引列上进行计算,会使索引失效
4. 使用 !=、 <> 、is not null、not 等也会失效 尽量不要出现null
索引失效的情况
创建索引需要注意的情况
-- 添加一个主键,这意味着索引值必须是唯一的,且不能为NULLalter table 表名 add primary key(列名)
-- 添加唯一索引(除了NULL外,NULL可能会出现多次)alter table 表名 add unique(列名)
-- 添加普通索引,索引值可以出现多次。alter table 表名 add index(列名)
修改表(创建索引)
drop index 索引名 on 表名;
直接删除
alter table 表名 drop index 索引名字;
修改表时删除(掌握)
alter table 表名 drop primary key;
删除主键
删除索引
索引
数据库优化
msyql5.5版本之前的不支持事务、表锁设计,支持全文搜索缓冲池只缓存索引文件,不缓存数据文件MyISAM存储引擎表由MYD(存放数据文件)和MYI(存放索引文件)组成
MyISAM存储引擎
msyql5.5(含)版本之后的使用支持持事务行锁设计支持外键支持非锁定读避免幻读现象
InnoDB存储引擎
表中的数据存放在内存,数据库重启或崩溃表中的数据都会消失适合存储临时数据的临时表,以及数据仓库的纬度表默认哈希索引只支持表锁,并发性能差,不支持TEXT和BLOB列类型存储变长字段时按照定长字段方式,浪费内存(eBay工程师给出了patch解决方案。
Memory(记忆,内存)存储引擎
数据库存储引擎
123') OR ('1=1
会引发sql注入问题
sql注入问题
就是一个表中的数据 发生改变是,会触发另一个表中的数据
触发器
事件
高级
MySQL数据库
数据库
JDBC
Java数据库
Java EE阶段
<resultMap id=\"userResultMap\" type=\"com.laosum.domain.User\"> <id column=\"uid\" property=\"id\"></id> <result column=\"name\" property=\"username\"/> <result column=\"bir\" property=\"birthday\"/> <result column=\"gender\" property=\"sex\"/> <result column=\"addr\" property=\"address\"/> </resultMap> <select id=\"findAll\" resultMap=\"userResultMap\
resultMap
数据库列名与字段名不一样
resultType
数据库列名与字段名一样
单条件查询
<select id=\"findByIdAndUsername1\" resultType=\"com.itheima.domain.User\"> select * from user where id = #{param1} and username = #{param2}</select>
多个参数parameterType不用写
使用 `#{arg0}-#{arg1}` 或者 `#{param1}-#{param2}` 获取参数
第一种方式
List<User> findByIdAndUsername2(@Param(\"id\
<select id=\"findByIdAndUsername2\" resultType=\"com.itheima.domain.User\"> select * from user where id = #{id} and username = #{username}</select>
在接口中写@Param(\"id\")
使用注解`@Param()`注解获取参数
第二种方式
@Test public void test02() throws Exception{ SqlSession sqlSession = MybatisUtils.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setId(41); user.setUsername(\"老王\"); List<User> users = mapper.findByIdAndUsername(user); users.forEach(System.out::println); //关闭资源 MybatisUtils.release(sqlSession); }
List<User> findByIdAndUsername3(User user);
使用实体对象传递参数
第三种方式
<select id=\"findLikeUsername\" resultType=\"com.itheima.domain.User\
List<User> findLikeUsername(String username);
多条件查询
<!--用户保存 useGeneratedKeys=\"true\" 开启主键返回功能 keyProperty=\"id\" 指定数据库主键字段返回到实体哪个属性\t有局限性,不支持oracle数据库--><insert id=\"save\" useGeneratedKeys=\"true\" keyProperty=\"id\
仅支持自动增长的数据库
<!--用户保存 SELECT LAST_INSERT_ID() 用于获取上一条新增记录的主键 selectKey 标签 keyColumn:指定数据库主键字段 keyProperty:指定实体主键属性 resultType:指定实体主键类型 order:表示 selectKey 标签 在insert语句之前执行还是之后执行 before :之前 after :之后--><insert id=\"save\"> <selectKey keyColumn=\"id\" keyProperty=\"id\" resultType=\"int\" order=\"AFTER\
支持所有类型的数据库
返回主键id
* #的特点:\t# 表示占位符,相当于jdbc中的?底层工作的是PrepareadStatement对象,SQL只编译一次,而且没有SQL注入问题\t# 当传入的参数为一个简单类型时,#{}内容可以随便写,建议写成接口中方法的参数名称\t# 当传入的参数为一个对象类型时,#{}写对象属性\t* $的特点:\t$ 表示字符串拼接,底层工作的是Statement对象,sql语句每次都会重新编译,而且存在SQL注入问题\t$ 当传入的参数为一个简单类型时,${} 只能写 value\t\t补充:TextSqlNode.java 源码可以证明\t$ 当传入的参数为一个对象类型时,${} 写对象属性
`${}` 与 `#{}` 区别(面试题)
配合if标签使用
<if test=“条件判断”> \t查询条件拼接 </if>
if标签
where标签
动态sql
resultMap=\"orderAndUser\"
<id column=\"uid\" property=\"id\"/>
<result column=\"username\" property=\"username\"/><!--column数据库的列名property实体类的变量-->
使用的是association标签映射
xml文件
oftype是list的类型来使用的
javaType和ofType区别
嵌套查询
多对对
当用户查询订单是,什么时候使用数据的时候,什么时候加载
在嵌套查询的时候,才能使用
延迟加载
多表查询会直接执行
一对一使用
查询用户订单的时候立即查出订单
立即加载
加载策略
mybatis
<!--分页插件PageHelper--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>3.2</version> </dependency>
1.Maven依赖
<plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor=\"com.github.pagehelper.PageInterceptor\"> <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --> <property name=\"autoRuntimeDialect\" value=\"true\"/> </plugin></plugins>
2.mybatis中的配置信息
3. 如何使用
PageHelper
Ipage
分页插件
Mybatis框架
依赖管理
项目构建
核心功能
存放了 maven 的命令,比如我们前面用到的 mvn tomcat7:run
存放了一些 maven 本身的引导程序,如类加载器等
boot
存放了 maven 的一些配置文件,如 setting.xml 文件
存放了 maven 本身运行所需的一些 jar 包
删除target目录及内容
clean
编译命令,生成target
compile
执行 src/test/java 下单元测试类,并编译为class文件
test
打包工具java工程执行package打成jar包web工程打成war包
package
install
将jar或war包部署到私服中
deploy
常用命令
<packaging>war</packaging>
可以改成jar
打包方式修改
有依赖传递
所有
没有依赖传递
编译期和测试期
provided
运行期和测试期
runtime
测试期
system
Scope(作用范围)
true不传递
false传递
optional
当依赖包在本地而非仓库时,sytemPath指出了jar包的路径
systemPath
常见标签
依赖传递
1. 第一声明者优先原则
2.路径近者优先原则
依赖调解原则
<properties> <mysql.version>5.1.47</mysql.version> </properties>
1.提取版本号
<!--版本锁定--> <dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies> </dependencyManagement>
2.锁定版本
锁定版本
依赖冲突
<exclusions> <exclusion> <artifactId>tomcat-jdbc</artifactId> <groupId>org.apache.tomcat</groupId> </exclusion> </exclusions>
依赖排除
用户名密码是amin/admin123
自己工程的jar
宿主仓库
hosted
第三方下载的jar
代理仓库
hosted+proxy
组仓库
group
不使用了
虚拟仓库
virtual
nexus四种仓库
<server>\t<id>releases</id>\t<username>admin</username>\t<password>admin</password>\t</server>\t<server>\t<id>snapshots</id>\t<username>admin</username>\t<password>admin</password>\t</server>\t<server>\t<id>thirdparty</id>\t<username>admin</username>\t<password>admin</password>\t</server>
D:\\devtools\\apache-maven-3.5.2\\conf\\settings.xml
<distributionManagement> <repository> <id>releases</id> <url>http://localhost:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement>
配置项目pom.xml
diploy打包发布到私服
如何将项目发布到私服
<profile> <!--profile的id--> <id>dev</id> <repositories> <repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复--> <id>nexus</id> <!--仓库地址,即nexus仓库组的地址--> <url>http://localhost:8081/nexus/content/groups/public/</url> <!--是否下载releases构件--> <releases> <enabled>true</enabled> </releases> <!--是否下载snapshots构件--> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 --> <pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 --> <id>public</id> <name>Public Repositories</name> <url>http://localhost:8081/nexus/content/groups/public/</url> </pluginRepository> </pluginRepositories> </profile>
<activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
1.配置setting.xml文件
如何下载到jar
nexus
搭建私服
mvn install:install-file -Dfile=c:\\xxx-{version}.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
本地jar放到maven中
Maven
redis是单线程模型,指的是redis命令的核心模块是单线程的,而不是redis实例就一个线程
redis的瓶颈并不是在cpu,而是在内存和网络,在redis4.0之后就有多线程的概念,比如过redis多线程在后台删除对象
前几天Redis6发布了,他这里的多线程说的是,指的是网络io处理的多线程,执行命令还是单线程的
redis是多线程还是多线程的
面试题
字符串
列表
集合
散列表
有序集合
数据类型
默认的持久化机制
AOF
日志文件备份
RDB
数据持久化
key存在才能成功
xx
key不存在才能设置过期时间
nx
失效时间(失效后删除)
redis实现分布式锁
Redis
git
作用:接收Servlet(接收请求,响应数据,地址配置,页面转发)
对应的框架:Spring MVC
Controller层
作用:处理业务逻辑的
没有对应的框架
Service层
作用:对数据库做操作
对应的框架:Mybatis
Dao层
三层模型
SpringMvc
MVC框架
Mybatis
Hibernate
持久层框架
redis
ehcache
缓存
spring-task
quartz
定时任务
hibernate validator
校验框架
Spring Security
spring集成第三方框架
Mail右键发送
定时任务处理
消息处理(异步处理)
spring自带服务
Test
Beans
Core
Context
SpEL
Spring Code
Spring AOP和监视器
消息传递
数据访问/集成层是由JDBC、ORM、OXM、JMS和事务模块组成。
数据访问/集成
Web层由spring-web、spring-webmvc、spring-websocket和spring-webmvc-portlet模块组成。
对象封装参数的工具类
BeanUtils
常用工具类的使用
Spring Web
Spring模块划分
指的是,谁来负责对象的创建和装配工作
控制
之前程序员手动在类中控制对象实例的创建,现在反转到IOC容器去创建实例和装配工作
反转
总结:解决了耦合性,可以让我们不用关注框架的搭建上,而是更多的时间让我们关注在业务代码的实现上
简介
类路径 下加载配置文件
ClassPathXmlApplicationContext
系统文件路径下查找文件
FlieSystemXmlApplicationContext
读取注解配置类
AnnotationApplicationContext
ApplicationContext
更具名字(id)来获取对象的实例
getBean(String name)
更具类型来获取对象的实例
public <T>getBean(Class<T> requiredType)
更具名字和类型来获取对象的实例
BeanFactory下getBean方法
new ClassPathXmlApplicationContext(\"applicationContext.xml\")
1.让Spring解析xml配置文件,初始化Ioc容器
app.getBean(\"username\")
2. 从Ioc容器中获取service实现
userService.save();
3.测试用户功能
BeanFactory
<Bean id=\"userDao\" class=\"com.xxx.xxx.impl.xxx\">
此对象在Ioc容器中的唯一标识
id
此对象的全限定类名
class
Xml中
创建:在ioc容器初始化时
销毁:在ioc关闭时
单例对象
singleton
创建:什么时候创建,ioc就什么时候创建
销毁:当对象失去引用的时候也就是GC垃圾回收的时候
多例对象
prototype
scope(范围)
作用范围和生命周期
Spring的配置文件
其实就是给对象属性赋值的过程,通过spring完成依赖注入
DI注入
<constructor-arg>name属性:属性名称value:注入的普通属性值ref:注入对象引用值
构造方法注入
name:set方法的属性名 setUserDao() -> UserDao -> userDao 【通常情况下与变量的名称一致】 value:传递的简单数据类型(string、int、double) ref:传递的引用数据类型(必须在ioc容器中)
set方法注入
本质上还是set方法,只不过是简化了xml的配置
P命名空间注入
Bean依赖注入方式
<!--user,交给ioc容器--><bean id=\"user\" class=\"com.itheima.pojo.User\"> <property name=\"id\" value=\"33\"/> <property name=\"username\" value=\"lucy\"></property></bean>
直接声明就行
简单数据类型
<property name=\"list\"> <list> <value>jack</value> <value>lucy</value> <ref bean=\"user\"></ref> </list> </property>
list
<property name=\"set\"> <set> <value>呵呵</value> <value>哈哈</value> <ref bean=\"user\"></ref> </set> </property>
set
<property name=\"array\"> <array> <value>安妮</value> <value>安其拉</value> <ref bean=\"user\"></ref> </array> </property>
array
引用数据类型
<property name=\"map\"> <map> <entry key=\"k1\" value=\"v1\"></entry> <entry key=\"k2\" value=\"v2\"></entry> <entry key=\"user1\" value-ref=\"user\"></entry> </map> </property>
<property name=\"props\"> <props> <prop key=\"k3\">v3</prop> <prop key=\"k4\">v4</prop> </props> </property>
properties
集合数据类型
Bean依赖注入的数据类型
在new的时候,在后面可以多加几个
并列加载
使用Import 中resource加载配置文件
主从配置
配置文件模块方法
底层封装了JDBC技术
Dao代码的工具类
new QueryRunner(DataSource dataSource)
int update(); 执行增。删。改
<T> query(); 执行查询语句
核心对象
Dbutils
使用注解开发,必须开启组件扫描
注意:
不属于三层模型的使用
DAO层
@Repository
web层
按照类型注入
@AutoWired
一起使用
在同类型的基础上,在根据id查找
@Qualifier
相当于@AutWired+@Qualifier
@Resource
依赖注入DI
作用是:定义这个类是单例,多例对象
单例
@Scope(\"singleton\")
多例
@Scope(\"prototype\")
在类上写
@Scope
初始化方法
@postConstruct
销毁方法
@PreDestroy
在方法上写
生命周期用的注解
1.配置文件
<context:property-placeholder location=\"classpath:jdbc.properties\">
2.加载配置文件
3.在属性上加上@Value(\"${jdbc.driver}\")
可以读取配置文件的key
@Value
注解补充
相当于applicationContext.xml
@Configuration
加载第三方类,交给ioc容器
@Bean
加载properties文件
@PropertySource(\"classpath:xxx.properties\")
注解扫描
<context:compont-scan base-package=\"cn.laosum\">
@ComponentScan
加载一个配置类
@Import
注解类的配置
他就是一个线程,但是他是一个线程隔离的,相当于一把锁,其他的线程不能访问
然后我们同过这把锁,然后绑定连接对象,然后实现线程的共享连接对象
ThreadLocal初步理解
IOC(控制反转)
AOP的思想是:不用修改源代码的基础上,就对功能进行增强,就是AOP
Jdk的动态代理
cglab的动态代理
这种思想的实现技术是:动态代理
AOP(面向切面编程)
Spring 框架
这个框架主要是为了简化web层的开发
SpringMVC通过对Servlet的封装,解决了Servlet繁琐的代码
接受请求
主要是负责接收参数
SringMVC框架做了
响应数据
返回页面的数据
前端控制器
由程序员来写
处理业务和业务层的调用
处理器
使用它之后web部分就分为两个部分
<mvc:annotation-driven/>
xml
applicationContext.xml开启mvc的注解支持
<servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
在web.xml中配置前端控制器
创建一个类,将类交给ioc容器,@Controller
/WEB-INF/page/success.jsp
编写一个方法用String为返回值
相当于@WebServlet
@RequestMapper
在方法上加一个注解
1.用户发送请求到前端控制器映射器
2.前端控制器请求获取处理器映射器
3.处理器映射器返回数据给前端控制器
4.前端控制器发送请求执行处理器
5.调用处理器,处理业务逻辑
6.返回数据和逻辑视图给处理器适配器
7.处理器适配器返回数据和逻辑视图返回给前端控制器
8.前端控制器根据逻辑视图寻找物理视图,将数据发送给视图解析器进行解析
9.将解析完成的数据返回给前端控制器
10.将数据渲染到物理视图
11.返回响应给用户
SpringMVC的执行流程
负责根据URL寻找对应的处理器方法
处理器映射器(HandlerMapping)
负责真正的去调用某个处理器方法
处理器适配器(HandlerAdpter)
负责将逻辑视图转换成物理视图
视图解析器(ViewResolver)
SpringMVC的三大组件
一个方法可以写多个地址
建立url和方法的映射
value/path
限定前端必须传递参数
params
限定请求方式:get/post/put/delete
直接传递参数就行,但是传递的参数必须和前端的值一样
<form action=\"/simpleParam\" method=\"post\"> 姓名:<input type=\"text\" name=\"username\"> <br> 年龄:<input type=\"text\" name=\"age\"> <br> <input type=\"submit\" value=\"简单类型提交\"></form>
@RequestMapping(\"/simpleParam\
例子
简单类型
调用:request.getParameterMap()
调用:beanUtils工具类封装User对象
原理:
对象类型和传递的参数类型名字必须一样
对象类型
request.getParameterValues(\"hobbies\")
原理
<form action=\"/arrayParam\" method=\"post\"> 抽烟:<input type=\"checkbox\" name=\"hobbies\" value=\"1\"> <br> 喝酒:<input type=\"checkbox\" name=\"hobbies\" value=\"2\"> <br> 烫头:<input type=\"checkbox\" name=\"hobbies\" value=\"3\"> <br> <input type=\"submit\" value=\"数组类型提交\"></form>
@RequestMapping(\"/arrayParam\")public String arrayParam(String[] hobbies){ // request.getParameterValues(\"hobbies\") System.out.println(Arrays.toString(hobbies)); return \"success\";}
数组类型
接收集合数据
<form action=\"/listParam\" method=\"post\"> 陪吃:<input type=\"checkbox\" name=\"hobbies\" value=\"1\"> <br> 陪喝:<input type=\"checkbox\" name=\"hobbies\" value=\"2\"> <br> 配shui:<input type=\"checkbox\" name=\"hobbies\" value=\"3\"> <br> <input type=\"submit\" value=\"集合类型提交\"></form>
@RequestMapping(\"/listParam\")public String listParam(@RequestParam List<String> hobbies){ System.out.println(hobbies); return \"success\";}
集合类型
接收请求
<!--乱码过滤器--><filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param></filter><filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
中文乱码过滤器
@DateTimeFormat(pattern=\"yyyy-MM-dd\")
普通日期格式
自定义格式转换器
日期格式
前端必须提供参数,否则会报错
required
给参数提供默认值
defaultValue
解决前后端参数名不一致
name
获取请求头信息
@RequestHeader
@RequestMapping(\"/servletApi\
写原生Servlet代码
请求方式必须是post
表单提交方式为:entype=\"multipart/form-data\"
必须有一个文件的类型
文件上传的三要素
前提条件是文件类型必须是MultipartFile 参数必须和name的属性名一样
SpringMVC内置了一个文件上传
<!--文件上传工具包--><dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version></dependency>
1.导入坐标
<!-- 文件上传解析器 id=\"multipartResolver\" 这个值是固定的 --> <bean id=\"multipartResolver\" class=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\"> <!-- 限制文件大小,单位B 1KB = 1024B 1MB = 1024KB --> <property name=\"maxUploadSize\" value=\"1000000\"></property> </bean>
2.配置
<form action=\"/fileUpload\" method=\"post\" enctype=\"multipart/form-data\"> 姓名:<input type=\"text\" name=\"username\"> <br> 头像:<input type=\"file\" name=\"picFile\"> <br> <input type=\"submit\" value=\"提交\"></form>
3.前端三要素
@RequestMapping(\"/fileUpload\
4.方法接收文件
文件上传
@RequestMapper(\"/quick\")public String quick(){sout(\"xxx\");return \"success\";}
<bean class=\"InternalResourceViewResolver\"><property name=\"prefix\" value=\"/WEB-INF/page\"/><property name=\"suffix\" value=\".jsp\"/></bean>
简单方式
原生Servlet的API
页面跳转
同步交互
@RequestMapping(\"/quick\") public String quick() { System.out.println(\"quick启动了\"); return \"success\"; }
原生api
@RequestMapping(\"/forwardApi\")public String forwardApi() {return \"forward:/WEB-INF/pages/error.jsp\";}
forward
@RequestMapping(\"/requestApi\
@RequestMapping(\"/quick\") public ModelAndView quick(ModelAndView andView) { andView.addObject(\"message\
ModelAndView
@RequestMapping(\"/quick\") public String quick(Model andView) { andView.addAttribute(\"message\
Model
携带数据
servlet原生 API
redirect关键字
关键字
@RequestBody
用于将controller方法返回的对象通过转换器转换为指定的格式(通常为json)之后,写入到response对象的响应体中。
ajax异步交互
@PathVariable
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
查询
@GetMapping
添加
@PostMapping
修改
@PutMapping
删除
@DeleteMapping
resful风格
定义@Component交给IOC容器
实现HandlerExceptionResovler
自定义异常处理器
第一种
@ControllerAdvice
第二种
<!--捕获并处理异常--><error-page> <error-code>404</error-code> <location>/WEB-INF/404.jsp</location></error-page>
第三种(解决页面404问题)
异常处理
/* 预处理方法:拦截请求 参数: request response handler:用户访问的目标方法 返回结果: true:放行 false:拦截 */
拦截器
异步交互
Spring MVC框架
SSM整合
springboot为我们简化了很多的操作和配置,他的理念是约定大于配置,我们只要按照他的规范,来编写代码就行了
版本锁定
起步依赖
自定配置
Springboot的功能
自定义配置文件
如果我们想自己配置一些信息
SpringBoot启动依次加载:yml、yaml、properties
application*.yml
applicatino*.yaml
application.properties
SpringBoot的配置文件
Spring Boot框架
1.继承BaseMapper<类名>
2.在实体类映射对象字段的表名,@TableName(\"tb_user\")
3.但是插入数据后id不会自增,会写入一个随机的数,可以使用@TableId()
@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }}
分页拦截器
Mybatis Plus
Dubbo服务管理
Zookeeper注册中心
Docker
小项目
Java 框架
超文本传输协议
Http
传输控制协议
TCP
用户数据报协议
UDP
远程过程调用
RPC
面向对象
OOP
面向函数编程
OOF
Context-type: \"xxx/xxx\"多用途互联网邮件扩展类型(网络传输的文件类型)
MIME
基于角色的权限控制
RBAC
Java常用缩写单词
对于不够用的 方法进行增强
1.定义一个普通类,然后让其被包装对象具有相同的行为(实现其接口)
2.类中定义一个成员,让其接收其被包装对象
3.定义一个构造函数,用于接收被包装对象
4.对于需要增强的方法,提供需要增强的代码
5.对于不需要增强的方法,调用被包装对象的方法
实现步骤
装饰设计模式
工厂设计模式
类加载的时候就创建对象
懒汉式
使用时,创建对象
饿汉式
单例 设计模式
设计模式
Linux是一种自由和开放源代码的Unix操作系统
1991年10月5日
林纳斯·托瓦兹
该操作系统的内核是由
任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。
Linux介绍
普通用户的家目录,每一个用户的家目录通常默认为/home/USERNAME
~ :代表当前使用者的家目录
home
管理员工作目录
/root
系统启动相关的文件
etc
\t可执行文件,用户命令
\t可执行文件,管理命令
sbin
/usr/local:第三方软件
/usr/bin/:用户指令
/usr/lib/:应用软件的函式库、目标文件
一些网络命令都会放在这里
/usr/sbin/:
c/c++等程序语言的档头(header)与包含档(include)放置处,当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档。
/usr/include/:
/usr
srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。
/srv
这是让一般使用者或者是正在执行的程序暂时放置档案的地方。
这个目录是任何人都能够存取的
所以你需要定期的清理一下。当然,重要资料不可放置在此目录啊。
/tmp
该文件系统是内核设备树的一个直观反映。
/sys
静态库:单在程序中的库,其他程序不能使用该库文件
动态库:在内存中,任何用到该库的程序都可以使用
\t库文件
/lib
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
/var
在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。
/dev
DVD/软碟的挂在目录
挂载点目录,移动设备
/media
\t挂载点目录,额外的临时文件系统
/mnt
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
/selinux
/(根目录)
以详细形式查询当前目录下所有文件和目录,不包括隐藏文件和目录
ls -l
-a 以精简形式查询当前目录下所有文件和目录,包括隐藏文件和目录
-a
相当于ls -l
ll
ls
cd 绝对路径 /一级目录/二级目录/...
cd 相对路径\t\t ./ 当前目录\t\t\t../ 上级目录
切换到/目录下
cd /目录
进入当前子目录
cd 目录
当前用户的主目录
cd ~
根目录
cd\t/
上一次访问的目录
cd \t-
上一级目录
cd\t..
缺省(默认)当前用户目录
cd
一次性创建多级目录,如果目录存在不会覆盖
-p
mkdir
mkdir aaa 在当前目录下创建aaa目录,相对路径 mkdir ./bbb 在当前目录下创建bbb目录,相对路径 mkdir /ccc 在根目录下创建ccc目录,绝对路径 mkdir /ddd/eee\t 在根目录下创建ddd目录和eee子目录
案例
mkdir(创建目录)
查询根目录下(包括子目录),名为b的目录和文件
find / -name 'b'
查询根目录下(包括子目录),名以b开头的目录和文件
find / -name 'b*'
-name
find(搜索命令)
mv \t旧目录\t 新目录
修改文件名
mv aaa aaaa
将根目录下的aaaa目录,移动到bbb目录下,在bbb目录下也叫aaaa目录
mv /aaaa /bbb
将当前目录下的bbb目录,移动到usr目录下,且修改名为bbbb\t
mv bbb usr/bbbb
修改文件名剪切目录
mv命令
-r 递归处理,将指定目录下的文件与子目录一并处理
将/目录下的aaa目录复制到/bbb目录下,在/bbb目录下名字为aaa
cp -r /aaa /bbb
将/目录下的aaa目录复制到/bbb目录下,且修改名为aaaa
cp -r /aaa /bbb/aaaa
cp -r
cp复制命令
-p 删除目录及其父目录
删除bbb目录下ccc目录
rmdir bbb/ccc
删除bbb目录和ccc子目录
rmdir -p bbb/ccc
rmdir删除目录
系统命令
cat /proc/cpuinfo也可看查看到
lscpu
cpu信息
cat /proc/meminfo
free
查看内存大小
cat /proc/partitions
lsblk
查看硬盘和分区情况
uname -a
查看内核/操作系统/CPU信息
cat /etc/redhat-release
cat /etc/os-release
查看发行版本
date
显示和设置系统时间
hostname
查看计算机名
ps -ef
查看系统进程
ps -ef|grep xxx
查询某个进程
kill -9 [pid]
强制杀死某个进程
netstat -lnp|grep 端口号
检查那个端口被占用
进程
查看硬件信息
vi
systemctl stop firewalld
关闭防火墙
systemctl start firewalld
启动防火墙
firewall-cmd --permanent --zone=public --add-port=3306/tcp
span style=\
开放端口
firewall-cmd --remove-port=3306/tcp --permanent
关闭端口
firewall-cmd --reload
重新加载防火墙配置
firewall-cmd --query-port=3306/tcp
查看端口是否开启
firewall-cmd --list-ports
查看已开启的端口
防火墙相关
rpm -qa
查看所有安装的软件包
chkconfig --list
列出所有系统服务
chkconfig --list | grep on
列出指定的系统服务
应用命令
Linux
大型公司
基础硬件(内存,网路,硬盘xxx) 软件
基础设施即服务
Iass
中型公司
不关注基础设置(计算机+++软件)
软件平台即服务
pass
小型公司
都用别人的
软件即服务
sass
云服务的三种模式
货代云平台
1.简介
sass系统
项目
Java系统学习
0 条评论
回复 删除
下一页