Hibernate复习之Hibernate基本介绍.doc_第1页
Hibernate复习之Hibernate基本介绍.doc_第2页
Hibernate复习之Hibernate基本介绍.doc_第3页
Hibernate复习之Hibernate基本介绍.doc_第4页
Hibernate复习之Hibernate基本介绍.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate复习之Hibernate基本介绍众所周知,目前流行的面向对象的对象关系映射的Java持久层框架有MyBatis和hibernate,他们都是对象关系映射ORM, 解决的主要问题就是对象-关系的映射,域模型和关系模型都分别建立在概念模型的基础上,域模型是面向对象的,关系模型是面向关系的,一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。 (可能存在类中多个属性对应一列的情况,映射组成关系), ORM中间件采用元数据来描述对象-关系映射细节,元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中,如果希望把ORM软件集成到自己的Java应用中,用户首先要配置对象-关系映射文件。Hibernate中也就是entity.hbm.xml,而MyBatis中就是entityMapper.xml 下面主要介绍一下Hibernate的执行过程:session.save(customer)执行过程: 1)运用反射机制,获得customer对象的类型Customer.class 2)参考对象-关系映射元数据,了解Customer类对应的表,以及属性对应的列,Customer类和其他类关系。 3)根据以上映射信息,生成SQL语句insert into tab_customer values(id,name,password,telphone);4)调用JDBC API,执行以上的SQL语句。JDBC与Hibernate比较: 1,JDBC: Java中嵌入SQL,不便于维护 Hibernate: 无须编写SQL语句;由Hibernate通过读取映射文件在运行时自动生成SQLsave(student)- insert into customer values(?,?,?);2,JDBC:查询数据,需要手动封装成对象;保存对象,需要手动插入值 Hibernate: 可自动实现对象和表中记录的转换 3,JDBC:查询内存中已存在的对象,修改属性值,均需要和数据库进行交互 Hibernate:通过Dirty checking(脏检查)避免交互;Hibernate的工作原理: 1,Hibernate框架根据hibernate.cfg.xml的配置的信息来和数据库进行通信,当然和spring结合后也可以通过注解来实现。 2,Hibernate框架根据具体的映射文件*.hbm.xml 来保存,更新,删除,查询对象。Hibernate API,Hibernate中几个比较重要的类: Configuration接口: Configuration对象用于配置并且启动Hibernate,Hibernate应用通过Configuration实例还指定对象-关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例Configuration config = new Configuration();Config.configure();SessionFactory factory = config.buildSessionFactory();SessionFactory : 用来构造Session的实例对象,它的特点: 1)线程安全: 该实例对象何以被多个线程共享 2)重量级:该实例对象的构造和销毁消耗系统资源,所以一般在应用程序启动的时候就构造实例对象,一般一个数据库对应一个SessionFactory的实例对象,如果要访问多个数据库,就需要创建多个该实例对象。 3)SessionFactory实例对象中维护了一个很大的缓存,存放了一些预定义的SQL语句和XML配置文件的信息,另外还维持了一个Hibernate的第二级缓存(缓存了所有Session对象所加载的POJO对象),用来保存在该生命周期中的一些业务对象,但是这个第二级缓存默认是关闭的,必须在xml中手动配置才可以开放Session session = factory.openSession();Session(别名:持久化管理器),用来对对象的保存,更新,删除和查询 特点: 1)线程不安全,要避免同一个Session对象被多个线程共享,一般一个线程对应一个Session 2)轻量级:可以随意的构造和销毁该实例对象。 3)Session对象中维护了一个缓存,称为Hibernate的第二级缓存(缓存了当前Session对象所加载的那些POJO对象),每个Session对象都有自己的缓存。 Query: 利用HQL语句(Hibernate Query Language)用来查询单个或者多个对象,面向对象的Query query = session.createQuery(from Student where studentId=1);Student s = (Student)query.uniqueResult();Criteria: 功能同上,以面向对象的形式和数据库进行复杂的CRUD操作,还适用于动态查询。 Transaction: 用来处理事务,事务的启动,提交,回滚OID:主键 在Java语言中,按照内存地址来识别或区分同一个类的不同对象,关系型数据库按主键值来识别或区分同一个表的不同记录,Hibernate使用OID来统一两者之间的矛盾,OID是关系数据库中的主键(通常为代理主键)在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。为了保证持久化对象的OID的唯一性和不可变性,通常由Hibernate或底层数据库来为OID赋值,可以将OID的setId()方法设置为private类型,以禁止Java应用程序随便修改OID。 :子元素用来设定标识符生成器 Hibernate提供了标识符生成器口:net.sf.hibernate.id.IdentifierGenerator,并且提供了很多内置实现。net.sf.hibernate.id.IdentityGenerator 缩写名 identity net.sf.hibernate.id.IncrementGenerator 缩写名 increment主键生成方式: 1,increment: 其生成方式与底层数据库无关,大部分数据库都支持,该方式的实现机制是在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。其不足之处是当多个线程并发对数据库表进行写操作时,可能出现相同的主键值,发生主键重复的冲突,所以在多线程并发操作的时候不应该使用该方法。 2,identity: 与底层数据库有关,要求数据库支持Identity,如MySQL中auto_increment,SQL Server中的identity。支持的数据库有MySQL,SQL Server,DB2,Sybase,但是不支持Oracle,它同时支持并发操作。 3,assigned: 主键由外部程序负责生成,无需Hibernate参与。如果要由程序代码来指定主键,就采有这种方式。 4,sequence 使用序列生成主键,需要底层数据库支持在数据库中建一个序列create sequence seq_name increment by 1 start with 1;然后在映射文件中指定使用序列的名字 seq_name 5,hilo 通过hi/lo算法生成主键,需要一个表来保存主键的信息,在数据库中建一张表:create table hi_value(next_hi number not null);insert into hi_value(next_hi) values(1);commit;映射文件中需要指明表的这些信息 hi_value next_hi 100 6,seqhilo 与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库, 在数据库中建一个序列create sequence seq_name increment by 1 start with 1; seq_name 100 7, native: 由Hibernate根据不同的数据库方言自行判断采用identity、hilo、sequence其中一种作为Hibernate主键生成方式,native的优点是与底层无关,便于不同数据库之间的移植,由Hibernate根据不同数据库选择主键的生成方式。在oracle中需要创建叫 Hibernate_sequence名字的sequence,如果设置了Hibernate.hbm2ddl.auto属性,不需要手动建立序列,前提是数据库帐号必须有Create Sequence这种高级权限。mysql等数据库则不用建立sequence。 8,foreign 外键生成方式,依赖其他表的主键,在主键一对一映射中需要使用到 id 9,uuid.hex: 采用基于128位的算法生成唯一值,并编制成32位长度的唯一字符串作为主键值,uuid.hex的优点是支持大部分数据库,缺点就是要占用较大的存储空间。对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。 10,uuid.string: 使用UUID算法,UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能在PostgreSQL数据库中使用。uuid.string同uuid.hex类似,需要占很大的存储空间。 11,select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)介绍完以上这些内容之后,下面就简单的体验一下搭建Hibernate的开发环境: 1.导入Hibernate的jar包,我这里新建的是Maven项目,因此首先需要添加关于Hibernate的依赖,由于我们还需要与数据库打交道,因此还需要添加数据库以及数据源的依赖jar包,以下是我的pom.xml文件的内容: UTF-8 4.1.7.Final 1.0.12 5.1.18 junit junit 4.12 test org.hibernate hibernate-core $hibernate.version com.alibaba druid $druid.version mysql mysql-connector-java $mysql.version 2.在src/main/resources目录下新建一个hibernate.cfg.xml的文件,里面我们主要配置数据源: com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/hibernate root admin org.hibernate.dialect.MySQLDialect true true update 3.我们这里新建一个Student的实体类,并且也在src/main/resources目录下创建一个映射文件:student.hbm.xml Student.javapackage com.ecjtu.hibernate.entity;import java.io.Serializable;import java.util.Date;public class Student implements Serializable private static final long serialVersionUID = 1L; private String major; private Long id; private String name; private String sex; private Integer age; private Date birthday; public Student() public Student(String major, Long id, String name, String sex, int age, Date birthday) super(); this.major = major; this.id = id; = name; this.sex = sex; this.age = age; this.birthday = birthday; public String getSex() return sex; public void setSex(String sex) this.sex = sex; public Date getBirthday() return birthday; public void setBirthday(Date birthday) this.birthday = birthday; public String getMajor() return major; public void setMajor(String major) this.major = major; public Long getId() return id; public void setId(Long id) this.id = id; public String getName() return name; public void setName(String name) = name; public Integer getAge() return age; public void setAge(Integer age) this.age = age; Override public String toString() return StudentMajor: + getMajor() + Id: + getId() + Name: + getName() + sex: + getSex() + Age: + getAge() + birthday: + getBirthday() + ; student.hbm.xml 4.建好这些之后基本上也就大功告成了,接下来就可以测试了,在src/test/java下面新建一个测试类HibernateTest.javapackage com.ecjtu.hibernate.Test;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Before;import org.junit.Test;import com.ecjtu.hibernate.entity.Student;/* * ClassName: HibernateTest * Description: Hibernate测试 * author Zhouxh * date 2017年2月19日 */public class HibernateTest private SessionFactory sessionFactory; SuppressWarnings( deprecation) Before public d init() /1.创建配置对象 Configuration configuration=new Configuration(); /2.读取配置文件,参数可为空,Document,File,配置文件的路径或者URL /HibernateTest/src/main/resources/hibernate.cfg.xml configuration.configure(); /3.根据配置文件,创建一级缓存(sessionFactory) sessionFactory=configuration.buildSessionFactory(); Test public void test() /* * 建立与数据库的连接 * 映射文件,映射对象 * session 代码与数据库之间的会话 */ /4.创建Session,打开会话 Session session=sessionFactory.openSession(); /5.开启事物 Transaction transaction=session.beginTransaction(); Studentstudent=newStudent(软件工程, 1000L, 李四, 男, 34, new Date(System.currentTimeMillis(); session.save(student); /6.事物的提交 mit(); /7.session的关闭 session.close(); 5.执行完Junit单元测试成功了即可,这时控制台也会打出insert into语句,这就说明我们的配置没有问题了。 6.封装HibernateSessionFactory工具类,因为Session是线程不安全的,为了保证当前线程只有一个session对象,并且当前线程中的Session不能让其他线程来访问,需要将获取Session的方法进行封装,为了保证Session的线程安全性,需要将Session放到ThreadLocal中,ThreadLocal为线程本地变量 HibernateSessionFactory.java,主要是为了维护Session的创建和关闭。package com.ecjtu.hibernate.util;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;/* * ClassName: HibernateSessionFactory * Description: 封装一个创建Session的工厂并且得到Session的方法 * author Zhouxh * date 2017年2月20日 */SuppressWarnings(deprecation)public ss HibernateSessionFactory /hibernate.cfg.xml文件的位置 /private static String configFile = hibernate.cfg.xml; private static SessionFactory factory; / 用于存放Session,该对象是线程安全的,只有当前线程才能访问 private static ThreadLocal threadLocal; static Configuration config = new Configuration( ); / 无参默认系统去找src下面的hibernate.cfg.xml config.configure(); / 重量级:该实例对象的构造和销毁消耗系统资

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论