hibernate原理

hibernate原理
hibernate原理

工作原理:在起动项目时,读取hiberate.cfg.xml 文件,根据内容创建Session ,它就是一个连接,进行持久化操作

Hibernate的创建:

1,先建项目

2,先建立连接Window→view→other→MyEclipse Database→DB Browser 点击倒三角→new →Driver template选择数据库种类→Driver name取一个连接名字-→填写url→uername→password→增加jar包→finish,

3,增加支持,选中工程→myeclipse→project capabilities→add hibernate capability→选择版本→选择只加到路径中→next→选择放置连接配置文件名和目录→选择连接连接名→是否创建SessionFactory→finish

4,

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"https://www.360docs.net/doc/0710521502.html,/hibernate-configuration-3.0.dtd">

sa

jdbc:sqlserver://localhost:1433;databaseName=dbuser

org.hibernate.dialect.SQLServerDialect

user

com.microsoft.sqlserver.jdbc.SQLServerDriver

true

show

5转到DBBrowse→选择表反工程到实体类→

选择文件夹和包名,一,选择是否要创建*hbm.xml文件,二,是否要增加映射到hibernate.cfg.xml文件的resource的值三,是否要建立实体Bean 四,是否要建立Dao类

ID Genrator 选择自动更新的方式

→next →next –finish

生成后的目录结构。

当Configuaration cg=new Configuaration() //默认情况下是下载proprities文件而cg.configura()//这样才是加载hibernater-cfg.xml文件

在删除时,删除后在Session 没有关闭时,那个对像也变成了游离状态了,如查重新插入时,会重新生成一个ID

Get不支持延时加载,load支持延时加载,在load中会生成一个代理对象,当没有找到对象,也就是被代理对象为空是,会抛出NoClassFondException

在清理缓存时,或者是脏数据处理时,会与数据库对照

王勇

Configurateion cfg=new Configuration().configure() 新建的时候,只读取根目录下的properties 文件,只有调用configure() 方法才读取hibernate.cfg.xml 文件

如要用多个数据库,可以在hibernate.cfg.xml写多个sessionFactory

透明持久化,没有依赖性

sessionFactory 是一个很要性能的对象,而且是线程安全的,通常只创建一次

session 是一个连接池,它是一个缓存,存在之个连接,要手动打开,手动开启事务,提交,但是它不是线程安全的,不要多线程用。

Jdbc 是一个本地事务,只是用于一个数据库,无法保证多数据库事务

Jta是支持多数据库事务JTa中一个容器,可以调度多个连接,也可以用于连接池

Query用于查询实体类

Interceptor 拦截器,用于Sql前后做一些事

Show_sql,format_sql用来显示sql语句

Hibernate能帮助我们利用面向对象的思想,开发基于关系型数据库的应用程序

瞬时状态:存在内存中的对象,没有与数据库发生关系,没有放入session管理

持久状态:放入session管理,在数据库有与之对应的数据

游离状态,经过持久状态,变成瞬时状态,由sessin管理器释放出来,当删除时,放成游离状态

的二个属性:自动导包和手动设置包

在class中,若没有指定表名,则和类名一样的

Class也可以指定是否支持lazy

Id必须是第一个name指的是类的属性,column默认和属性同名,可以指定。

可以指定type

主键必须设置,increatement只在同一个jvm中生成是唯一的,若不是在同一jvm中会生成重复

Uuid由hibernate生成,它是字符串,不会重复,

Native不用管生成策略,hibernate会自动选择它自己的生成器

Assigned手动生成主键时使用,没有指定时,默认就是使用这个

Foreign使用其它表的主键

Property的使用:name是属性,type为数据类型,column指定列名,unique指定它的唯一性,not-null指定不能为空,lengh指定长度,一般是与字符串相配,generated=”never|insert|always”指定可以有默认值,默认是不能指定默认值(Never)

注意,如果属性和表名与Sql关键字同名时,必须改名

实体类的设计原则:必须有一个无参构造方法,提供一个标识属性,使用非final类,影响子类,为持久化属性声明访问器,主要是get()和set()方法

