一、Hibernate简介

  1、什么是Hibernate?

          Hibernate是数据持久层的一个轻量级框架。数据持久层的框架有很多比如:iBATIS,myBatis,Nhibernate,Siena等等。并且Hibernate是一个开源的orm(Object relations mapping)框架,提供了查询获取数据的方法,用面向对象的思想来操作数据库,节省了我们开发处理数据的时间。

  2、Hibernate的优点

          1)、使用简介的hql语句(Hibernate query language)。可以不使用传统的insert,update等sql语句。比如insert一个对象,原来的做法是:insert into 表名称 alue(值1,值2,值3,……),而现在的做法是:save(对象)。

          2)、使用or映射。对象到关系数据库之间的映射。是从对象的角度操作数据库,再次体现了面向对象思想。原来的实体抽取方法:首先有了表,然后表映射实体对象。而现在Hibernate做法是:直接由对象映射到表。

          3)、没有侵入性,移植性比较好。什么是没有侵入性?就是Hibernate采用了pojo对象。所谓的pojo对象就是没有继承Hibernate类或实现Hibernate接口。这样的话,此类就是一个普通的java类,所以移植性比较好。  

          4)、支持透明持久化。透明是针对上层而言的。三层架构的理念是上层对下层的依赖,只是依赖接口不依赖具体实现。而Hibernate中的透明是指对业务逻辑层提供了一个接口session,而其他的都封装隐藏。持久化是指把内存中的数据存放到磁盘上的文件中。

  3、当然一个事物,不可能十全十美,即使如此优秀的Hibernate也有自己的弱点。比如:若是大量数据批量操作。则不适合使用Hibernate。并且一个持久化对象不能映射到多张表中。

  4、Hibernate中5个核心接口

  1)、Configuration接口:负责配置及启动Hibernate,用来创建sessionFactory

      2)、SessionFactory接口:一个SessionFactory对应一个数据源存储,也就是一个数据库对应一个SessionFactory。SessionFactory用来创建Session对象。并且SessionFactory是线程安全的,可以由多个线程访问SessionFactory共享。

      3)、Session接口:这个接口是Hibernate中常用的接口,主要用于对数据的操作(增删改查)。而这个Session对象不是线程安全的。不能共享。

      4)、Query接口:用于数据库的查询对象。

      5)、Transaction接口:Hibernate事务接口。它封装了底层的事务操作,比如JTA(;java transcation architecture)所有的数据操作,比如增删改查都写在事务中。

二、项目相关的jar包12个:

antlr-2.7.6.jar

commons-collections-3.1.jar

dom4j-1.6.1.jar

ejb3-persistence.jar(注解必须包)

hibernate3.jar

hibernate-annotations.jar(注解必须包)

hibernate-commons-annotations.jar(注解必须包)

javassist-3.9.0.GA.jar

jta-1.1.jar

log4j-1.2.15.jar

slf4j-api-1.5.8.jar

slf4j-log4j12-1.5.8.jar

  还要加入数据库的相关的JDBC驱动的jar包:mysql-connector-java-5.1.25-bin.jar(MySQL),ojdbc14.jar(Oracle)。可以到http://www.docjar.com/网站下载。

三、配置核心文件hibernate .cfg.xml

 

 1 <?xml version='1.0' encoding='utf-8'?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6 
 7     <session-factory>
 8 
 9         <!-- Database connection settings -->
10         <!--mysql settings 
11         <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
12         <property name="connection.url">jdbc:mysql://localhost/hibernate</property> 
13         <property name="connection.username">root</property> 
14         <property name="connection.password">196691</property> 
15         -->
16         <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
17         <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
18         <property name="connection.username">CYRUS</property>
19         <property name="connection.password">12345678</property>
20 
21 
22         <!-- JDBC connection pool (use the built-in) -->
23         <!-- <property name="connection.pool_size">1</property> -->
24 
25          <!-- SQL dialect  mysql settings
26         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>-->
27         <!-- SQL dialect -->
28         <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
29 
30         
31         <!-- Enable Hibernate's automatic session context management -->
32         <!-- <property name="current_session_context_class">thread</property> -->
33 
34         <!-- Disable the second-level cache -->
35         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
36 
37 
38 
39         <!-- Echo all executed SQL to stdout -->
40         <property name="show_sql">true</property>
41         <property name="format_sql">true</property>
42 
43 
44         <!-- Drop and re-create the database schema on startup -->
45         <property name="hbm2ddl.auto">create</property>
46 
47         <!-- 
48         <mapping resource="com/qs/hibernate/model/Student.hbm.xml" /> -->
49         <mapping class="com.cyrus.hibernate.model.Teacher" />
50     </session-factory>
51 
52 </hibernate-configuration>

 

 

三、加入log4j配置文件log4j.properties,将该配置文件拷贝到src下,便于程序调试。

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
#log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

四、创建实体类Teacher

 1 package com.cyrus.hibernate.model;
 2 
 3 
 4 import javax.persistence.Column;
 5 import javax.persistence.Entity;
 6 import javax.persistence.GeneratedValue;
 7 import javax.persistence.GenerationType;
 8 import javax.persistence.Id;
 9 import javax.persistence.Table;
10 
11 //Entity是javax.persistence.Entity包中的
12 @Entity
13 // 映射的表名
14 @Table(name = "T_CYRUS_TEACHER")
15 public class Teacher {
16 
17     private int id;
18     private int age;
19     private String name;
20     private String title;
21 
22     // 主键,一般写在get方法中,而不是在定义中
23     @Id
24     @Column(name="ID",nullable=false)
25     public int getId() {
26         return id;
27     }
28 
29     public void setId(int id) {
30         this.id = id;
31     }
32 
33     @Column(name="AGE")
34     public int getAge() {
35         return age;
36     }
37 
38     public void setAge(int age) {
39         this.age = age;
40     }
41 
42     @Column(name="NAME")
43     public String getName() {
44         return name;
45     }
46 
47     public void setName(String name) {
48         this.name = name;
49     }
50 
51     @Column(name="TITLE")
52     public String getTitle() {
53         return title;
54     }
55 
56     public void setTitle(String title) {
57         this.title = title;
58     }
59 }

 

五、用JUnit编写测试类

 1 package com.cyrus.hibernate.model;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.cfg.AnnotationConfiguration;
 8 import org.hibernate.cfg.Configuration;
 9 import org.hibernate.tool.hbm2ddl.SchemaExport;
10 import org.junit.Test;
11 
12 public class TeacherTest {
13 
14     @Test
15     public void test() {
16         Teacher t = new Teacher();
17         t.setAge(30);
18         t.setName("Cyrus Joyce");
19         t.setTitle("一个灵魂自由的人");
20 
21         //注解读取hibernate.cfg.xml
22         AnnotationConfiguration cfg = new AnnotationConfiguration().configure();
23 
24         // Configuration cfg = new Configuration();
25         // 读取hibernate.cfg.xml中的配置
26         cfg.configure();
27         // 获取SessionFactory
28         SessionFactory sf = cfg.buildSessionFactory();
29         // 获取Session
30         Session session = sf.openSession();
31         // 开启事务
32         session.beginTransaction();
33         // 保存
34         session.save(t);
35         // 提交事务
36         session.getTransaction().commit();
37         // 关闭连接
38         session.close();
39         sf.close();
40     }
41 
42 }

 

测试通过,数据库会插入一条测试信息。