hibernate 入门学习 Demo

来源:互联网 发布:netbeans怎么编写java 编辑:程序博客网 时间:2024/05/19 13:29

下面以一个简单的例子描述hibernate的使用。

 

软件配置:jdk1.6+hibernate4.1+oracle10g

 

1.hibernate包下载

 

先到hibernate官网下载hibernate的开发包hibernate-search-4.1.1.Final-dist.zip,解压缩此包,dist\lib目录下是开发所需的jar包。

 

2.在eclipse中创建java项目

 

项目创建后,需要引入依赖的jar包:

 

hibernate包:required下全部jar包,provided下的hibernate-jpa-2.0-api-1.0.1.Final.jar和jta-1.1.jar包

oracle包:ojdbc6.jar

日志包(可选,如果不添加则看不到hibernate的日志输出):slf4j-api-1.6.3.jar、logback-core-1.0.0.jar、logback-classic-1.0.0.jar 

 

创建包:test,test.hibernate,test.model

 

3.创建数据库表

 

本示例使用oracle,其他数据库的特性和sql可参考一下代码稍作改变即可:

 

创建House表:

 

Sql代码  收藏代码
  1. CREATE TABLE House  
  2. (  
  3.     id       NUMBER(8) NOT NULL,  
  4.     name     VARCHAR2(50),  
  5.     address  VARCHAR2(50) NOT NULL  
  6. )  
  7. ;  
  8.   
  9.   
  10. ALTER TABLE House ADD CONSTRAINT PK_House   
  11.     PRIMARY KEY (id)   
  12.  USING INDEX   
  13. ;  
  14.   
  15. CREATE SEQUENCE SEQ_House_id   
  16.     INCREMENT BY 1   
  17.     START WITH 1   
  18.     NOMAXVALUE   
  19.     MINVALUE 1   
  20.     NOCYCLE   
  21.     NOCACHE   
  22.     NOORDER  
  23. ;  

 

 创建Person表:

 

Sql代码  收藏代码
  1. CREATE TABLE Person  
  2. (  
  3.     id    NUMBER(8) NOT NULL,  
  4.     name  VARCHAR2(50),  
  5.     age   NUMBER(3)  
  6. )  
  7. ;  
  8.   
  9.   
  10. ALTER TABLE Person ADD CONSTRAINT PK_Person   
  11.     PRIMARY KEY (id)   
  12.  USING INDEX   
  13. ;  

 

4.编写hibernate配置文件

 

在src目录下创建hibernate.cfg.xml文件:

 

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.     <session-factory>  
  7.         <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>  
  8.         <property name="connection.username">hi</property>  
  9.         <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>  
  10.         <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>  
  11.         <property name="connection.password">hi</property>  
  12.         <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>  
  13.           
  14.         <property name="current_session_context_class">thread</property>  
  15.         <!-- this will show us all sql statements -->  
  16.         <property name="hibernate.show_sql">true</property>  
  17.           
  18.         <!-- mapping files -->  
  19.         <span style="color: #ff6600;"><mapping resource="test/model/House.hbm.xml"/></span>  
  20.         <span style="color: #ff6600;"><mapping class="test.model.Person"/></span>  
  21.     </session-factory>  
  22. </hibernate-configuration>  

 

注意看上面的mapping节点:第一个使用的是mapping映射文件,第二个使用java注解映射方式。这两个文件将在后面创建。

 

5.编写SessionFactoryUtil类

 

在test.hibernate包下建立SessionFactoryUtil类,此类用于获取session:

 

Java代码  收藏代码
  1. package test.hibernate;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.cfg.AnnotationConfiguration;  
  6.   
  7. public class SessionFactoryUtil {  
  8.       
  9.     private static org.hibernate.SessionFactory sessionFactory;  
  10.     private SessionFactoryUtil() {  
  11.     }  
  12.       
  13.     static {  
  14.         // 使用xml文件或者注解方式加载hibernate配置  
  15.         sessionFactory = new AnnotationConfiguration().configure()  
  16.                 .buildSessionFactory();  
  17.         // 只是用xml文件方式加载hibernate配置  
  18.         // sessionFactory = new Configuration().configure().buildSessionFactory();  
  19.     }  
  20.       
  21.     public static SessionFactory getInstance() {  
  22.         return sessionFactory;  
  23.     }  
  24.       
  25.     /** 
  26.      * 打开会话但不绑定到会话上下文中 
  27.      * @return the session 
  28.      */  
  29.     public Session openSession() {  
  30.         return sessionFactory.openSession();  
  31.     }  
  32.   
  33.     /** 
  34.      * 从会话上下文中返回会话,如果上下文中不存在会话示例则先创建一个会话示例并保存到上下文中,然后再返回。 
  35.      * <br> 
  36.      * 会话上下文与hibernate配置中的current_session_context_class属性值有关。 
  37.      * @return the session 
  38.      */  
  39.     public Session getCurrentSession() {  
  40.         return sessionFactory.getCurrentSession();  
  41.     }  
  42.       
  43.     /** 
  44.      * 关闭会话工厂 
  45.      */  
  46.     public static void close() {  
  47.         if (sessionFactory != null)  
  48.             sessionFactory.close();  
  49.         sessionFactory = null;  
  50.     }  
  51. }  

 

6.创建映射文件和类

 

本例示范两种方式的映射,mapping文件和java注解方式。

House采用mapping文件映射方式,Person采用java注解映射方式。

 

在test.model包下新建House类(POJO):

 