validate| update|create|create-drop|

关联映射

多对一:

Insert执行顺序:先生成内存对象,没有标识列,是瞬时状态,当执行save()时,生成标识列,并且变成了持久态,并发出insert语句,但在事务没有结束时,其它事务是默认无法访问的,最后清理缓存,真正更新到数据库中。

事务可以回滚,但生成的标识列已经生成了,下次访问时又生成下一个标识列,不会再生成生成过的标识列

当保存时持久状态的不能引用瞬时态的对象,除非设置了cascade属性

级连:(cascade)有all,none,save-update,delete,只应用于save,update,delete,在做DDl语句时,先做好相关引用,如sava会先保存引用,delete会先删除引用,

Inverse=”true”与cascade的区别:首先,inverse是一个前提,如果inverse是false的话,你的cascade 也没有用,inverse是一个hibernate控制权的引用,而cascade只是表的一种性质一对一的映射:

主键关联:建立实体的引用,把引用属性本身的主键来自于引用主键

one-to-one 不会显式地加入了一个列,它们之间建立了外键关系,而且没有设置主键自动增长方式

默认设置了cascade=”save-uqdate”指示hibernate加载它的关联对象,默认是根据主键来加载

Constrainted=”true”用来设置外键约束

双向一对一:只hbm.xml回一个就可以了

默认fetch=”join”其它的默认为select

一对一外键唯一关联:是多对一关联映射的特例,可以采用

标签,这样就限制了多的一端的多重性为一个

一对一外键唯一关联双向:

也默认了他的fecth=”join”

采用uuid时,调用完成save后,只是将对象纳入到了session的管理,不会发出insert 语句,但是id已经生成了,session中existsInDatebase状态为false

调用flush,hibernate会清理缓存,执行sql

如果数据库的隔离级别设置为末提交读,那么我们可以看到flush过的数据

Sessin中的existsInDatebase状态为true

提交事务,默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush,commit后数据是无法回滚的

如果主銉生成策略是antive,所以调用sessin.save()后,将执行inert 语句,返回有数据库生成的id,纳入了session的管理,修改了session中exitstsInDatebase状态为true,如果数据库的隔离级别设置为末提交读,那么我们可以看到save过的数据

一对多:

在多的一方维护他们的关系时,而且要发二条语句,首先要先保存自己,发一条sql语句,,要求外键可以为空,如果不能为空则不能插入,然后再发一务语句去更新它的外键。

多对一:

注意:、标签指定的外键字段必须和指定的外键字段一致,否则引用字段的错误

如果一方维护一对多关联关系,hibernate会发出多余的update语句,所以我们一般在多的一端来维护关联关系

关于inverse属性

主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签>set>上,默认为false,所以我们只能从一的一端来维护关系

如果设置成inverse为true,则我们只能从多一端维护关联关系

Inverse是关系关系的控制方向cascade是操作上的连锁反应

多对多:

User配置:

会新建一个表,且是用它们做一个组合主键

脏读指:可以读取没有提交的数据

不要可重复读:读取数据没有锁定数据,别人可以修改你读取的数据,你再一次读得到不同的数据,所以二次读取的数据不一样。

幻读:没有对表锁定,当你读取了读后,别人可以向表增加数据,当再一次读时,条数已经不一样了。

Serviliaxble:对表进行了锁定,只能一个人对表操作,

Reqeateable Read :对读取出来的数据进行了锁定,别人不可对它进行修改

Select @@tx_isolation 查询mysql隔离级别

Set transaction isolation level read uncommintted 设置mysql隔离级别

Lazy:

Lazy可以用在以下地方:标签上, , Lazy概念:只有真正使用该对象是,才会创建,对于hibernate而言,真正使用的时候才会发出sql

Lazy 和session有相同的生命周期,session关了,会出现出始化异常,hibernate支持lazy 策略只有在session打开状态下有效

CGLIB

上的lazy不会影响集合的加载,它只对普通属性起作用

Extra会更智能一点,如得到count会只发出查找count语句,不会把所有的集合全部查出来

Hibernate在单端关联上的lazy策略,可以取值:false/proxy/noproxy

