java基础知识总结

 

 

linux命令:

1.
cd    切换目录
借助cd命令(切换目录),它会进入到fileA目录。
# cd /fileA

2.
users   命令显示了目前已登录的用户  

3.
who   命令仅仅返回用户名称、日期、时间和主机信息
 -b:显示上一次系统重启日期和时间。

 -r:显示当前的运行级别。

 -a,–all:显示累积的所有信息。

4.
free命令显示了闲置内存、总内存和交换内等方面的信息,单位是字节
# free

5.
cp命令
# cp -p fileA fileB
将文件从来源拷贝到目的地,保留同一种模式。


将fileA更名为fileB; -i选项会在覆盖前提示;如果文件已经存在,会要求予以确认。

6.
.vi命令
对大多数类似UNIX的操作系统而言,vi是最流行的文本编辑器,下面例子使用-R选项,打开只读方式的文件,按“:q”即可退出vi窗口。



7.
ps命令显示了系统中运行的进程方面的信息;下面这个例子只显示init进程。

# ps -ef | grep init

8.
使用kill命令来终结进程;先使用ps命令找到进程id,如下所示,然后使用kill -9命令,终止进程。

# ps -ef | grep init

9.
rm命令用来清除或删除文件,并不提示予以确认。
# rm filename


10.
mkdir命令用来在Linux下创建目录。

# mkdir directoryname


11.
# mv -i fileA fileB



十二:
redis支持数据类型
hash
list
set
treeset
string

aof原理是将Reids的操作日志以追加的方式写入文件
  和rdb 快照 将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化






十三:
mysql   
默认 可重复的事务
innodb
myisam

 

一、为什么用自增列作为主键

1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。

如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。

如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

2、什么情况下应不建或少建索引

1、表记录太少

2、经常插入、删除、修改的表

3、数据重复且分布平均的表字段,假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。

4、经常和主字段一块查询但主字段索引值比较多的表字段


事务的特性:原子性、一致性、隔离性、持久性

1、事务的原子性
一组事务,要么成功;要么撤回。

2、一致性
有非法数据(外键约束之类),事务撤回。

3、隔离性
事务独立运行。
一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。
事务的100%隔离,需要牺牲速度。

4、持久性
软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。
可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。



2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读
1、脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
例如:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
与此同时,
事务B正在读取张三的工资,读取到张三的工资为8000。
随后,
事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
最后,
事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。

2、不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
例如:
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
与此同时,
事务B把张三的工资改为8000,并提交了事务。
随后,
在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。

3、幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
例如:
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,
事务B插入一条工资也为5000的记录。
这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。

4、提醒
不可重复读的重点是修改:
同样的条件,你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除:
同样的条件,第 1 次和第 2 次读出来的记录数不一样

(    数据库通过锁机制解决并发访问的问题。根据锁定对象不同:分为行级锁和表级锁;根据并发事务锁定的关系上看:分为共享锁定和独占锁定,共享锁定会防止独占锁定但允许其他的共享锁定。而独占锁定既防止共享锁定也防止其他独占锁定。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete和selsct for update语句都会隐式采用必要的行锁定。

但是直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。 )



3、事务隔离级别:读未提交、读提交、可重复读、串行化
4、不同事务隔离级别的区别:
读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
读提交:一个事务提交之后,它所做的变更才可以被别的事务看到
可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
5、配置事务隔离级别的方法:修改启动参数transaction-isolation(oracle默认是读提交,mysql默认可重复读)
6、事务隔离的实现:每条记录在更新的时候都会同时记录一条回滚操作。同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制
(MVCC)。






十五:



#{} 和 ${} 之间最大的差别就是 #{}会在使用的时候被加上 ‘’ 引号,
 ${}直接传值,不做任何处理 SQL非法注入就是依赖${}的这种特性延
#{} 这种取值是编译好SQL语句再取值
${} 这种是取值以后再去编译SQL语句

#{}方式能够很大程度防止sql注入。
$方式无法防止Sql注入。
$方式一般用于传入数据库对象,例如传入表名.
一般能用#的就别用$.


hibernate 是如何工作的?
•    读取并解析配置文件。
•    读取并解析映射文件,创建 SessionFactory。
•    打开 Session。
•    创建事务。
•    进行持久化操作。
•    提交事务。
•    关闭 Session。
•    关闭 SessionFactory



 为什么要使用 hibernate?
