Java复习
- 1. SSM
每个字母代表什么,每个架构充当的角色
spring(平台 中间连接器) spingMVC(控制器) mybatis(持久层 相当于dao层)
2. springMVC工作流程
1、用户发送请求到前端控制器(DispatcherServlet)。 |
2、前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)。 |
3、找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)。 |
4、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。 |
5、处理器适配器去执行Handler。 |
6、处理器执行完给处理器适配器返回ModelAndView。 |
7、处理器适配器向前端控制器返回ModelAndView。 |
8、前端控制器请求视图解析器(ViewResolver)去进行视图解析。 |
9、视图解析器向前端控制器返回View。 |
10、前端控制器对视图进行渲染。 |
11、前端控制器向用户响应结果。 |
前端控制器(DisatcherServlet):接收请求,响应结果,返回可以是json,String等数据类型,也可以是页面(Model)。 处理器映射器(HandlerMapping):根据URL去查找处理器,一般通过xml配置或者注解进行查找。 处理器(Handler):就是我们常说的controller控制器啦,由程序员编写。 处理器适配器(HandlerAdapter):可以将处理器包装成适配器,这样就可以支持多种类型的处理器。 视图解析器(ViewResovler):进行视图解析,返回view对象(常见的有JSP,FreeMark等)。 |
3.SpringMVC与struts2的区别:
①Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter。
②Spring MVC 会稍微比 Struts2 快些。Spring MVC 是基于方法设计, 而 Sturts2 是基于类, 每次发一次请求都会实例一个 Action。
③Spring MVC 使用更加简洁, 开发效率Spring MVC确实比struts2 高: ajax 的请求更方便。
④Struts2 的 OGNL 表达式使页面的开发效率相比Spring MVC 更高些。
扩展:OGNL
OGNL相对其它表达式语言具有下面几大优势:
1)支持对象方法调用。
2)支持类静态的方法调用和值访问。
3)支持赋值操作和表达式串联。
4)访问OGNL上下文(OGNL context)和ActionContext。
5)操作集合对象。
6)可以直接new一个对象。
扩展:OGNL语法
执行方法:对象.方法() 'abcd'.toUpperCase()
静态资源:@全限定类名 @方法|字段 @System@out.println(@Math@PI)
获得root内容:属性名
获得context内容:#key
root内容赋值: 属性名=值 username='jack‘
表达式串联:表达式1,表达式2, ...username='jack' , password='1234'
创建List集合:{ … , … , … } {'jack','rose','tom'}
创建Map集合:#{k:v , k2:v2 , … } #{'ds':'你猜','dzd':'再猜'}
创建对象:new 对象() new com.yinggu.User()
当前对象:#this
投影:表达式.{表达式} #this.{username + password}
过滤:集合.{符号 …}
集合.{?#this} 集合中的所有内容
#this.{?#this.age > 18}
集合.{^#this} 集合中的第一个内容
集合.{$#this} 集合中的最后一个内容
4.mybatis的介绍及优点$,#
MyBatis是一个数据持久层(ORM对象关系映射)框架。把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现。
MyBatis的优点:
1.基于SQL语法,简单易学。
2.能了解底层组装过程。
3.SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。
4.程序调试方便
5.hibernate与mybatis的对比
MyBatis
1、是一个SQL语句映射的框架(工具)。
2、注重POJO与SQL之间的映射关系。不会为程序员在运行期自动生成 SQL。
3、自动化程度低、手工映射SQL,灵活程度高。
4、需要开发人员熟炼掌据SQL语句。
Hibernate
1、主流的ORM框架、提供了从 POJO 到数据库表的全套映射机制。
2、会自动生成全套SQL语句。
3、因为自动化程度高、映射配置复杂,api也相对复杂,灵活性低。
4、开发人同不必关注SQL底层语句开发。
MyBatis应用场景:
需求多变的互联网项目,例如电商项目。
Hibernate应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等。
6.数据库连接池机制
(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
7.最大最小连接池
最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
8.Struts2核心功能:
1)Action的实现方面,可以是一个普通的POJO。
2)线程模型方面,Action是一个请求对应一个实例(新new一个对象),没有线程安全方面的问题。
3) Servlet依赖方面,Action不再依赖于Servlet API,有利于测试实现TDD(Test-Driven Development,测试驱动开发)。封装请求参数,可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
4)表达式语言方面,整合了OGNL 。OGNL(Object Graph NavigationLanguage)对象图形导航语言。
9.Strusts2的工作原理
客户端初始化一个指向Servlet容器(例如Tomcat)的请求 |
这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin); |
接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action; |
如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy; |
ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类; |
ActionProxy创建一个ActionInvocation的实例。 |
ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 |
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。 |
Struts2核心组件介绍 ActionMapper:通过method参数将请求转发到具体的action ActionProxy代理:是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法。归根到底,最后调用的是DefaultActionInvocation.invokeAction()方法。 ActionInvocation:就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。 Interceptor拦截器:是Struts 2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、校验等。 |
10.Spring
核心 控制反转Ioc 面向切面AOP
好处:
l 方便解耦,简化开发 (高内聚低耦合)
Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
spring工厂是用于生成bean
l AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
l 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
l 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
l 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
l 降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
依赖注入对象可以采用手工装配或自动装配
l 手动装配
使用xml配置
构造函数注入
属性setter方法注入
l 自动装配
byType:按类型装配 。
byName:按名称装配。
constructor装配。
autodetect 不确定装配。
常用的自动装配注解有以下几种:@Autowired,@Resource,@Inject,@Qualifier,@Named。@Autowired注解是byType类型的,这个注解可以用在属性上面,setter方面上面以及构造器上面。使用这个注解时,就不需要在类中为属性添加setter方了。但是这个属性是强制性的,也就是说必须得装配上,如果没有找到合适的bean能够装配上,就会抛出异常。这时可以使用required=false来允许可以不被装配上,默认值为true。当required=true时,@Autowired要求必须装配,但是在没有bean能装配上时,就会抛出异常:NoSuchBeanDefinitionException,如果required=false时,则不会抛出异常。另一种情况是同时有多个bean是一个类型的,也会抛出这个异常。此时需要进一步明确要装配哪一个Bean,这时可以组合使用@Qualifier注解,值为Bean的名字即可。@Qualifier注解使用byName进行装配,这样可以在多个类型一样的bean中,明确使用哪一个名字的bean来进行装配。@Qualifier注解起到了缩小自动装配候选bean的范围的作用。注意:@Autowired注解是spring提供的,所以会依赖spring的包。还有一个byType的注解@Inject,与@Autowired注解作用一样,也是byType类型,而且是java ee提供的,完全可以代替@Autowired注解,但是@Inject必须是强制装配的,没有required属性,也就是不能为null,如果不存在匹配的bean,会抛出异常。@Autowired与@Qualifier可以组合 使用,@Inject也有一个组合的注解,就是@Named注解,与@Qualifier作用一样,也是byName,但是不是spring的,是java ee标准的。这样就出现了两套自动装配的注解组合,@Autowired与@Qualifier是spring提供的,@Inject与@Named是java ee的。但是@Qualifier注解在java ee中也有一样,作用与spring的@Qualifier注解一模一样,只是所在的包不一样。不过建议大家使用spring的。最后还有一个@Resouce注解, 这个注解也是java ee的,也是byName类型的,原理同@Qualifier和@Named是一样的。 |
注解:
除了@Component外,Spring提供了3个功能基本和@Component等效的注解
@Repository 用于对DAO实现类进行标注。
@Service 用于对Service实现类进行标注。 这三个注解是为了让标注类本身的用途清晰,
@Controller 用于对Controller实现类进行标注。
11.Java web
三大指令三种指令为:
page指令 |
include指令 |
taglib指令 |
page指令用于设置页面的各种属性,如导入包、指明输出内容类型、控制Session等。page指令一般位于JSP页面的开头部分,一个JSP页面可包含多条page指令。 |
include指令用于在当前JSP中包含其他文件。被包含的文件可以是JSP、HTML或文本文件。包含的过程发生在将JSP翻译成Servlet时,当前JSP和被包含的JSP会融合到一起,形成一个Servlet,然后进行编译并运行。 |
taglib指令用于指定JSP页面所使用的标签库,通过该指令可以在JSP页面中使用标签库中的标签。 |
六大标签
Jsp中有6个动作标签:include、forward、useBean、getProperty、setProperty、plugin。
<jsp:include>标签表示包含一个静态的HTML或者动态的JSP文件。
<jsp:forward>标签表示重定向一个静态html/jsp的文件,或者是一个程序段。
<jsp:useBean>标签表示用来在JSP页面中创建一个BEAN实例并指定它的名字以及作用范围。
<jsp:setProperty>标签表示用来设置Bean中的属性值。
<jsp:getProperty>标签表示获取Bean属性的值并将之转化为一个字符串,然后将其插入到输出的页面中。
<jsp:plugin>元素用于在浏览器中播放或显示一个对象(典型的就是applet和Bean),而这种显示需要在浏览器的java插件,因此有可能的话还要下载一个java插件用于执行它。
九大内置对象:
12.Servlet运行周期:
Servlet生命周期概括为以下几个阶段:
1) 装载Servlet:这项操作一般是动态执行的,有些服务器提供了相应的管理功能,可以在启动的时候就装载Servlet;
2) 创建一个Servlet实例:容器创建Servlet的一个实例对象;
3) 初始化:容器调用init()方法对Servlet实例进行初始化;
4) 服务:当容器接收到对此Servlet的请求时,将调用service()方法响应客户的请求;
5) 销毁:容器调用destroy()方法销毁Servlet实例。
13.重定向和请求转发的区别
1、请求转发只能将请求转发给同一个Web应用中的组件,而重定向不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源。 范围
2、重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发访问过程结束后,浏览器地址栏保持初始的URL地址不变。 url地址栏变化
3、请求转发的调用者与被调用者之间共享相同的request对象和response对象;而重定向的调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。 对象问题
14.Servlet与jsp的区别:
1.JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类。
2.Jsp的工作原理:JSP页面在执行的时候都会被服务器端的JSP引擎转换为Servlet(.java),然后又由JSP引擎调用Java编译器,将Servelet(.java)编译为Class文件(.class),并由Java虚拟机(JVM)解释执行。
3.Servlet的应用逻辑是在Java文件中,从Java代码中动态输出HTML,并且完全和表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
15.怎么解决中文乱码
首先你在设置各种编码的时候应该设置为UTF8 设置的地方有jsp页面的字符编码,
首先页面的字符编码设置需要时utf8
客户端与服务器端的乱码可以看看是不是tomcat的编码不对,
然后还有就是你请求的时候 是否设置了字符编码
如果使用了Struts2框架,在strust.xml文件中添加如下代码
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
还有一种最保险的方法是添加自定义编码过滤器,或者使用spring自带的过滤器
在服务器获取到正确数据后,插入到数据库却出现乱码,很有可能是数据库的编码问题
数据库安装时,创建数据库以及创建表的时候为了防止字符编码都应该将其设置为UTF8
16.AOP是做什么的
1.1.1 什么是AOP
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
经典应用:事务管理、性能监视、安全检查、缓存 、日志等
Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
1.1.2 AOP与OOP
1.1.3 AspectJ
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
AspectJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入
17.事务
1.1 什么事事务
事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
1.2 事务的ACID
事务必须服从ISO/IEC所制定的ACID原则。
ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)
事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
事务的持久性:表示已提交的数据在事务,如果服务器发生故障,数据的状态都应该正确。
1.3 常见的事务管理器
DataSourceTransactionManager,jdbc开发时事务管理器,采用JdbcTemplate
HibernateTransactionManager,hibernate开发时事务管理器,整合hibernate
1.4 api详解
TransactionStatus getTransaction(TransactionDefinition definition) ,事务管理器 通过“事务详情”,获得“事务状态”,从而管理事务。
void commit(TransactionStatus status) 根据状态提交
void rollback(TransactionStatus status) 根据状态回滚
18.web.Xml可以干嘛
过滤器 监听器 加载spring的文件配置 servlet配置
19.jquery中$.get()提交和$.post()提交有区别吗?
相同点:都是异步请求的方式来获取服务端的数据;
异同点:
1、请求方式不同:$.get()?方法使用GET方法来进行异步请求的。$.post()?方法使用POST方法来进行异步请求的。
2、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。
3、数据传输大小不同:get方式传输的数据大小不能超过2KB?而POST要大的多
4、安全问题:GET方式请求的数据会被浏览器缓存起来,因此有安全问题。
20、写出一个简单的$.ajax()的请求方式?
$.ajax({
url:'http://www.baidu.com',
type:'POST',
data:data,
cache:true,
headers:{},
beforeSend:function(){},
success:function(){},
error:function(){},
complete:function(){} 请求完成后回调函数 (请求成功或失败之后均调用)。
})
21.Ajax的优缺点及工作原理?
1.1 定义和用法:
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。Ajax 是一种用于创建快速动态网页的技术。Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。
1.2 优点:
1.减轻服务器的负担,按需取数据,最大程度的减少冗余请求
2.局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验
3.基于xml标准化,并被广泛支持,不需安装插件等,进一步促进页面和数据的分离
1.3 缺点:
1.AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性.
2.AJAX只是局部刷新,所以页面的后退按钮是没有用的.
3.对流媒体还有移动设备的支持不是太好等
1.4 AJAX的工作原理:
1.创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
2.判断数据传输方式(GET/POST)
3.打开链接 open()
4.发送 send()
5.当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数
22.Web
1.1 HTML5 中的一些有趣的新特性:
用于绘画的 canvas 元素
用于媒介回放的 video 和 audio 元素
对本地离线存储的更好的支持
新的特殊内容元素,比如 article、footer、header、nav、section
新的表单控件,比如 calendar、date、time、email、url、search
1.2 浏览器支持
最新版本的 Safari、Chrome、Firefox 以及 Opera 支持某些 HTML5 特性。Internet Explorer 9 将支持某些 HTML5 特性。
1.3 什么是Bootstrap
Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目 网址:http://www.bootcss.com/
1.4Bootstrap优点
Bootstrap 让前端开发更快速、简单。所有开发者都能快速上手、所有设备都可以适配、所有项目都适用 Bootstrap 是完全开源的。它的代码托管、开发、维护都依赖 GitHub 平台
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
1.5 js的几种方式
Indexof()
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
substring()
substring(start,stop) 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。
mouseenter 事件在鼠标指针进入 div 元素时触发,唯一的区别是 onmouseenter 事件不支持冒泡。
onmouseover 事件在鼠标指针进入 div 元素时触发 ,在子元素上也会触发(p 和 span)。
八大数据类型
基本数据类型包括byte、int、char、long、float、double、boolean和short。
Break continue
break再循环中的作用是 跳出一个循环或者结束一个循环
continue立即结束本次循环,继续执行下一次循环
==与equals区别
==是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等。默认Object类的equals方法是比较两个对象的地址,此时和==的结果一样。换句话说:基本类型比较用==,比较的是他们的值。默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal方法。
静态变量 实例变量的区别
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
Integer与int区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
5. 该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法
Math.RoundMath.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
将括号内的数+0.5之后,向下取值,
Overload和Override的区别。(多态的体现)
Overload是重载,同一方法内,是有相同的方法名,但参数类型或个数彼此不同
Override是重写,是在子类与父类中,子类中的方法的方法名,参数个数、类型都与父类中的完全一样,在子类中覆盖掉了父类的改方法
面向对象的特征有哪些方面 封装、继承、多态
封装就是把对象的属性方法结合在一起,并尽可能隐蔽对象的内部细节,形成不可分割的独立单元
继承是软件重用的一种形式,他通过吸收现有类的数据与方法,并增加新功能或者修改现有功能来创建新类。
多态是指父类中定义的属性或方法被子类继承之后,可以具有不同的表现方式
List map set
list和set都是单列集合,他们有一个共同的父接口---collection。list是依次列出一个结合中的所有的元素,若集合中有重复的,同样列出,有序;set列出的集合中是不允许有重复的,也就是说里面有一个A对象和一个B对象,若是A.equals(B)==ture,那么用set方法列出的只会有一个,set集合默认是有序的,正向排序。一般遍历set里面的元素时使用iterator
map<key,value> 它是一个双列的集合。里面有一个key,和一个value,其中value是真正存储值得变量。map存储的数据是无序的,其键(key)不能重复,但是其值(value)是可以重复的。
Collection和 Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
冒泡 插入 选择 二分
JDBC步骤
1. 加载数据库驱动
2. 创建数据库连接
3. 创建PreparedStatement对象
4. 编写并且运行sql语句
5. 处理结果 返回结果集
6. 关闭释放资源
Statement Preparestatement区别
PreparedStatement接口是Statement接口的子接口,它继承了Statement的所有功能。
PrepardStatement接口有两大特点:
执行速度要快于Statement对象
SQL语句中提供参数,提高程序的灵活性和执行效率
PreparedStatement 是只编译一次,多次运行 可以防止sql注入
Statement 是每次执行,每次都重新编译
map常用的方法
Map集合:该集合存储键(K)值(V)对,一对一往里存,而且要保证键的唯一性。
1、添加
put(K key,V value)
putAll(Map<? extends K,? extends V> m)
2、删除
clear()
remove(Object key)
3、判断
containsValue(Object value)
containsKey(Object key)
isEmpty()
4、获取
get(Object key)
size()
values()
hql与sql
1、首先,hql是面向对象查询的;sql是面向数据库做查询。
2、hql的语法结构:from + 类名+类对象 +where+类对象属性的条件;
sql的语法结构:from +数据库表名+ where +表字段条件
3、新增:hql不需要再用insert语句,只需构造新增对象后调用save()方法
4、修改:hql不需要再用update语句,只需得到修改对象后调用update()方法
5、删除:hql不需要再用delete语句,只需得到要删除的对象后调用delete()方法
mysql递归 插件 包名 分页
oracle 11g spring4.0 struts 2.3.5 hibernate3.0
关键字Exists与in的区别
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
内连接 (inner join)
select * from table1 innerjoin tbale2 on table1.id=table2.id;显示内连接
Select * from 表1,表2 where 表2.列名= 表1.列名; 隐似内连接
这条sql语句返回结果 两个表都存在的数据
左连接 (left join)
select * from table1 left join tbale2 on table1.id=table2.id
这条sql语句返回结果 table1表中的数据全部返回 table2表中的数据只返回满足where条件的
右链接 (right join)
select * from table1 right join table2 on table1.id=table2.id
这条sql语句返回结果 table2表中的数据全部返回 table1表中的数据只返回满足where条件的
union和union all,destinct
union 将两个表连接后删除其重复的项。
union all 将两个表连接都不删除其重复的项。
distinct 表示不显示重复的查询
分页语句:
mysql方案:select * from t order by id limit 10,30
oracle分页:30
select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow
2 .数据操纵语言DML
数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
3. 数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
表 视图 索引 同义词 簇
DDL操作是隐性提交的!不能rollback
Get post
1 、get请求 请求参数会显示在地址栏中 不安全
post请求 地址栏只显示请求资源的url 不显示请求参数 相对安全
2 、get请求 请求参数存放在请求首行中 http对请求首行限制1kb
post请求 请求参数存放在请求体中 请求体没有大小限制
post可以发送大数据
3、 get请求的参数不能通过request.setCharacterEncoding("gbk")来设置编码
request.setCharacterEncoding("gbk")只能设置请求体的编码集
==========================================================================
递归读取文件夹的文件
补充:
使用Hibernate的基本流程是:
配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。
AOP的作用。
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
面向切面编程(AOP)就是对软件系统不同关注点的分离,开发者通过拦截方法调用并在方法调用前后添加辅助代码。
Ioc通俗易懂详解:
https://blog.csdn.net/liunianqingshi/article/details/78144489
abstract class和interface有什么区别?
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。
事务:
spring支持编程式事务管理和声明式事务管理两种方式。
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。
说明一个Bean的生命周期活动
- Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例
- Setter注入,执行Bean的属性依赖注入
- BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法
- BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法
- BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法
- InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法
- Bean定义文件中定义init-method
- BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法
- DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法
- Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法