悲观锁:通常依赖于数据库机制,在整个过程中将数据锁定,其它任何用户都不通读取或修改,

乐观锁:大多数基于数据版本记录机制(version)实现,一般是在数据库表中加入一个version 字段,读取数据时将版本号一同读出。之后更新数据时版本号加一,如果提交数据时版本小于或等于表中的版本号,则认为数据地过期的,否则更新

配置

然后在实体中增加这一属性

如果他们的版本不一样的话,会出异常org.hibernate.StaleObjectStateException

HQL

在HQL关键字不区分大小写,但是属性和类名是区分大小写的

简单属性查询:

单一属性查询:session.createQuery(“select name from Student”).list();返回结果集属性列表,元素类型和实体中相就的属性类型一致

多个属性查询:session.createQuery(“select name,id from Student”).list();返回的结果是对象数组,第0个元素是第一个,数组元素的类型和对应的属性在实体类中的类型一致,数组的长度取决于select中属性的个数。也可以产生对象,但是要提供相应的带参方法;如session.createQuery(“select new Student(id,name) from Student”).list();此时list对象中是Student 的集合。不要忘了写上那个不带参的方法,也可以使用别名查询

对象查询:

Query.iterate() 方法的用法:因为list操作已经将对象放到一级缓存中,所以再次使用iterate操作的时候,它首先发出一条查询id列表的sql,在根据id到缓存中去取数据,只有在缓存中找不到相就的数据时,才会发出sql到数据库中查询

List()方法不会用缓存中的数据,每次都发出sql到数据库查询数据

动态配置sql语句:首先在*.hbm.xml

然后在程序中session.getNameQuery(“”)得到一个Query执行语句

一级缓存:时间很短,和session的生命周期一致,也叫sesssion级的缓存,或事务级缓存,只支持实体对象保存入session,普通属性不入session

Get()会用缓存,

Iterate();第一次会发出查询id的语句,也会发出一条查询实体语句

第二次只会发出查询id语句,也会利用缓存

当查询普通属性时,一级缓存不会缓存,所有发出sql,

一级缓存是缓存实体对象的。

Sessin间不能共享一级缓存的数据,因为它会伴随session的生命周期存在和消亡,当session.clear()时就会把缓存清空,当transation.submit()会隐式地调用sesson.clear() 可以用sessin.clear()和session.evict()来管理session,

Clear()会清空所有对象,而evict()是删除某个对象消除。

Session.flush().会把数据持久化,再调用session.clear()消除缓存

如查数据量特别大,考虑用jdbc实现,再不行数据本身的特定的导入工具

二级缓存:也称进程级的缓存,也叫sessionFactory级的缓存,二级缓存可以被所有的session共享,二级缓存的生命周期和sessinFactory的生命周期一致,sessionFactory可以管理二级缓存

二级缓存的配置和使用:把二级缓存的配置文件ehcache-failsafe.xml

配置

name=”https://www.360docs.net/doc/0710521502.html,er_second_level_achche”>true 开启二级缓存

name=”hibernate.cache.provider_class”>org.hibernate.cache.EhCacheProvider指定产品提供商

最后在hbm.xml指定使用缓存的对象:

也可在cfg.xml中指定

usage=”read-only”>

管理二级缓存:

SessinFactory factory= HiberanteUtils.getSessionFacroty();

Factory.evict(Student.class);从二级缓存中删除所有的Student对象

Factory.evict(Student.class,1)从二级能在中删除id为1的Student对象

设置缓存模式:session.setCacheMode(CacheMode.GET)

CacheMode.GET 只向二级缓存读取数据

CacheMode.PUT只向二级缓存放数据

CacheMode.Nomar只可读也可取数据

缓存与数据库同步:当你加能过DDL操作时,Hibernate默认会把对象放入缓存中,当你下次又要查询数据时,在对象保存时间范围内Hiberante 会直接从缓存中读到数据返加过来,而不会再去数据库查询,所以当关系一方之间发生了变化,而另一方如果没有手动地去更新的话,那么他们之间是一同步的,那样得到是脏数据,为了维护缓存和数据库一致,我们要手动地去更新对象。