•    hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。
•    hibernate 是一个优秀的 ORM 实现,很多程度上简化了 DAO 层的编码功能。
•    可以很方便的进行数据库的移植工作。
•    提供了缓存机制,是程序执行更改的高效。
114. 什么是 ORM 框架?
ORM(Object Relation Mapping)对象关系映射,是把数据库中的关系数据映射成为程序中的对象。
使用 ORM 的优点:提高了开发效率降低了开发成本、开发更简单更对象化、可移植更强。
115. hibernate 中如何在控制台查看打印的 SQL 语句?
在 Config 里面把 hibernate. show_SQL 设置为 true 就可以。但不建议开启,开启之后会降低程序的运行效率。
116. hibernate 有几种查询方式?
三种:hql、原生 SQL、条件查询 Criteria。


Hibernate的优点:

1、hibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。

2、功能强大,数据库无关性好,O/R映射能力强,需要写的代码很少,开发速度很快。

3、有更好的二级缓存机制,可以使用第三方缓存。

4、数据库移植性良好。

5、hibernate拥有完整的日志系统,hibernate日志系统非常健全,涉及广泛,包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等

Hibernate的缺点:

1、学习门槛高,精通门槛更高,程序员如何设计O/R映射,在性能和对象模型之间如何取得平衡,以及怎样用好Hibernate方面需要的经验和能力都很强才行

2、hibernate的sql很多都是自动生成的,无法直接维护sql;虽然有hql查询,但功能还是不及sql强大,见到报表等变态需求时,hql查询要虚,也就是说hql查询是有局限的;hibernate虽然也支持原生sql查询,但开发模式上却与orm不同,需要转换思维,因此使用上有些不方便。总之写sql的灵活度上hibernate不及mybatis。

Mybatis的优点:

1、易于上手和掌握,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

2、sql写在xml里,便于统一管理和优化, 解除sql与程序代码的耦合。

3、提供映射标签,支持对象与数据库的orm字段关系映射

4、 提供对象关系映射标签,支持对象关系组建维护

5、提供xml标签,支持编写动态sql。

6、速度相对于Hibernate的速度较快

Mybatis的缺点:

1、关联表多时,字段多的时候,sql工作量很大。

2、sql依赖于数据库,导致数据库移植性差。

3、由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。

4、对象关系映射标签和字段映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。

5、DAO层过于简单,对象组装的工作量较大。

6、不支持级联更新、级联删除。

7、Mybatis的日志除了基本记录功能外,其它功能薄弱很多。

8、编写动态sql时,不方便调试,尤其逻辑复杂时。

9、提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。





十六:
spring Cloud核心组件,在微服务架构中,分别扮演的角色
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里

Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台 nginx

Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求

Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题

Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

 

十七:
java中的集合类可以分为两大类:一类是实现Collection接口;另一类是实现Map接口。
18. Java 容器都有哪些?
Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
•    Collection
  •               List
     •                     ArrayList
•                      LinkedList
•                     Vector
•                      Stack
•               Set
•                       HashSet
•                       LinkedHashSet
•                       TreeSet
•     Map
•                HashMap
•                            LinkedHashMap
•                TreeMap
•                ConcurrentHashMap
•                Hashtable






ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用。ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据  ,移动索引。ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList用在查询比较少而插入删除比较多的情况


LinkedList是一个双向链表的数据结构实现。他实现了List接口,所以也可以调用和ArrayList的所有方法,只是底层实现的不一样而已。  ArrayList扩容的方式是指向新数组,而LinkedList是进行创建节点。共同点 : 存储有序的,可重复的数据。



HashMap 和 Hashtable 的区别
线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
初始容量大小和每次扩充容量大小的不同 : ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的tableSizeFor()方法保证,下面给出了源代码)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。
底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
HasMap 中带有初始容量的构造函数:



十八:



Java 序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来。
以下情况需要使用 Java 序列化:
•    想把的内存中的对象状态保存到一个文件中或者数据库中时候;
•    想用套接字在网络上传送对象的时候;
•    想通过RMI(远程方法调用)传输对象的时候。


 如何避免 SQL 注入?
•    使用预处理 PreparedStatement。

•    使用正则表达式过滤掉字符中的特殊字符。

•    get 请求会被浏览器主动缓存,而 post 不会。
•    get 传递参数有大小限制,而 post 没有。
•    post 参数传输更安全,get 的参数会明文限制在 url 上,post 不会


spring 常用的注入方式有哪些?
•    setter 属性注入
•    构造方法注入
•    注解方式注入


•    声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。
•    编码方式:提供编码的形式管理和维护事务。



