Java基础--------------------------------------------------------------------------------------------------1
基本数据类型---------------------------------------------------------------------------------------------1
包装类型---------------------------------------------------------------------------------------------------1
集合---------------------------------------------------------------------------------------------------------2
多线程------------------------------------------------------------------------------------------------------2
生命周期---------------------------------------------------------------------------------------------------2
1、什么是GC?为什么要有GC---------------------------------------------------------------------3
2、final,finally和finalize的区别?-----------------------------------------------------------------3
3、什么是单例模式?实现步骤-----------------------------------------------------------------------3
4、ArrayList和LinkedList有何区别?-------------------------------------------------------------3
5、HashMap和Hashtable的区别?---------------------------------------------------------------3
6、Iterater和ListIterator之间有什么区别?------------------------------------------------------4
7、创建线程的方式?-----------------------------------------------------------------------------------4
8、什么是死锁?-----------------------------------------------------------------------------------------4
9、wait()与sleep()的区别?---------------------------------------------------------------------------4
10、什么是ThreadLocal?ThreadLocal和Synchonized的区别?-------------------------4
JavaWeb---------------------------------------------------------------------------------------------------5
Ajax----------------------------------------------------------------------------------------------------------5
JQuery------------------------------------------------------------------------------------------------------5
Cookie------------------------------------------------------------------------------------------------------5
Session-----------------------------------------------------------------------------------------------------6
1、原生态Ajax执行流程?----------------------------------------------------------------------------6
2、转发(forward)和重定向(redirect)的区别?----------------------------------------------6
3、怎么防止表单重复提交?---------------------------------------------------------------------------7
4、web.xml文件中可以配置哪些内容?------------------------------------------------------------7
数据库(MySQL)----------------------------------------------------------------------------------------7
连接查询-----------------------------------------------------------------------------------------------------7内连接--------------------------------------------------------------------------------------------------------7
外连接--------------------------------------------------------------------------------------------------------7
联合查询-----------------------------------------------------------------------------------------------------8
索引-----------------------------------------------------------------------------------------------------------9
数据库引擎--------------------------------------------------------------------------------------------------9
存储过程-----------------------------------------------------------------------------------------------------9
1、JDBC编程的步骤?---------------------------------------------------------------------------------10
2、事务的ACID是什么?事务并发会产生哪些问题?------------------------------------------10
3、数据库性能优化有哪些方式?---------------------------------------------------------------------10
框架部分-----------------------------------------------------------------------------------------------------11
Spring--------------------------------------------------------------------------------------------------------11
Spring的理解-----------------------------------------------------------------------------------------------11
SpringBean生命周期------------------------------------------------------------------------------------12
Spring中的设计模式--------------------------------------------------------------------------------------12
Spring注解--------------------------------------------------------------------------------------------------12
Spring事务--------------------------------------------------------------------------------------------------13
SpringMVC--------------------------------------------------------------------------------------------------14
SpringMVC执行流程-------------------------------------------------------------------------------------14
springmvc常用注解---------------------------------------------------------------------------------------14
SpringMVC和Struts2对比-----------------------------------------------------------------------------15
Mybatis-------------------------------------------------------------------------------------------------------15
Mybatis的理解---------------------------------------------------------------------------------------------15
Mybatis缓存------------------------------------------------------------------------------------------------16
SpringBoot--------------------------------------------------------------------------------------------------16
SpringBoot简介-------------------------------------------------------------------------------------------16
SpringBoot特性-------------------------------------------------------------------------------------------16
SpringBoot核心-------------------------------------------------------------------------------------------16
SpringCloud------------------------------------------------------------------------------------------------17
SpringCloud简介-----------------------------------------------------------------------------------------17
SpringCloud核心组件-----------------------------------------------------------------------------------17微服务-------------------------------------------------------------------------------------------------------17
Docker-------------------------------------------------------------------------------------------------------17
Docker简介------------------------------------------------------------------------------------------------17
Docker理解------------------------------------------------------------------------------------------------17
Redis---------------------------------------------------------------------------------------------------------24
Redis简介--------------------------------------------------------------------------------------------------24
Redis支持的数据类型-----------------------------------------------------------------------------------24
Redis应用场景--------------------------------------------------------------------------------------------24
Redis持久化-----------------------------------------------------------------------------------------------24
Redis的优势-----------------------------------------------------------------------------------------------24
Solr-----------------------------------------------------------------------------------------------------------25
Solr简介----------------------------------------------------------------------------------------------------25
Solr配置----------------------------------------------------------------------------------------------------25
倒排索引----------------------------------------------------------------------------------------------------25
RabbitMQ/ActiveMQ-------------------------------------------------------------------------------------26
RabbitMQ简介--------------------------------------------------------------------------------------------26
RabbitMQ特点--------------------------------------------------------------------------------------------26
RabbitMQ工作模式--------------------------------------------------------------------------------------26
ActiveMQ简介---------------------------------------------------------------------------------------------27
ActiveMQ工作模式---------------------------------------------------------------------------------------27MQ对比-----------------------------------------------------------------------------------------------------27
Dubbo--------------------------------------------------------------------------------------------------------27
Dubbo简介-------------------------------------------------------------------------------------------------27
Dubbo开发流程-------------------------------------------------------------------------------------------28
FastDFS-----------------------------------------------------------------------------------------------------28
FastDFS简介----------------------------------------------------------------------------------------------28
文件上传流程-----------------------------------------------------------------------------------------------29
Nginx---------------------------------------------------------------------------------------------------------29
Nginx简介--------------------------------------------------------------------------------------------------29
Nginx功能--------------------------------------------------------------------------------------------------29
Quartz-------------------------------------------------------------------------------------------------------30
Quartz简介------------------------------------------------------------------------------------------------30
Quartz核心元素------------------------------------------------------------------------------------------30
数据库笔试题----------------------------------------------------------------------------------------------31
用一条SQL语句查询出每门课都大于80分的学生姓名---------------------------------------31
所有球队之间的比赛组合-------------------------------------------------------------------------------31
航空网的几个航班查询题-------------------------------------------------------------------------------32
包装类型是对基本数据类型不足之处的补充。
基本数据类型的传递方式是值传递,而包装类型是引用传递,同时提供了很多数据类型间转换的方法。
Java1.5以后可以自动装箱和拆箱。
List:有序、可重复。可以通过索引快速查找,但进行增删操作时后续的数据需要移动,所以增删速度慢。
Set:无序、不可重复。
Map:键值对、键唯一、值不唯一。Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
新建状态:一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序start这个线程。
运行状态:当一个新状态的线程被start以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务
就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。
终止状态:一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。
GC(GarbageCollection)是垃圾收集的意思,负责清除对象并释放内存。Java提供的GC功能可以自动检测对象是否超过作用域从而达到自动回收内存的目的,从而防止内存泄漏。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是object类的一个方法,在垃圾收集器执行的时候会调用这个对象回收的方法,工垃圾收集时其他资源的回收,比如关闭文件。
单例模式保证了对象唯一。分为懒汉式(在类加载时不初始化)和饿汉式(在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快)。
实现步骤:私有化构造函数、创建一个静态的私有对象、提供公共的访问方法。
ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构;对于随机访问get和set,ArrayList较优,因为LinkedList要移动指针;对于新增和删除操作add和remove,LinedList较优,因为ArrayList要移动数据。
HashMap允许空键值,Hashtable不允许;
HashMap继承自AbstractMap,Hashtable继承自Dictionary类,两者都实现了Map接口;HashMap的方法不是同步的,Hashtable的方法是同步的。
Iterator用来遍历Set和List集合,而ListIterator只能遍历List;Iterator只可以向前遍历,而LIstIterator可以双向遍历;ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
继承Thread类
实现Runnable接口
使用Executor框架
两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。
sleep()来自Thread类,wait()来自Object类;
调用sleep()方法,线程不会释放对象锁。而调用wait方法线程会释放对象锁;
sleep()睡眠后不出让系统资源,wait让其他线程可以占用CPU;
或者notifyAll()使用。
线程局部变量。是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。
AJAX=AsynchronousJavaScriptandXML(异步JavaScript和XML)。
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用Javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。
JQuery是一个JavaScript库。功能包括HTML元素选取和操作、CSS操作、HTML事件函数、JavaScript特效和动画、HTMLDOM遍历和修改、AJAX和Utilities。除此之外,JQuery还提供了大量插件。
基础语法:$(selector).action()。
选择器:主要分四大选择器,分别是基本选择器、层次选择器、过滤选择器、属性过滤选择器。
事件:例如click()、dblclick()、mouseenter()、mouseleave()、mousedown()等。
cookie实际上一段的文本信息,客户端请求服务器。如果服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户的状态。服务器还可以根据需要修改cookie的内容。cookie生命周期:
cookie的maxAge决定cookie的生命周期,单位为秒(second)。cookie通过getMaxAge()方法和setMaxAge()方法来获得maxAge属性,如果maxAhe属性为正,则表示cookie会在maxAge秒之后自动失效。如果maxAge属性为负,则说明cookie仅在本浏览器窗口和本窗口打开的子窗口下有效,关闭窗口cookie则失效。maxAge的默认值是-1当maxAge的值为0时,表示删除cookie。
session也是一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器是时候把客户端信息以某种形式记录在服务器上,这就是session中查找该客户的状态。
session生命周期:
session保存在服务器端,为了获得更高的存取速度,服务器一般把session放在内存。每个用户都会有一个独立的session,如果session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。
session在用户第一次访问服务器的时候自动创建,需要注意只有访问JSP,Servlet等程序时才会创建session;只要访问HTML、IMAGE等静态资源不会创建session。如果尚未生成session,可以使用request.getSession(true)强制生成session。
创建XMLHttpRequest对象;
注册回调函数;
设置连接信息;
发送数据,与服务器开始交互;
接受服务器返回数据。
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。
i.禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。
ii.Post/Redirect/Get模式。在提交后执行页面重定向,这就是所谓的Post-Redirect-Get(PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。
iii.在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。
分类:内连接、外连接、自然连接(略)、交叉连接(略)。
基本语法:左表[inner]join右表on左表.字段=右表.字段;
从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留。
基本语法:左表left/rightjoin右表on左表.字段=右表.字段;
leftjoin:左外连接(左连接),以左表为主表
rightjoin:右外连接(右连接),以右表为主表
基本语法:
Select语句1 Union[union选项] Select语句2 ……将多次查询(多条select语句),在记录上进行拼接(字段不会增加),每一条select语句获取的字段数必须严格一致(但是字段类型无关)。
其中union选项有2个。ALL:保留所有;Distinct(默认):去重。
应用:查询同一张表,但是有不同的需求;查询多张表,多张表的结构完全一致,保存的数据也是一样的。
在联合查询中,orderby不能直接使用。需要对查询语句使用括号才行。另外需要配合limit使用。
如果说数据库表中的数据是一本书,那么索引就是书的目录。索引能够让我们快速的定位想要查询的数据。
索引的结构:BTree索引和Hash索引。
MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换。
MEMORY/HEAP存储引擎:支持HASH和BTREE索引。
索引的分类:单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引。
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整
性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。
如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)
和回滚(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,
那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使
用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的
读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建
立太大的表。所以,这类数据库只使用在相对较小的数据库表。
SQL语句需要先编译然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。
存储过程的优点:增强SQL语言的功能和灵活性;标准组件式编程;较快的执行速度;减少网络流量;作为一种安全机制来充分利用。
(1)注册驱动;
(2)获取连接对象Connection;
(3)创建Statement对象;
(4)运行SQL语句;
(5)处理结果;
(6)关闭连接释放资源。
ACID表示事务的特性:原子性、一致性、隔离性和持久性。
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
事务并发产生的问题:脏读、幻读、不可重复读。
脏读(DirtyRead):A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。
幻读(PhantomRead):事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行。
不可重复读(UnrepeatableRead):事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了。
SQL优化: 尽量避免使用SELECT *; 只查询一条记录时使用limit1; 使用连接查询代替子查询; 尽量使用一些能通过索引查询的关键字。表结构优化: 尽量使用数字类型字段,提高比对效率; 长度不变且对查询速度要求高的数据可以考虑使用char,否则使用varchar;表中字段过多时可以适当的进行垂直分割,将部分字段移动到另外一张表;表中数据量过大可以适当的进行水平分割,将部分数据移动到另外一张表。其它优化: 对查询频率高的字段适当的建立索引,提高效率;根据表的用途使用合适的数据库引擎;读写分离。 框架部分SpringSpring的理解spring是一个开源框架,Spring为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能。Spring是一个IOC和AOP容器框架。Spring主要核心是:
(1)控制反转(IOC):传统的java开发模式中,当需要一个对象时,我们会自己创建一个对象,而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象,我们直接调用Spring为我们提供的对象即可,这就是控制反转的思想。实例化一个java对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法。当使用spring时我们不需要关心通过何种方式实例化一个对象,spring通过控制反转机制自动为我们实例化一个对象。
(2)依赖注入(DI):Spring使用JavaBean对象的Set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。
(3)面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
在Spring中,所有管理的对象都是JavaBean对象,而BeanFactory和ApplicationContext就是spring框架的两个IOC容器,现在一般使用ApplicationContext,其不但包含了BeanFactory的作用,同时还进行更多的扩展。
1.Spring容器从XML文件中读取Bean的定义,并实例化Bean。
2.Spring根据Bean的定义填充所有的属性。
3.如果Bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。
4.如果Bean实现了BeanFactoryAware接口,Spring传递beanfactory给setBeanFactory方法。
7.如果有BeanPostProcessors和bean关联,这些bean的postProcessAfterInitialization()
方法将被调用。
8.如果bean实现了DisposableBean,它将调用destroy()方法。注意:
有两个重要的bean生命周期方法,第一个是setup(),它是在容器加载bean的时候被调用。第二个方法是teardown()它是在容器卸载类的时候被调用。
Thebean标签有两个重要的属性init-method和destroy-method。使用它们你可以自己定制初始化和注销方法。它们也有相应的注解@PostConstruct和@PreDestroy。
代理模式—Spring中两种代理方式,若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理,若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法模式—用来解决代码重复的问题。比如:RestTemplate,JmsTemplate,JpaTemplate。
视图帮助(ViewHelper)—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
依赖注入—贯穿于BeanFactory/ApplicationContext接口的核心理念。
工厂模式—在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。Spring中使用BeanFactory用来创建对象的实例。
注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。
性、方法和构造方法中自动装配变量。
几种比较重要的注解类型:
1.@Required:该注解应用于设值方法。
2.@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
3.@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。
4.JSR-250Annotations:Spring支持基于JSR-250注解的以下注解,@Resource、@PostConstruct和@PreDestroy。
Spring支持两种类型的事务管理:
1.编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
Spring事务配置示例(使用tx标签配置的拦截器)
2、DispatcherServlet收到请求调用HandlerMapping(处理器映射器);
3、HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
4、DispatcherServlet调用HandlerAdapter(处理器适配器);
5、HandlerAdapter经过适配调用具体的Controller(处理器,也叫后端控制器);
6、Controller执行完成返回ModelAndView对象;
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet;
8、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器);
9、ViewReslover解析后返回具体View;
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中);
11、DispatcherServlet响应用户。
@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@PathVariable:用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。
@requestParam:主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue=“0”,required=false,value=“isApp”;defaultValue表示设置默认值,required铜过boolean设置是否是必须要传入的参数,value值表示接受的传入的参数类型。
@ResponseBody:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用@RequestBody:该注解常用来处理Content-Type:不是application/x-www-form-urlencoded编码的内容,例如application/json,application/xml等;@RequestHeader:可以把Request请求header部分的值绑定到方法的参数上。
@CookieValue:可以把Requestheader中关于cookie的值绑定到方法的参数上。
机制:springmvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
性能:spring会稍微比struts快。springmvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用settergetter方法把request中的数据注入;struts2实际上是通过settergetter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
设计思想上:struts更加符合oop的编程思想,spring就比较谨慎,在servlet上扩展。
MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的JDBC代码和手工设置参数以及抽取结果集。MyBatis使用简单的XML或注解来配置和映射基本体,将接口和Java的POJOs(PlainOldJavaObjects,普通的Java对象)映射成数据库中的记录。
Mybatis的优点:
1、简单易学。mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar加配置几个sql映射文件,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现;
2、灵活。mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql基本上实现不使用数据访问框架可以实现的所有功能;
3、解除sql与程序代码的耦合。通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性;4、提供映射标签,支持对象与数据库的orm字段关系映射;5、提供对象关系映射标签,支持对象关系组建维护;
6、提供xml标签,支持编写动态sql。
一级缓存:Mybatis的一级缓存的作用域是session,当openSession()后,如果执行相同的SQL(相同语句和参数),Mybatis不进行执行SQL,而是从缓存中命中返回。
二级缓存:Mybatis的二级缓存的作用域是一个mapper的namespace,同一个namespace中查询sql可以从缓存中命中。二级缓存是可以跨session的。
SpringBoot(英文中是“引导”的意思),是用来简化Spring应用的搭建到开发的过程。应用开箱即用,只要通过“justrun”(可能是java-jar或tomcat或maven插件run或shell脚本),就可以启动项目。二者,SpringBoot只要很少的Spring配置文件(例如那些xml,property)。因为“习惯优先于配置”的原则,使得SpringBoot在快速开发应用和微服务架构实践中得到广泛应用。
命令行界面:这是SpringBoot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建;
Actuator:让你能够深入运行中的SpringBoot应用程序,一探究竟。
@SpringBootApplication这个SpringBoot核心注解是由其它三个重要的注解组合,分别是:
@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。
@SpringBootConfiguration
点开查看发现里面还是应用了@Configuration。任何一个标注了@Configuration的Java类定义的都是一个JavaConfig配置类。SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。
@EnableAutoConfiguration
是一个复合注解。最重要的是@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot使用的IoC容器。@ComponentScan
@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
springCloud是一个基于SpringBoot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
服务注册发现-NetflixEureka
配置中心-springcloudconfig
负载均衡-NetflixRibbon
断路器-NetflixHystrix
路由(网关)-NetflixZuul
微服务是一种可以让软件职责单一、松耦合、自包含、可以独立运行和部署的架构思想。关键思想就是:拆分、单一、独立、组件化。把原本一个庞大、复杂的项目按业务边界拆分一个一个独立运行的小项目,通过接口的方式组装成一个大的项目。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker其实和虚拟机的目的差不多,都是虚拟化技术,但是docker比虚拟机更加轻量级,更快,更加易于移植。
镜像:创建虚拟机和docker都必不可少的东西。创建一个虚拟机,就先得下载操作系统的ISO镜像文件,然后通过镜像文件安装操作系统,和实体机类似,然后能在虚拟机中去安装各种软件。
容器:通俗拿VM虚拟机和Docker来举例,一个容器就类似于一个虚拟机,只不过在Docker技术的术语上称为容器。这个容器里装的就是我们部署的应用在运行,和虚拟机一样可以开机,关机,重启。Docker称为容器的运行,关闭,重启。而且这个容器可以打包为镜像文件,类似虚拟机快照的文件,放在其它虚拟机上又可以保持原样能运行,Docker也是如此,把容器打包为镜像文件,然后在新的服务器安装好的Docker环境下导入进去,保持原来的状态能够运行。
RemoteDictionaryServer(Redis)是一个基于key-value键值对的持久化数据库存储系统。支持多种数据结构,这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sortedsets)
缓存计数器发布订阅构建消息系统排行榜
性能极高–Redis能读的速度是110000次/s,写的速度是81000次/s。
丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及OrderedSets数据类型操作。原子–Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。丰富的特性–Redis还支持publish/subscribe,通知,key过期等等特性。
Schema.xml:
在下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件。
fieldtype节点主要用来定义数据类型;
field节点指定建立索引和查询数据的字段;
solrQueryParser指定搜索时多个词之间的关系,可以是or或and。
solrconfig.xml:
配置文件主要定义了SOLR的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置。
datadir节点定义了索引数据和日志文件的存放位置;lib节点表示solr引用包的位置。
RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。
可靠性(Reliability):使用持久化、传输确认和发布确认机制来保证可靠性。
灵活的路由(FlexibleRouting):在消息进入队列之前,通过Exchange来路由消息的。对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
高可用(HighlyAvailableQueues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
多种协议(Multi-protocol):RabbitMQ支持多种消息队列协议,比如STOMP、MQTT等。多语言客户端(ManyClients):RabbitMQ几乎支持所有常用语言,比如Java、.NET、Ruby等。
管理界面(ManagementUI):RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息跟踪机制,使用者可以找出发生了什么。
插件机制(PluginSystem):RabbitMQ提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
简单模式:一个生产者发送消息到队列,一个消费者接收。
工作队列模式:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列。
发布/订阅模式:一个生产者发送的消息会被多个消费者获取,每个消费者只能从自己订阅的队列中获取。
路由模式:生产者发布消息的时候添加路由键,消费者绑定队列到交换机时添加键值,这样就可以接收到需要接收的消息。
通配符模式:基本思想和路由模式是一样的,只不过路由键支持模糊匹配,符号“#”匹配一个或多个词,符号“*”只匹配一个词。
ActiveMQ是Apache推出的一款开源的,完全支持JMS1.1和J2EE1.4规范的JMSProvider实现的消息中间件。
点对点模式:一个消息只有一个消费者消费。
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
其核心部分包括:
远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型、序列化、"请求-响应"模式的信息交换方案;
集群容错:提供基于借口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持;
自动发现:基于注册中心目录服务,使服务消费方能动态地查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper;第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置;
第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。
Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。
FastDFS是一个开源的高性能分布式文件系统(DFS)。它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB FastDFS系统有三个角色:跟踪服务器(TrackerServer)、存储服务器(StorageServer)和客户端(Client)。 TrackerServer:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的storageserver和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。 StorageServer:存储服务器,主要提供容量和备份服务;以group为单位,每个group内 可以有多台storageserver,数据互为备份。 静态HTTP服务器:Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。 反向代理服务器:客户端本来可以直接通过HTTP协议访问某网站应用服务器,但如果单台服务器承受不住压力需要使用多台服务器共同处理请求,这时可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。 负载均衡:当客户端访问量很大,通过反向代理的方式,使用轮询、加权轮询和IPHash的策略将请求分配给多台服务器。 Quartz是一个任务调度框架。它具有以下特点: 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求; 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;分布式和集群能力,Terracotta收购后在原来功能基础上作了进一步提升; 作为Spring默认的调度框架,Quartz很容易与Spring集成实现灵活可配置的调度功能。 Scheduler:任务调度器,实际执行任务调度的控制器。在spring中通过SchedulerFactoryBean封装起来; DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比较多,在spring中 封装在CronTriggerFactoryBean中; Job:是一个接口,只有一个方法voidexecute(JobExecutionContextcontext),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。实现Job接口的任务,默认是无状态的,若要将Job设置成有状态的,在quartz中是给实现的Job添加@DisallowConcurrentExecution注解,在与spring结合中可以在spring配置文件的jobdetail中配置concurrent参数。 #准备数据的sql代码:create table score(id int primary key auto_increment,namevarchar(20),subjectvarchar(20),scoreint);insertintoscorevalues(null,'张三','语文',81),(null,'张三','数学',75),(null,'李四','语文',76),(null,'李四','数学',90),(null,'王五','语文',81),(null,'王五','数学',100),(null,'王五','英语',90);#答案:#A:selectdistinctnamefromscorewherenamenotin(selectdistinctnamefromscorewherescore<=80)#B:selectdistinctnamet1fromscorewhere80 准备sql语句: 参与运算的列是我起码能够显示出来的那些列,但最终我不一定把它们显示出来。各个表组合出来的中间结果字段中必须包含所有运算的字段。