二级缓存是与sessionFactory同步的,而一个程序中往往只有一个sessionFactory,所以二级缓存是和程序一起存在,所以二级缓存和同步更为重要。

查询缓存:是针对普通属性结果集的缓存,对实体对象的结果集只缓存id,

生命周期:当前关联的表发生了修改,那么查询缓存的生命周期结束true

query.setCachable (true); 起用一个查询缓存。Session和查询缓存无关,当换一另一个session时,还是利用同一个查询缓存

查询缓存对iterate()不起作用,iterate它不会用查询缓存里的东西

Hibernate3.6(开发必看)

1.Java对象持久化概述 1.1.应用程序的分层体系结构 1.1.1.基于B/S的典型三层架构 说明: 1,展现层:提供与用户交互的界面。 2,业务逻辑层:实现各种业务逻辑。 3,数据访问层:负责存放和管理应用程序的持久化业务数据。 1.1. 2.数据访问层与Hibernate在Java应用程序中的 角色 数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的API。完善的持久化层应该达到的目标: 1,代码重用性高,可完成所有的数据访问操作。 2,如果需要的话,能够支持多种数据库平台。 3,具有相对独立性,当持久化层变化时,不会影响上层实现。 在数据访问层(持久化层)中可以使用Hibernate框架以实现要求,如下图所示:

1.2.软件模型 1.2.1.各种模型的说明 概念模型: 模拟问题域中的真实实体。描述每个实体的概念和属性及实体间关系。不描述实体行为。实体间的关系有一对一、一对多和多对多。。 关系数据模型: 在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。有以下内容组成:1,若干表 2,表的所有索引 3,视图 4,触发器 5,表与表之间的参照完整性

域模型: 在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。 组成部分: 1,具有状态和行为的域对象。 2,域对象之间的关联。 域对象(domain object): 构成域模型的基本元素就是域对象。对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。域对象可代表业务领域中的人、地点、事物或概念。 域对象分为以下几种: 1,实体域对象:通常是指业务领域中的名词。(plain old java object,简单Java 对象)。 2,过程域对象:应用中的业务逻辑或流程。依赖于实体域对象,业务领域中的动词。如发出订单、登陆等。 3,事件域对象:应用中的一些事件(警告、异常)。 1.2.2.域对象间的关系 关联: 类间的引用关系。以属性定义的方式表现。

Hibernate配置文件的DTD

Hibernate中有两个配置文件 映射文件Xxx.hbm.xml 映射文件的的文件头DTD文件内容:

配置文件hibernate.cfg.xml 配置文件的文件头DTD文件内容: org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost/minmin?characterEncoding=gb2312 root minmin true create

SSH框架工作原理

典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与数据库交互。 表现层是传统的JSP技术,自1999年问世以来,经过多年的发展,其广泛的应用和稳定的表现,为其作为表现层技术打下了坚实的基础。 中间层采用的是流行的Spring+Hibernate,为了将控制层与业务逻辑层分离,又细分为以下几种。 Web层,就是MVC模式里面的“C”(controller),负责控制业务逻辑层与表现层的交互,调用业务逻辑层,并将业务数据返回给表现层作组织表现,该系统的MVC框架采用Struts。 Service层(就是业务逻辑层),负责实现业务逻辑。业务逻辑层以DAO层为基础,通过对DAO组件的正面模式包装,完成系统所要求的业务逻辑。 public interface UserService { public ListfindAll(); public void save(User user); public void delete(User user); public User findById(Integer id); public void update(User user); } DAO层,负责与持久化对象交互。该层封装了数据的增、删、查、改的操作。 public interface UserDAO { public void saveUser(User user); public void removeUser(User user); public User findUserById(Integer id); public ListfindAllUsers(); public void updateUser(User user); } PO,持久化对象。通过实体关系映射工具将关系型数据库的数据映射成对象,很方便地实现以面向对象方式操作数据库,该系统采用Hibernate作为ORM框架。

缓存机制