说一下 spring mvc 运行流程?
•    spring mvc 先将请求发送给 DispatcherServlet。
•    DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。
•    DispatcherServlet 再把请求提交到对应的 Controller。
•    Controller 进行业务逻辑处理后,会返回一个ModelAndView。
•    Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。
•    视图对象负责渲染返回给客户端


 spring mvc 有哪些组件?
•    前置控制器 DispatcherServlet。
•    映射控制器 HandlerMapping。
•    处理器 Controller。
•    模型和视图 ModelAndView。
•    视图解析器 ViewResolver。



 @RequestMapping 的作用是什么?
将 http 请求映射到相应的类/方法上。



 @Autowired 的作用是什么?
@Autowired 它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过@Autowired 的使用来消除 set/get 方法。



spring boot 核心的两个配置文件:
•    bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,且 boostrap 里面的属性不能被覆盖;
•    application (. yml 或者 . properties):用于 spring boot 项目的自动化配置。



什么是 spring cloud?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。


•    Eureka:服务注册于发现。
•    Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
•    Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
•    Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
•    Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。


注解:

1、@Scheduled支持多种类型的计划任务,包含cron、fixDelay、fixRate等。
2、@SpringBootApplication : 是Sprnig Boot项目的核心注解,目的是开启自动配置

3、使用服务发现的时候提到了两种注解,
一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致。

4、@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。

5、@Param 注解 在传入参数时候添加该注解可以对传入参数进行自动赋值

6、对返回的值不需要所有参数都进行返回 @JsonIgnore

7、@ResponseBody
表示输出的是json格式的数据。

8、@Autowired
属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值


9、@Controller 注解,
在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加@ResponseBody注解

10、@RestController
相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

11、使用@RequestMapping 注解映射请求路径
可以将HTTP请求映射给controller
来处理,包括返回视图页面的controller和Rest服务的controller。

你可以使用@RequestMapping注解来将请求URL映射到整个类上
或某个特定的方法上,即@RequestMapping 既可以定义在类上,
也可以定义方法上

value: 指定请求的实际地址, 比如 /action/info之类
method: 指定请求的method类型, GET、POST、PUT、DELETE等
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
params: 指定request中必须包含某些参数值是,才让该方法处理
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求



git命令:
git pull   拉回远程版本库的提交

git push    推送至远程版本库
git add  添加至暂存区
git branch 查看本地所有分支
git status 查看当前状态
git commit 提交
git branch -a 查看所有的分支
git rm 文件名(包括路径) 从git中删除指定文件
git config --list 看所有用户
git log 看你commit的日志
git checkout dev 切换到本地dev分支

冲突:
处理方式:

1、先将本地修改存储起来

    $ git stash

这样本地的所有修改就都被暂时存储起来 。使用git stash list可以看到保存的信息

2、pull内容

暂存了本地修改之后,就可以pull了。

    $ git pull

3、还原暂存的内容

    $ git stash pop stash@{0}

 

二十:

Swagger是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。

这个解释简单点来讲就是说,swagger是一款可以根据resutful风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。

二:为什么要使用swaager?
2.1:对于后端开发人员来说

    不用再手写WiKi接口拼大量的参数,避免手写错误

    对代码侵入性低,采用全注解的方式,开发简单

    方法参数名修改、增加、减少参数都可以直接生效,不用手动维护

    缺点:增加了开发成本,写接口还得再写一套参数配置

2.2:对于前端开发来说

    后端只需要定义好接口,会自动生成文档,接口功能、参数一目了然


    联调方便,如果出问题,直接测试接口,实时检查参数和返回值,就可以快速定位是前端还是后端的问题

2.3:对于测试

    对于某些没有前端界面UI的功能,可以用它来测试接口

    操作简单,不用了解具体代码就可以操作

    操作简单,不用了解具体代码就可以操作

三:如何搭一个swagger
3.1:引入swagger的依赖

目前推荐使用2.7.0版本,因为2.6.0版本有bug,而其他版本又没有经过验证



引入依赖
编写SwaggerConfig
添加注解
@Configuration
@EnableSwagger2
 在需要添加的controller类和方法中加上api注解

加在类上
@Api(value = "字典操作接口",tags = {"字典常量操作"})
加在方法上
@ApiOperation(value = "删除字典类型",notes = "")
@ApiImplicitParam(name = "id",value = "字典ID",required = true,dataType = "String")
加好注解后,重启应用
访问路径:应用地址+端口+swagger-ui.html 例如http://localhost:8800/swagger-ui.html

 

 

 

整理不易,如果觉得不错就赞吧

 

posted @ 2021-05-14 16:20  风骚羊肉串  阅读(59)  评论(0编辑  收藏  举报