Hibernate(介绍二)
根据上一节的介绍,我们在来说一下hibernate的主要优点吧
1:提高生产力 hibernate是JDBC轻量级的对象封装,它是一个独立的对象持久化对象,因为我们就不用在写枯燥的jdbc语句,减少编码量
2 使开发更对象化了 我们可以直接操作对象就可以了 ,像上面的小应用 我们只要sava一个对象,数据就可以存进去了。
3 移植性 我们在开发的过程中没有涉及到具体的sql语句操作,虽然sql是标准的,但是各个厂家还是有些不同,很典型的就像分页,在这里我们就用hibernate标准的API直接sava,hibernate会自动地转换成数据库的相关语句,关键是在于方言的配置,也就是适配器的配置。
4 支持透明持久化, 看上面我们的那个Users对象,它没有实现任何接口也没有继承任何类,而hibernate就给存进去了,所以对我们的Users实体来说,它没有侵入性,我们Users实体就是最纯粹的POJO对象
然而使用hibernate正确的开发模式 :
1 :先建立对象模型,这个对象模型我们可以称为领域模型
2 :建立它们映射关系
3 :根据映射关系 导出相应的表,然后再进行相应的开发操作。
这是从对象这方面来考虑的
而现实中,一般的做法都是先设计数据库表,再采用hibernate进行应用开发,这样感觉hibernate不是这么好用了,或者说是功能体现不出来,我们讲究的是以对象为中心,这样又以关系数据库为中心了,从关系转到对象 !
为什么说先以对象建模比较好呢,因为对象更能体现出现实世界的这种事物,让人更好的理解需求,包括模型,所以我们还是以对象为中心,在这个过程中都会以对象为中心,不会先建立表,在做映射,我们需要这种思维,所以我在一下的hibernate学习过程中都会以这种思想为主。
下面我再说说hibernate应用的具体流程
我们在做hibernate应用的时候,因为hibernate是以java开发的开源框架,所以我们要把相关的jar包引进来,还有相关的jdbc驱动,为了方便管理这些jar包以及下次方面导入我们可以创建自定义的User Libraries,把hibernate相关的具体jar包导进去 ,在工程中引用 具体的方式已经是hibernate介绍(一)中介绍过了
更觉hiberrnate需要我们要提供一个hibernate.cfg.xml的配置文件或者hibernate.property属性文件 当然这是现实开发中大多数采用hibernate.cfg.xml这种方式 。若果我们想跟踪hibernate细节的东西 或者为了方便调试我们最好要把log4j日子文件加进去,不然出错了它不会在控制台打印
hibernate环境搭建好了 下面就是hibernate的使用过程了,先建立实体,如果有多个或者他们之间有关系,我们还要建立它们之间的关系,这样映射关系就有了,我们一般会采用hibernate的一个工具就是hbm-ddl的一个转换,根据映射文件它会自动生成表,存储这一块我们就可以不用操心了
表已经有了,我们开发客户端就可以了,表对我们来说是透明的,我们操作的只是对象就可以了
下面根据上面的图片 来介绍下我们开发过程中常用到的几个核心接口
首先我们介绍在客户端开发设计到的几个对象
configuation 它的主要作用是用来加载系统配置文件的,configuration在new完之后它只会加载.property文件 所以我们必须采用它们的方法.configure()这样它才会加载hibernate.cfg.xml文件,而这个文件时可以改名的 改完名我们可以在.configure()源码中默认的是hibernate.cfg.xml,我们该完传过去就可以了
SessionFactory 它是和数据库绑定的,一个数据库对应一个SessionFactory,也就是说这数据库里面所有的表以及表之间的映射都会放到SessionFactory中,后期会涉及到二级缓存 SessionFactroy和二级缓存相关,二级缓存是进程级的,缓存就拿我们的web开发中的application来理解就相对于它似的
SessionFactory是一个重要级的兑现,重于轻时一个相对的,因为SessinFactory对象创建时间比较耗时,所以我们这里成为重量级的,所有的SessionFactory这个对象我们最好只创建一次,不要频繁的创建,另一方面SessionFactory是线程安全的,所以说我们完全可以把它放到一个成员变量里,有多线程来调用它这样也是可以的。
session 操纵hibernate来进行CRUD操作(CRUD任务是完成数据库的交流 ,包含了很多常见的sql语句)
我们必须要理解session ,我们要记住session不同于connection我们也可以这样理解:session是对connection又做了一重包装,你open一个session的时候并不代表open一个connection只有真正用的时候它才去会拿一个connection 从连接池里去拿,我们现在上面的配置没有连接池,但是hibernate默认上实现了连接池,你可以设置连接池的大小,我们去看property文件有一个 poolsize 这个对象,而且这个链接吃还可以集成第三方连接池,像ddcp(tomcat用的)为什么说session和connection不一样呢 ,connection就是一个连接,而我们这里的session管理了缓存,所以学hibernate我们要学习它的缓存
它对我们的实体对象是一个生命周期的管理,还有我们要记住session是非线程安全的,所以说我们open一个session不能多线程恶搞来用,所以我们通常一个业务请求过来open一个session业务请求完毕,session关闭,session关了事务也就关了,因为通常一个业务请求也对应一个事务
jndi java名称与目录接口,jndi是用于管理我们对象的 特别是ejb应用,他会把所有的ejb应用都放到jndi这颗树上,它就像一个电话薄,一个姓名对应一个电话,一个友好的字符串对应一个实例。
我们采用的tomcat连接池也是采用这种形式来做的,连接池对象注射到这个树上,以后我们拿这个串就可以了 这样我们就可以访问的到
采用jdni的好处 一个事我们对象可以统一管理。这是一方面另一方面我们不依赖于具体的实现了我们lookup来查找这样的连接池 我们不知道连接池是dbcp的实现,这个连接池我们可以换成其他的,我们连接池对我们来说是透明的
jdbc java的数据库链接从事务上来看 我们可以称为是本地事物,本地事物是对一个数据库起作用,但是一旦跨数据库跨其他资源这样本地事务就没法实现了 ,这样我们就可以使用jta事务
JTA : jta是java事务的API,它实现两阶段提交协议