3.1、缓存策略 3.1.1、一级缓存 之前每一个数据库操作都是一个Session,那么对于Session来说本身是存在着缓存,可以保留之前的查询结果。 但是对于Session的缓存只针对于一个Session有效,那么如果现在想针对于多个Session 有作用,则必须在SessionFactory上配置缓存,那么这样的缓存称为二级缓存。 在Hiernate按ID查询有两个方法:load、get 那么下面使用以上的查询方法,查询两次 程序虽然调用了两次load方法,但是只发出了一条的查询命令,证明,第一次的查询结果被保存下来了,那么这就是一级缓存。

与之前的相比,查询了两次操作,所以此时,证明一级缓存只是针对于一个Session起作用的。但是一级缓存是无法关闭的,始终会存在。

从运行结果可以发现,如果之前先进行了保存操作,那么之后再查询的话也不会重新发出查询语句。证明实体被缓存下来。 问题: 如果现在要求使用程序插入100000万条记录?该怎么办? 如果使用Hibernate处理的话,则可能会出现内存的溢出,所以在这种情况下首先是绝对不建议使用Hibernate完成的,就使用最基本的JDBC操作完成即可。 如果非要使用Hibernate做,则必须使用到Session中关于缓存的一些操作方法:·清空Session中的所有缓存:clear() ·清空Session中一个指定的实体:evict(Object obj) 例如:下面验证clear()方法 因为程序中,将所有的缓存清空了,所以之后再查询相同实体的时候,在Session中已

以上因为只清空了一个实体,所以只发出了三个查询语句。 那么就可以通过以上的方式完成100W条记录的插入 思路:按照每十条清空缓存的操作,并将缓存中的内容强制性的写到数据库之中 3.1.2、二级缓存(重点) 在Hibernate本身中支持了多种的二级缓存组件。本次使用EHcache。如果要想使用ehcache话,则首先必须进行配置,配置ehcache的缓存文件。 ehcache.xml:

spring4.x + hibernate4.x 配置详解

spring4.x + hibernate4.x 配置详解 关于spring和hibernate的使用以及特征等等,在此不再啰嗦,相信大家也都知道,或者去搜索一下即可。 本篇博文的内容主要是我最近整理的关于spring4.x 和hibernate 4.x 相关配置和使用方式,当然spring3.x以及hibernate4.x也可以借鉴。 首先是配置文件web.xml 增加以下代码即可 contextConfigLocation classpath*:/applicationContext.xml org.springframework.web.context.ContextLoaderListener 然后建立 applicationContext.xml 文件,src下。文件内容如下,注释我尽量写的很详细 sa jdbc:sqlserver://localhost:1433;databaseName=dbuser

hibernate配置数据库连接池的三种方法

?数据库连接池的概念(是什么,做什么用的,有什么好处) ?首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了。?以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放。如果频繁的数据库操作,就会导致性能很低。连接池的出现,为开发过程提供了一个很好的管理平台。当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 ?而Hibernate的出现把连接池的使用引入了一个新的利用方式,让你充分享受配置化给开发带来的便利。 1 C3P0 (以验证可用) 只需在hibernate.cfg.xml中加入 omdssd_admin omdssd_hskj jdbc:oracle:thin:@10.142.1.138:1521:omds oracle.jdbc.driver.OracleDriver org.hibernate.dialect.Oracle9Dialect true true oracle10g_112 org.hibernate.connection.C3P0ConnectionProvider 5 //连接池中数据库连接的最小数目 30 //连接池中数据库连接的最大数目 1800 //设定数据库连接的过期时间,以秒为单位 50 //可以被缓存的PreparedStatement实例的最大数目。缓存适量的PreparedStatement实例,能够大大提高Hibernate的性能。 120//在使数据库连接自动生效之前处于空闲状态的时间,以秒为单位

Hibernate学习入门教程

