十一、Hibernate 中get 和 load的区别................................................................
十二、 Hibernate、Ibatis、Jdbc三者的区别..........................................................
十三、 Hibernate的运行原理...............................................................................
十四、 Hibernate五大核心(类/接口)简述.........................................................
十五、 Hibernate与JDBC的区别........................................................................
十六、Hibernate中的两大配置文件......................................................................
十七、 Hibernate事务处理..................................................................................
十八、 Hibernate的三种状态以及状态的转换......................................................
二十一、Ssh的概述:........................................................................................
二十二、防止表单重复提交.................................................................................
二十五、拦截器的理解........................................................................................
二十六、Spring融入框架....................................................................................
十一、Hibernate 中get 和 load的区别
加载方式:
load为延迟加载(返回的是一个只有id属性的代理,只有使用该对象属性时,才 发出sql语句);
get为立即加载(执行时,会立即向数据库发出sql语句)
返回结果:
load检索不到记录时,会抛ObjectNotFoundException异常
get检索不到记录时,会返回null
- Hibernate、Ibatis、Jdbc三者的区别
Hibernate属于全自动, Ibatis属于半自动,Jdbc属于手动,从开发效率上讲hibernate较高,ibatis居中,jdbc较低,从执行效率上讲hibernate较低,ibatis居中,jdbc较高,因为jdbc是手工写sql语句,程序员对sql的控制能力更大,可以根据业务需要进行优化,而ibatis虽然也可以对sql进行优化,但是他里面将resultset封装为实体的过程中采用了反射机制所以一定程度上影响了性能,而hibernate因为高度封装所以开发效率相对较高,但正因为这个原因,所以程序员在对sql语句的控制和优化方面相对比较弱,而且在将resultset封装成实体的过程中也采用了反射机制,所以在性能方面较低
- Hibernate的运行原理
首先通过configuration去加载hibernate.cfg.xml这个配置文件,根据
配置文件的信息去创建sessionFactory,sessionFactory是线程安全的,
是一个session工厂,用来创建session,session是线程不安全的,相当于
jdbc的connection,最后通过session去进行数据库的各种操作,在进行操作
的时候通过transaction进行事务的控制。
- Hibernate五大核心(类/接口)简述
1 .Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。(加载 hibernate.cfg.xml)并创建一个SessionFactory对象。
2 .SessionFactory接口
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建 Session对象。SessionFactory是线程安全的。
3 .Session接口
Session(会话)接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象的CRUD操作(增删改查)。Session对象是非线程安全的。Session 相当于jdbc的connection
4 .Query与Criteria接口
总之Query和Criteria接口负责执行各种数据库查询。
5 .Transaction接口
Transaction(事务)负责操作相关的事务。
- Hibernate与JDBC的区别
- hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库.
- Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合
- Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。
4、如果正确的使用JDBC技术,它的执行效率一定比hibernate要好,因为hibernate是基于jdbc的技术.
5、JDBC使用的是SQL语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式转换成SQL语句执行。
十六、Hibernate中的两大配置文件
*.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系。
Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,包含*.hbm.xml内容,映射 文件,也可以配事务。
- Hibernate事务处理
开启事务 session.beginTransaction();
执行相关的操作,如果成功则session.getTransaction().commit();
执行操作失败则 session.getTransaction.rollback();
- Hibernate的三种状态以及状态的转换
Transient(临时)
new 一个初始化对象后,并没有在数据库里保存数据,处于临时状态;
Persistent(持久化)
当执行save()方法,调用session.close()方法之前,内存中的对象与数据库有 对应关系处于持久化状态;
Detached(托管/游离)
当执行session.close()之后,处于托管状态;
状态的转换
处于托管状态下,调用update()方法后,转换为持久化状态;
在持久化状态下,执行delete()方法后,转换为临时状态;
在未初始化对象之前,调用get(),load(),find(),iterate()之后,直接进入持久化 状态。
①前台封装一个显示分页的组件
②查询总条数
③后台封装分页工具类,计算开始位置、结束位置、总页数
④后台写支持分页的sql语句
⑤前台包含分页组件,实现分页效果
注意:
查询总条数的where和查询列表信息的where条件要保证一致。
二十、hibernate缓存概述
hibernate分为一级缓存即session缓存也叫事务级别的缓存以及
二级缓存sessionFactory即应用级别的缓存,还有查询缓存即三级缓存.
一级缓存的生命周期和session的生命周期保持一致,
hibernate默认就启用了一级缓存,
不能将其关闭,可以通过session.clear()和session.evict(object)来管理一级缓存。其中get,load,iterate都会使用一级缓存,一级缓存缓存的是对象。
二级缓存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多个session共享,hibernate3默认开启二级缓存,也可以手动开启并指定缓存插件如ehcache,oscache
等。二级缓存也只能缓存对象。
三级缓存也叫查询缓存,查询缓存是针对普通属性结果集的缓存,
对实体对象的结果集只缓存id。对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存
二十一、Ssh的概述:
ssh是web开发中常见的一种框架
s-struts
s-spring
h-hibernate
其中struts在框架中充当控制器,实现MVC,主要用来处理用户的请求,和跳转页面。使项目结构清晰,开发者只需要关注业务逻辑的实现即可。
spring在ssh充当粘合剂,粘合struts-sping-hibernate,主要用来进行事物的控制,
hibernate-充当数据库持久层,主要用它来与数据库交互,提高开发效率,减轻程序员sql控制要求,而且hibernate通过反射机制,有灵活的映射性,还支持各种关系,一对一,一对多,多对多。
在进行ssh整合的时候,我们应该注意:
1. Action继承于ActionSupport
引入struts-spring-plugin.jar包,从而完成struts和spring的整合
在struts2的action中注入service,保证service的名字和配置文件中的一致,并生成get,set方法
Dao层继承于hibernateDaoSupport
在dao层的配置文件中注入sessionFactory
针对于重复提交的整体解决方案:
1.用redirect来解决重复提交的问题
2.点击一次之后,按钮失效
3.通过loading
4.自定义重复提交过滤器
5.解决struts2重复提交
可以结合s:token标签来解决重复提交问题
利用token的原理:
1.在前端的jsp页面中加入s:token标签,在访问该页面时就会生成
隐藏域,该隐藏域中包含一个随机生成的字符串,并把该字符串
存入session中
2.在struts2的配置文件中加入token拦截器后,当正常访问action
的时候,会从session中取出该字符串,然后和页面隐藏域中提交
字符串做对比,如果一致则正常执行并删除session中存储的字符串。
二十三、JSP标签:
1.JSP include动作
jsp:include 动作
以“<jsp: 动作名 ” 开始,以“</jsp:动作名> ” 结束
比如:<jsp:include page=" Filename" />
2.JSP指令:<%@ include%><%@ %>
以“<%@ ” 开始,以“%> ” 结束。比如:
<%@ include file = " Filename" %>
3.JSP输出表达式:<%= %><%=Java表达式 %>
输出变量的值,后边不能加<%= ; %>
4.JSP Scriptlet【脚本】:<% ;%> <% Java 代码 %>
例子:
<% Calendar now = Calendar.getInstance(); %>
5.JSP声明:<%! %> <%! 函数或者方法 %>
例子:
<%!
String getHello(String name) {
return "Hi," + name + "!";
}
%>
6.迭代标签:<c:foreach>
Jstl中的核心标签(core)
7.JSP注释:
<!-- 这是注释,但客户端可以查看到 -->
<%-- 这也是注释,但客户端不能查看到 --%>
- el表达式:${}
- jsp:include动作是在运行时动态包含。
@include指令是在编译时包含。
它们两个都只能包含本项目的相关文件,不能包含其他项目的。
如果要包含其他项目的文件可以使用c:import
filter的概述:
filter是一个过滤器,用来在请求前和响应后进行数据的处理。
filter的生命周期是:
实例化--->初始化(init)-->进行过滤(doFilter)--->销毁(destroy)-->释放资源
一个Filter必须实现javax.servlet.Filter接口
在项目中我们通常通过filter进行编码转换,
进行安全验证,进行重复提交的判断。
了解(不需要主动说)
filter 相当于 拦截器 相当于Spring AOP
servlet+jsp+javabean+jdbc+filter
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.leopard.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
什么是拦截器:
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用
正如上面 Struts2的Reference中讲述的,Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或者之后执行拦截器的代码。
在项目中,我们经常用来拦截通过非正常程序而进行的访问
Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。
其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:
<package name="demo" extends="struts-default" > ... </package>
拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作
在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。struts2中默认的拦截器是defaultStack.
自定义拦截器需要特别注意的是不要忘记引入struts2默认的拦截器。为了实现某些操作,我们可以自定义拦截器,
自定义拦截器有三种方式定义。分别为实现Interceptor接口,继承抽象类AbstractInterceptor,继承MethodFilterInteceptor类。
拦截器在项目中的运用:
同时可以减轻代码冗余,提高重用率。
如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。
我们通过在web.xml中配置ContextLoaderListener这个监听器也加载
spring的配置文件,从而融入到项目框架中。
二十七、项目的部署方式
1、如果项目单独部署到tomcat中的时候,应该看tomcat中的server.xml;
2、如果和eclipse结合使用进行项目部署的时候,应该看eclipse里面的server.xml.