Java代码  收藏代码
  1. package test.model;  
  2.   
  3. public class House {  
  4.     private Integer id;  
  5.     private String name;  
  6.     private String address;  
  7.     /** 
  8.      * @return the id 
  9.      */  
  10.     public Integer getId() {  
  11.         return id;  
  12.     }  
  13.     /** 
  14.      * @param id the id to set 
  15.      */  
  16.     public void setId(Integer id) {  
  17.         this.id = id;  
  18.     }  
  19.     /** 
  20.      * @return the name 
  21.      */  
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.     /** 
  26.      * @param name the name to set 
  27.      */  
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.     /** 
  32.      * @return the address 
  33.      */  
  34.     public String getAddress() {  
  35.         return address;  
  36.     }  
  37.     /** 
  38.      * @param address the address to set 
  39.      */  
  40.     public void setAddress(String address) {  
  41.         this.address = address;  
  42.     }  
  43.     /* (non-Javadoc) 
  44.      * @see java.lang.Object#toString() 
  45.      */  
  46.     @Override  
  47.     public String toString() {  
  48.         return "House [id=" + id + ", name=" + name + ", address=" + address  
  49.                 + "]";  
  50.     }  
  51.   
  52. }  

 

同时在此包下新建House.hbm.xml映射文件,通过此文件描述House类和数据库中的House表之间的映射关系:

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD  
  3. 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  4. <hibernate-mapping>  
  5.     <class name="test.model.House" table="house">  
  6.         <id name="id" column="id">  
  7.             <generator class="sequence">  
  8.                 <param name="sequence"><span style="color: #ff6600;">SEQ_HOUSE_ID</span></param>  
  9.             </generator>  
  10.         </id>  
  11.         <property name="name" column="name" />  
  12.         <property name="address" column="address" />  
  13.     </class>  
  14. </hibernate-mapping>  
 

house表在数据库中使用名为SEQ_HOUSE_ID的序列作为主键id的值。如果表的主键生成方式不同,generator节点需要修改,网上有很多相关资料。

 

在test.model包下新建Person类(POJO),并添加注解来表述语数据库中Person表的映射关系,不做特殊说明时,默认数据库中的名车和类中名称一致。

 

Java代码  收藏代码
  1. package test.model;  
  2.   
  3. import javax.persistence.AttributeOverride;  
  4. import javax.persistence.Column;  
  5. import javax.persistence.Entity;  
  6. import javax.persistence.Id;  
  7. import javax.persistence.Table;  
  8.   
  9. @Entity  
  10. @Table(name="PERSON")//表名称和类名称相同时可以不添加此注解来说明  
  11. public class Person {  
  12.     @Id  
  13.     private Integer id;  
  14.     private String name;  
  15.     @AttributeOverride(column = @Column, name = "AGE")//字段名称和属性名称相同可以不添加此注解来说明  
  16.     private int age;  
  17.       
  18.     /** 
  19.      * @return the id 
  20.      */  
  21.     public Integer getId() {  
  22.         return id;  
  23.     }  
  24.     /** 
  25.      * @param id the id to set 
  26.      */  
  27.     public void setId(Integer id) {  
  28.         this.id = id;  
  29.     }  
  30.     /** 
  31.      * @return the name 
  32.      */  
  33.     public String getName() {  
  34.         return name;  
  35.     }  
  36.     /** 
  37.      * @param name the name to set 
  38.      */  
  39.     public void setName(String name) {  
  40.         this.name = name;  
  41.     }  
  42.     /** 
  43.      * @return the age 
  44.      */  
  45.     public int getAge() {  
  46.         return age;  
  47.     }  
  48.     /** 
  49.      * @param age the age to set 
  50.      */  
  51.     public void setAge(int age) {  
  52.         this.age = age;  
  53.     }  
  54. }  

 

7.编写测试方法

 

 

Java代码  收藏代码
  1. package test;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.Transaction;  
  5.   
  6. import test.hibernate.SessionFactoryUtil;  
  7. import test.model.House;  
  8. import test.model.Person;  
  9.   
  10. public class Test {  
  11. //  private static Logger logger = LoggerFactory.getLogger(Test.class);//slf4j logging  
  12.       
  13.     public static void main(String[] args) {  
  14.         Session session = SessionFactoryUtil.getInstance().getCurrentSession();  
  15.         Transaction tx = session.beginTransaction();  
  16.           
  17.         House house = new House();//瞬态  
  18.         house.setName("forest honey");  
  19.         house.setAddress("beijing");  
  20.           
  21.         session.save(house);//持久态  
  22.           
  23.         //对持久态对象进行修改  
  24.         house.setAddress("yj1212");  
  25.           
  26.         Person person = new Person();//瞬态  
  27.         person.setId(1);  
  28.         person.setAge(24);  
  29.         person.setName("张三");  
  30.         session.save(person);//持久态  
  31.           
  32.         session.delete(person);//session关闭后此person便会成为托管态对象  
  33.           
  34.         tx.commit();//提交事务,提交后会自动关闭session  
  35.           
  36. //      session.close();  
  37.     }  
  38. }  
 

执行上面的main方法,控制台输出:

 

控制台输出代码  收藏代码
  1. Hibernate: select SEQ_HOUSE_ID.nextval from dual  
  2. Hibernate: insert into house (name, address, id) values (?, ?, ?)  
  3. Hibernate: insert into PERSON (age, name, id) values (?, ?, ?)  
  4. Hibernate: update house set name=?, address=? where id=?  
  5. Hibernate: delete from PERSON where id=?  
 

测试类中紊乱的“业务逻辑”代码只是为了说明hibernate的使用方式,请忽略!呵呵。

 

hibernate拥有缓存机制,其中session便是一级缓存,还可以配置二级缓存。要想充分利用hibernate的优势,还需要深入了解hibernate的session,事务,缓存,延迟加载,以及各种对象尤其是session的生命周期等。后续再慢慢总结。


0 0
原创粉丝点击