Hibernate学习入门教程 开发环境搭建 [日期:2015-08-11] 来源:Linux社区作者:doctorJoe [字体:大中小] 其实一两个月前就在了解Hibernate方面的知识了,但一直以来,都没有好好的总结,而且一直使用的是myeclipse,感觉有些傻瓜式的操作就可以搭建起Hibernate的开发环境,但这样一点都不好,没有理解到Hibernate到底是怎么配置的,所以你今天特使用Eclipse来一步一步搭建Hibernate的开发环境,下面,正式进入正题。 在Hibernate中开启日志https://www.360docs.net/doc/0710521502.html,/Linux/2015-07/120499.htm Hibernate+JUnit测试实体类生成数据库表https://www.360docs.net/doc/0710521502.html,/Linux/2015-07/120161. htm Hibernate整体理解https://www.360docs.net/doc/0710521502.html,/Linux/2014-07/104405.htm Hibernate的映射机制https://www.360docs.net/doc/0710521502.html,/Linux/2014-12/110265.htm 新建一个web项目,名字就随便吧,你喜欢什么名字就什么吧,这是我的截图。

引入hibernate的依赖jar包,我使用的是hibernate-release-4.3.10.Final,下载好后解压,打开压缩包下的lib目录下的require文件夹,这是hibernate的所以来的必须的jar包,接下来,在刚才新建的项目里新建一个libs文件夹,将刚才的所说的jar包copy进去,另外,由于我们需要连接MySQL数据库以及使用JUnit测试,将所需的mysql-connector-java-5.0.8-bin.jar和junit-4.5.jar两个jar包引用进去,关于这些jar包,可以在网上搜索。接下来,就是把这些jar 包添加到编译环境中去,选中libs下的jar包,右击选择Build Path –>Add to Build Path,这样就把依赖jar包成功添加进去了。 继续往下,我们需要配置最重要的hibernate配置文件hibernate.cfg.xml以及进行日志处理的log4j.properties属性文件:打开上一步解压后的hibernate文件夹,打开project—>etc文件夹,将该文件夹下的hibernate.cfg.xml和log4j.properties文件拷贝到项目的src文件夹下,打开hibernate.cfg.xml文件,将session-factory标签中的内容替换成如下的内容: org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql:///hibernatedemo root yzp140103 这样就配置好了。 接下来,要做的就是做开发测试了:在项目的src目录下新建一个实体类包com.joe.entity,在该包下新建一个实体类Student,代码如下: package com.joe.entity; import java.io.Serializable;

JAVA复试问题答案

(一) JAVA复试的问题整理 1 Hibernate 的优化流程是如何实现的,流程是怎么样? 1.尽量使用many-to-one,避免使用单向one-to-many 2.灵活使用单向one-to-many 3.不用一对一,使用多对一代替一对一 4.配置对象缓存,不使用集合缓存 5.一对多使用Bag 多对一使用Set 6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象 7.消除大表,使用二级缓存 2 Struts1与Struts2的区别? 在Action 实现类方面的对比:Struts 1 要求Action 类继承一个抽象基类;Struts 1 的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action 类可以实现一个Action 接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts2 提供一ActionSupport 基类去实现常用的接口。即使 Action 接口不是必须实现的,只有一个包含execute 方法的POJO 类都可以用作 Struts 2 的Action 。 线程模式方面的对比:Struts 1 Action 是单例模式并且必须是线程安全的,因为仅有Action 的一个实例来处理所有的请求。单例策略限制了Struts 1 Action 能做的事,并且要在开发时特别小心。Action 资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 Servlet 依赖方面的对比:Struts 1 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。Struts 2 Action 不再依赖于 Servlet API,从而允许Action 脱离Web 容器运行,从而降低了测试Action 的难度。当然,如果Action 需要直接访问HttpServletRequest 和HttpServletResponse 参数,Struts 2 Action 仍然可以访问它们。但是,大部分时候,Action 都无需直接访问HttpServetRequest 和HttpServletResponse,从而给开发者更多灵活的选择。 可测性方面的对比:测试Struts 1 Action 的一个主要问题是execute 方法依赖于Servlet API,这使得Action 的测试要依赖于Web 容器。为了脱离Web 容器测试 Struts1

Mysql Hibernate Spring 的配置及jdbc连接简单程序

Mysql Hibernate Spring 的配置

Hibernate常见概念以及关键技术

