1.Spring框架概述 是什么 是一个轻量级的开源的JavaEE框架 解决企业应用开发的复杂性 有两个核心部分:IOC和AOP IOC:控制反转,把创建对象的过程交给Spring进行管理 AOP:面向切面,不修改源代码进行功能增强 特点 方便解耦,简化开发 AOP的支持方便程序的测试 方便和其他框架进行整合 降低Java EE API的开发难度 方便事务的操作 入门案例 1.下载地址: https://repo.spring.io/release/org/springframework/spring/ #spring-5.2.6.RELEASE-dist.zip 28-Apr-2020 08:22 82.25 MB
2.使用IDEA创建project
3.导入Spring的jar包 commons-logging-1.1.1.jar spring-beans-5.2.6.RELEASE.jar spring-context-5.2.6.RELEASE.jar spring-core-5.2.6.RELEASE.jar spring-expression-5.2.6.RELEASE.jar
4.创建普通类,在这个类创建普通方法
1 2 3 4 5 6 package com.bean1;
public class User {
public void add(){
System.out.println("hello world!");
}
}
5.创建Spring配置文件,在配置文件配置创建的对象 (1)Spring配置文件使用XML格式
1 2 3 4 5 6 7 8 <?
java.sql.SQLException: The server time zone value ‘�й���ʱ��’ is unrecognized 参考
解决方法:
1 在URL上加上:?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
Establishing SSL connection without server‘s identity verification is not recommende 参考
解决方法
1 2 3 4 5 6 7 在你连接数据库的url后面加上参数即可
jdbc:mysql://localhost:3306/testdb?useSSL=false
使用上述标红的URL,即可解决该警告,标红参数前面为你数据库连接URL,如果有多个参数记得用&连接,例如
jdbc:mysql://localhost:3306/testdb?characterEncoding=utf-8&useSSL=false
template might not exist or might not be accessible by any of the configured Template Resolvers 解决方法:
在application.yaml中设置
1 2 3 spring:thymeleaf:prefix:classpath:/templates/ 注意:thymeleaf 的classpath要多一个斜杠的,漏斜杠就会有问题
SLF4J:Failed to load class “org.
技术组合:
后端:Spring Boot,JPA,thymeleaf模板 数据库:MySQL 前端UI:Semantic UI框架 工具与环境:
IDEA Maven 3 JDK 8 Axure RP8 –>页面原型设计工具 异常处理 拦截异常:自定义400,500, error异常页面
1 2 3 4 5 6 7 8 9 10 <!DOCTYPEhtml>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
<h1>404</h1>
</body>
</html>
1 2 3 4 5 6 7 8 9 10 11 <!DOCTYPEhtml>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>500</title>
</head>
<body>
<h1>500</h1>
</body>
</html>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!
参考
「回溯算法」与「深度优先遍历」都有「不撞南墙不回头」的意思。我个人的理解是:「回溯算法」强调了「深度优先遍历」思想的用途,用一个 不断变化 的变量,在尝试各种可能的过程中,搜索需要的结果。强调了 回退 操作对于搜索的合理性。
递归之后需要做和递归之前相同的逆向操作 问题1 给定一个 没有重复 数字的序列,返回其所有可能的全排列。
我们尝试在纸上写 333 个数字、444 个数字、555 个数字的全排列,相信不难找到这样的方法。以数组 [1, 2, 3] 的全排列为例。
先写以 111 开头的全排列,它们是:[1, 2, 3], [1, 3, 2],即 1 + [2, 3] 的全排列(注意:递归结构体现在这里); 再写以 222 开头的全排列,它们是:[2, 1, 3], [2, 3, 1],即 2 + [1, 3] 的全排列; 最后写以 333 开头的全排列,它们是:[3, 1, 2], [3, 2, 1],即 3 + [1, 2] 的全排列。 总结搜索的方法:按顺序枚举每一位可能出现的情况,已经选择的数字在 当前 要选择的数字中不能出现。按照这种策略搜索就能够做到 不重不漏。这样的思路,可以用一个树形结构表示。
每一个结点表示了求解全排列问题的不同的阶段,这些阶段通过变量的「不同的值」体现,这些变量的不同的值,称之为「状态」; 使用深度优先遍历有「回头」的过程,在「回头」以后, 状态变量需要设置成为和先前一样 ,因此在回到上一层结点的过程中,需要撤销上一次的选择,这个操作称之为「状态重置」;
NoSQL数据库的四大分类 KV键值对 文档类数据库 列存储数据库 图关系数据库 Redis简要介绍 Redis : REmote DIctionary Server(远程字典服务器),是一个高性能的(key/value)分布式内存数据库,基于内存运行,是当下最热门的NoSQL数据库之一,也被人们称为数据结构服务器。
Redis的三大特点 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 Redis不仅仅支持简单的key-value类型的数据,同时好提供list,set,zset,hash等数据结构的存储 Redis支持数据的备份,即master-slave模式的数据备份 Redis的使用场景 内存存储和持久化;Redis支持异步将内存中的数据存放写到磁盘上,同时不影响继续服务
取最新N个数据的操作,如:可以将最新10条评论的ID放在Redis的list集合模拟类似HttpSession这种需要设定过期时间的功能
发布、订阅消息系统
定时器、计数器
可以对String进行自增自减运算,从而实现计数器功能。
redis这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量
缓存
将热点数据放入内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率
会话缓存
可以使用redis来统一存储多台应用服务器的回话信息
当应用服务器不再存储用户的会话信息,也就不在具有状态,一个用户可以请求任意一个应用服务器,从而实现高可用性以及可伸缩性。
redis与memcached 两者都是非关系型内存键值数据库,主要有以下不同
数据类型
memcached仅支持字符串类型,而redis支持五种不同的数据类型,可以更灵活地解决问题
数据持久化
redis支持两种持久化策略:RDB快照和AOF日志,而memcached不支持持久化
分布式
memcached不支持分布式,只能通过再客户端使用一致性哈希来实现分布式存储
redis实现了分布式的支持
内存管理机制
在redis中,并不是所有数据都一直存储在内存中,可以将一些很久没用的value交换到磁盘,而memcached的数据则一直在内存中。 memmcached将内存分割为特定长度的块来存储数据,以完全解决内存碎片的问题,但是这种方式会使得内存的利用率不高,例如块的大小为128bytes,只存储100bytes的数据,那么剩下的28bytes就浪费掉了 Redis相关知识 单进程 默认16个数据库,类似数组下标从零开始,初始默认使用0号 Select命令切换数据库 Dbsize查看当前数据库的key数量,keys *: 查看所有的key,keys k?:可以支持条件选择 flushall:清空所有的数据库(慎用) flushdb:清空当前库 同意密码管理,16个库都是同样的密码 redis索引都是从零开始 默认端口是6379 Redis的数据类型 Redis键(key)
在这里,复制的意思是指 深拷贝(Deep Copy),类似我们常用的“复制粘贴”,事实上,与此对应的还有 浅拷贝,它们的区别是:
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象 1.普通单向链表的定义
1 2 3 4 5 6 7 8 9 10 // Definition for a Node. class Node { int val; Node next; public Node(int val) { this.val = val; this.next = null; } } 给定链表的头结点head,复制链表需要遍历链表,每一轮建立新节点+构建前驱结点pre和当前结点node的引用指向即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Solution{ public Node copy(Node head){ Node cur=head; Node dum=new Node(0);//随意初始化一个结点 Node pre=dum; while(cur!