软件开发的分层思想: 三层架构: 数据表现层业务逻辑层数据持久层 SUN的桌面应用Swing AWT 普通Java类JDBC SUN的WEB基本应用JSP 普通Servlet JDBC SUN的WEB高级应用JSF SessionBean Persistence WEB国内流行开源Struts Spring Hibernate 一、对象持久化的理论 1.对象持久化:内存中的对象转存到外部持久设备上,在需要的时候还可以恢复。 2.对象持久化的原因(目标):// 是基础工作!是信息共享的主要原因 物理:1) 内存不能持久,需要在硬盘上持久保存//(物理上,物理的都不是根本原因) 2) 内存容量有限,需要在容量更大的硬盘上保存 应用:3) 共享(Internet的本质:信息的收集、整理、发布) //最重要的原因 4) 检索(大规模) //也很重要 5) 管理(备份、安全) 3.怎样进行对象持久化?(仅从JA V A方面讲) 物理:1) 对象序列化 2) DB技术(JDBC 数据库) 4.怎样利用数据库做对象持久化? 优点:功能完备、理论上效率高 缺点:复杂(难)、代码量大、面向R(过程;二维表关系) 2) EJB 仅讲Entity Bean 优点:封装JDBC 缺点:更复杂的API、重量级(侵入式)、功能不完备、难共享 缺点的后果:开发周期长、测试困难、面向过程 以上是2.0之前的版本,但3.0跟Hibernate基本一样 3) ORM 轻量级框架(Hibernate) 现阶段最佳的持久化工具:文档齐全、服务很好、工业标准、大量应用、易学 优点:封装JBDC、简单的API、轻量级(只做持久化)(用类库)、PO(持久对象)->POJO(纯JA V A)、开源 缺点:不够JDBC灵活 5.结论: 1)对象持久化是必须的 2)必须使用DB来实现 3)Hibernate必须的(现阶段最佳选择) 开源工具的通常问题:1.文档不全;2.服务不全;3.标准化不够 而Hibernate避免了所有这些问题 二、ORM和Hibernate的相关知识(理解)

最新版本Struts2.3.12+Spring3.2.2+Hibernate4.2.0框架配置详细步骤

SSH框架搭建 Struts2.3.12+Spring3.2.2+Hibernate4.2.0 编号:SSH-S2-S3-H4 版本:V1.1 级别:公开 编写时间:2013-03-18

目录 1 导言 (1) 1.1 目的 (1) 1.2 范围 (1) 1.3 说明 (1) 2 搭建Struts2 (2) 2.1 搭建所需jar包 (2) 2.2 整合步骤 (2) 2.2.1 创建项目 (2) 2.2.2 导入jar包 (2) 2.2.3 配置web.xml (4) 2.2.4 创建web (4) 2.2.5 创建jsp页面 (5) 2.2.6 配置struts.xml (6) 2.2.7 配置Tomcat (6) 2.2.8 部署项目 (7) 2.3 测试 (8) 2.3.1 启动Tomcat (10) 2.3.2 测试Tomcat (10) 2.3.3 测试Struts (11) 3 整合Spring3 (12) 3.1 整合所需jar包 (12) 3.2 整合步骤 (12) 3.2.1 导入jar包 (12) 3.2.2 配置web.xml (12) 3.2.3 配置struts.xml (13) 3.2.4 配置spring.xml (13) 3.3 测试 (14)

3.3.1 启动Tomcat (14) 3.3.2 测试登录 (14) 4 整合Hibernate4 (15) 4.1 整合所需jar包 (15) 4.2 整合步骤 (15) 4.2.1 导入jar包 (15) 4.2.2 创建数据库ccc (15) 4.2.3 创建对象User (16) 4.2.4 生成映射文件User.hbm.xml (17) 4.2.5 创建dao (18) 4.2.6 创建service (19) 4.2.7 创建web (20) 4.2.8 配置jdbc.properties (21) 4.2.9 配置db.xml (22) 4.2.10 配置spring.xml (24) 4.2.11 配置struts.xml (24) 4.3 测试 (25) 4.3.1 启动Tomcat (25) 4.3.2 测试登录 (25)

2019最新Java面试题,常见面试题及答案汇总

ava最新常见面试题+ 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示: 可能对于初学者不需要后面的框架和JVM 模块的知识,读者朋友们可根据自己的情况,选择对应的模块进行阅读。 适宜阅读人群 需要面试的初/中/高级java 程序员 想要查漏补缺的人 想要不断完善和扩充自己java 技术栈的人 java 面试官 具体面试题 下面一起来看208 道面试题,具体的内容。 一、Java 基础 1.JDK 和JRE 有什么区别? 2.== 和equals 的区别是什么? 3.两个对象的hashCode()相同,则equals()也一定为true,对吗? 4.final 在java 中有什么作用? 5.java 中的Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与String str=new String(“i”)一样吗? 9.如何将字符串反转? 10.String 类的常用方法都有那些? 11.抽象类必须要有抽象方法吗? 12.普通类和抽象类有哪些区别? 13.抽象类能使用final 修饰吗?

14.接口和抽象类有什么区别? 15.java 中IO 流分为几种? 16.BIO、NIO、AIO 有什么区别? 17.Files的常用方法都有哪些? 二、容器 18.java 容器都有哪些? 19.Collection 和Collections 有什么区别? 20.List、Set、Map 之间的区别是什么? 21.HashMap 和Hashtable 有什么区别? 22.如何决定使用HashMap 还是TreeMap? 23.说一下HashMap 的实现原理? 24.说一下HashSet 的实现原理? 25.ArrayList 和LinkedList 的区别是什么? 26.如何实现数组和List 之间的转换? 27.ArrayList 和Vector 的区别是什么? 28.Array 和ArrayList 有何区别? 29.在Queue 中poll()和remove()有什么区别? 30.哪些集合类是线程安全的? 31.迭代器Iterator 是什么? 32.Iterator 怎么使用?有什么特点? 33.Iterator 和ListIterator 有什么区别? 34.怎么确保一个集合不能被修改?

hibernate面试题

1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2.Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4.说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c) 第三方缓存的实现

利用轻量对象关系映射技术Hibernate提高开发效率

利用轻量对象关系映射技术Hibernate提高开发效率 Enhancing Development Efficiency with Hibernate a Lightweight Object/Relational Mapping Technology 谢挺 周维民 (上海大学机电工程与自动化学院,上海 200072) 摘 要 Hibernate是一种轻量对象关系映射技术。文章通过实例,介绍了Hibernate的一些关键特性,并阐述了该技术的一些局限性。 关键词 Hibernate 对象关系映射企业级JavaBeans 持久化 Abstract Hibernate is a lightweight Object/Relational Mapping(ORM) technology. Some key features of Hibernate are illustrated, and some limits of this technology are expounded. Keywords Hibernate Object/Relational Mapping (ORM) EJB Permanence 0 引言 随着internet的发展,应用服务程序已经从集中式、C/S模式过渡到B/S、分布式模式;无论是用户或是供应商都迫切希望缩短开发周期、提高开发效率,Hibernate应运而生。 1 Hibernate简介 Hibernate是一个面向Java环境的对象/关系数据库映射工具。对象/关系数据库映射(Object/Relational Mapping , ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型中去。 Hibernate不仅提高Java类到数据库的映射,还提供数据查询和获取数据的方法。Hibernate在英语中的意思是“冬眠”,顾名思义它使得商务逻辑的开发和数据库最大程度地分离,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标是解放开发者通常与数据持久化相关的编程任务的95%。对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是很有用的。 图1是Hibernate的体系结构图,从图中可以Array看到,系统为3层B/S模式,应用程序在客户端运 行将持久化的对象交由Hibernate。Hibernate通过 properties属性设置和XML Mapping实现商务逻 辑,调用和存储低层数据库后将返回的结果送给 客户端。 Hibernate对每一种数据库都有对应的 Dialect进行操作优化,从而提高它在各种情况 下的效率。目前,它的版本为3.0、支持的数据 库有Oracle、DB2、MySQL、PostgreSQL、Sybase,Interbase、Pointbase、Microsoft SQL Server、