Hibernate最主要的功能是将各种JDBC的操作以一种面向对象的方式封装起来,让开发者完全用面向对象的方式来操作数据库中的各种对象。在Hibernate中,一张数据表对应一个实体类,类中的属性对应表中的字段。把对表的各种操作抽象成一个会话(Session)类,将Session的一个实例与实体类的实例绑定。实体类实例中包含有数据表的一条数据,然后通过Session实例的save, delete, update, query 等操作就可以完成对数据库的操作了。

    下面写一个简单的例子,实现对数据库的查询。数据库使用Oracle中自带的表,scott用户下的EMP表和DEPT表。

 1、生成Session的类

  1. package com.meng.hibernate; 
  2.  
  3. import org.hibernate.HibernateException; 
  4. import org.hibernate.Session; 
  5. import org.hibernate.SessionFactory; 
  6. import org.hibernate.cfg.Configuration; 
  7.  
  8. public class HibernateSessionFactory { 
  9.  
  10.     private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"
  11.     private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 
  12.     private static Configuration configuration = new Configuration(); 
  13.     private static SessionFactory sessionFactory; 
  14.     private static String configFile = CONFIG_FILE_LOCATION; 
  15.  
  16.     static { 
  17.         try { 
  18.             configuration.configure(configFile); 
  19.             sessionFactory = configuration.buildSessionFactory(); 
  20.         } catch (Exception e) { 
  21.             System.err.println("%%%% Error Creating SessionFactory %%%%"); 
  22.             e.printStackTrace(); 
  23.         } 
  24.     } 
  25.  
  26.     private HibernateSessionFactory() { 
  27.     } 
  28.  
  29.     public static Session getSession() throws HibernateException { 
  30.         Session session = (Session) threadLocal.get(); 
  31.         if (session == null || !session.isOpen()) { 
  32.             if (sessionFactory == null) { 
  33.                 rebuildSessionFactory(); 
  34.             } 
  35.             session = (sessionFactory != null) ? sessionFactory.openSession() : null
  36.             threadLocal.set(session); 
  37.         } 
  38.         return session; 
  39.     } 
  40.  
  41.     public static void rebuildSessionFactory() { 
  42.         try { 
  43.             configuration.configure(configFile); 
  44.             sessionFactory = configuration.buildSessionFactory(); 
  45.         } catch (Exception e) { 
  46.             System.err.println("%%%% Error Creating SessionFactory %%%%"); 
  47.             e.printStackTrace(); 
  48.         } 
  49.     } 
  50.  
  51.     public static void closeSession() throws HibernateException { 
  52.         Session session = (Session) threadLocal.get(); 
  53.         threadLocal.set(null); 
  54.  
  55.         if (session != null) { 
  56.             session.close(); 
  57.         } 
  58.     } 
  59.  
  60.     public static SessionFactory getSessionFactory() { 
  61.         return sessionFactory; 
  62.     } 
  63.  
  64.     public static void setConfigFile(String configFile) { 
  65.         HibernateSessionFactory.configFile = configFile; 
  66.         sessionFactory = null
  67.     } 
  68.  
  69.     public static Configuration getConfiguration() { 
  70.         return configuration; 
  71.     } 
  72.  

 2、Employee实体类

  1. package com.meng.po; 
  2.  
  3. import java.util.Date; 
  4. import javax.persistence.CascadeType; 
  5. import javax.persistence.Column; 
  6. import javax.persistence.Entity; 
  7. import javax.persistence.FetchType; 
  8. import javax.persistence.Id; 
  9. import javax.persistence.JoinColumn; 
  10. import javax.persistence.ManyToOne; 
  11. import javax.persistence.Table; 
  12.  
  13. @Entity 
  14. @Table(name="EMP"
  15. public class Employee { 
  16.     @Id 
  17.     private int empno; 
  18.     private String ename; 
  19.     private String job; 
  20.     private int mgr; 
  21.     private Date hiredate; 
  22.     private int sal; 
  23.     private int comm; 
  24.     @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
  25.     @JoinColumn(name="DEPTNO"
  26.     private Department dept; 
  27.      
  28.     public int getEmpno() { 
  29.         return empno; 
  30.     } 
  31.     public void setEmpno(int empno) { 
  32.         this.empno = empno; 
  33.     } 
  34.     public String getEname() { 
  35.         return ename; 
  36.     } 
  37.     public void setEname(String ename) { 
  38.         this.ename = ename; 
  39.     } 
  40.     public String getJob() { 
  41.         return job; 
  42.     } 
  43.     public void setJob(String job) { 
  44.         this.job = job; 
  45.     } 
  46.     public int getMgr() { 
  47.         return mgr; 
  48.     } 
  49.     public void setMgr(int mgr) { 
  50.         this.mgr = mgr; 
  51.     } 
  52.     public Date getHiredate() { 
  53.         return hiredate; 
  54.     } 
  55.     public void setHiredate(Date hiredate) { 
  56.         this.hiredate = hiredate; 
  57.     } 
  58.     public int getSal() { 
  59.         return sal; 
  60.     } 
  61.     public void setSal(int sal) { 
  62.         this.sal = sal; 
  63.     } 
  64.     public int getComm() { 
  65.         return comm; 
  66.     } 
  67.     public void setComm(int comm) { 
  68.         this.comm = comm; 
  69.     } 
  70.     public Department getDept() { 
  71.         return dept; 
  72.     } 
  73.     public void setDept(Department dept) { 
  74.         this.dept = dept; 
  75.     } 
  76.     @Override 
  77.     public String toString() { 
  78.         return "Employee [empno:" + empno + ", ename:" + ename + ", job:" + job + ", mgr:" + mgr + ", hiredate:" 
  79.                 + hiredate + ", sal:" + sal + ", comm:" + comm + ", \ndept:" + dept + "]"
  80.     } 

3、Department实体类

  1. package com.meng.po; 
  2.  
  3. import javax.persistence.Column; 
  4. import javax.persistence.Entity; 
  5. import javax.persistence.Id; 
  6. import javax.persistence.Table; 
  7.  
  8. @Entity 
  9. @Table(name="DEPT"
  10. public class Department { 
  11.     @Id 
  12.     @Column(name="DEPTNO"
  13.     private int deptNo; 
  14.     @Column(name="DNAME"
  15.     private String dName; 
  16.     @Column(name="LOC"
  17.     private String location; 
  18.  
  19.     public int getDeptNo() { 
  20.         return deptNo; 
  21.     } 
  22.     public void setDeptNo(int deptNo) { 
  23.         this.deptNo = deptNo; 
  24.     } 
  25.     public String getdName() { 
  26.         return dName; 
  27.     } 
  28.     public void setdName(String dName) { 
  29.         this.dName = dName; 
  30.     } 
  31.     public String getLocation() { 
  32.         return location; 
  33.     } 
  34.     public void setLocation(String location) { 
  35.         this.location = location; 
  36.     } 
  37.     @Override 
  38.     public String toString() { 
  39.         return "Department [deptNo:" + deptNo + ", dName:" + dName + ", location:" + location + "]"
  40.     } 

4、测试类

  1. package com.meng.test; 
  2.  
  3. import java.util.Iterator; 
  4. import java.util.List; 
  5. import org.hibernate.Query; 
  6. import org.hibernate.Session; 
  7. import com.meng.hibernate.HibernateSessionFactory; 
  8. import com.meng.po.Employee; 
  9.  
  10. public class EmployeeQueryTest { 
  11.     public static void main(String[] args){ 
  12.         Session session = HibernateSessionFactory.getSession(); 
  13.         Query query = session.createQuery("from Employee"); 
  14.         List<Employee> employees = query.list(); 
  15.         System.out.println("雇员信息:"); 
  16.         for(Employee employee : employees){ 
  17.             System.out.println(employee); 
  18.         } 
  19.         HibernateSessionFactory.closeSession(); 
  20.     } 

5、Hibernate配置文件

  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="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
  8.         <property name="hibernate.connection.password">tiger</property> 
  9.         <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:EF35</property> 
  10.         <property name="hibernate.connection.username">scott</property> 
  11.         <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> 
  12.         <property name="show_sql">true</property> 
  13.          
  14.         <mapping class="com.meng.po.Employee"/> 
  15.         <mapping class="com.meng.po.Department"/> 
  16.     </session-factory> 
  17. </hibernate-configuration> 

将上面第9行的 EF35 改成你自己的数据库实例名。

6、项目中要使用到的Jar包

Hibernate入门——员工信息查询_Hibernate

7、运行上面的 Test 文件,结果如下:

  1. Hibernate: select employee0_.empno as empno0_, employee0_.comm as comm0_, employee0_.DEPTNO as DEPTNO0_, employee0_.ename as ename0_, employee0_.hiredate as hiredate0_, employee0_.job as job0_, employee0_.mgr as mgr0_, employee0_.sal as sal0_ from EMP employee0_ 
  2. 雇员信息: 
  3. Hibernate: select department0_.DEPTNO as DEPTNO1_0_, department0_.DNAME as DNAME1_0_, department0_.LOC as LOC1_0_ from DEPT department0_ where department0_.DEPTNO=? 
  4. Employee [empno:7369, ename:SMITH, job:CLERK, mgr:7902, hiredate:1980-12-17 00:00:00.0, sal:800, comm:0,  
  5. dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]] 
  6. Hibernate: select department0_.DEPTNO as DEPTNO1_0_, department0_.DNAME as DNAME1_0_, department0_.LOC as LOC1_0_ from DEPT department0_ where department0_.DEPTNO=? 
  7. Employee [empno:7499, ename:ALLEN, job:SALESMAN, mgr:7698, hiredate:1981-02-20 00:00:00.0, sal:1600, comm:300,  
  8. dept:Department [deptNo:30, dName:SALES, location:CHICAGO]] 
  9. Employee [empno:7521, ename:WARD, job:SALESMAN, mgr:7698, hiredate:1981-02-22 00:00:00.0, sal:1250, comm:500,  
  10. dept:Department [deptNo:30, dName:SALES, location:CHICAGO]] 
  11. Employee [empno:7566, ename:JONES, job:MANAGER, mgr:7839, hiredate:1981-04-02 00:00:00.0, sal:2975, comm:0,  
  12. dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]] 
  13. Employee [empno:7654, ename:MARTIN, job:SALESMAN, mgr:7698, hiredate:1981-09-28 00:00:00.0, sal:1250, comm:1400,  
  14. dept:Department [deptNo:30, dName:SALES, location:CHICAGO]] 
  15. Employee [empno:7698, ename:BLAKE, job:MANAGER, mgr:7839, hiredate:1981-05-01 00:00:00.0, sal:2850, comm:0,  
  16. dept:Department [deptNo:30, dName:SALES, location:CHICAGO]] 
  17. Hibernate: select department0_.DEPTNO as DEPTNO1_0_, department0_.DNAME as DNAME1_0_, department0_.LOC as LOC1_0_ from DEPT department0_ where department0_.DEPTNO=? 
  18. Employee [empno:7782, ename:CLARK, job:MANAGER, mgr:7839, hiredate:1981-06-09 00:00:00.0, sal:2450, comm:0,  
  19. dept:Department [deptNo:10, dName:ACCOUNTING, location:NEW YORK]] 
  20. Employee [empno:7788, ename:SCOTT, job:ANALYST, mgr:7566, hiredate:1987-04-19 00:00:00.0, sal:3000, comm:0,  
  21. dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]] 
  22. Employee [empno:7839, ename:KING, job:PRESIDENT, mgr:0, hiredate:1981-11-17 00:00:00.0, sal:5000, comm:0,  
  23. dept:Department [deptNo:10, dName:ACCOUNTING, location:NEW YORK]] 
  24. Employee [empno:7844, ename:TURNER, job:SALESMAN, mgr:7698, hiredate:1981-09-08 00:00:00.0, sal:1500, comm:0,  
  25. dept:Department [deptNo:30, dName:SALES, location:CHICAGO]] 
  26. Employee [empno:7876, ename:ADAMS, job:CLERK, mgr:7788, hiredate:1987-05-23 00:00:00.0, sal:1100, comm:0,  
  27. dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]] 
  28. Employee [empno:7900, ename:JAMES, job:CLERK, mgr:7698, hiredate:1981-12-03 00:00:00.0, sal:950, comm:0,  
  29. dept:Department [deptNo:30, dName:SALES, location:CHICAGO]] 
  30. Employee [empno:7902, ename:FORD, job:ANALYST, mgr:7566, hiredate:1981-12-03 00:00:00.0, sal:3000, comm:0,  
  31. dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]] 
  32. Employee [empno:7934, ename:MILLER, job:CLERK, mgr:7782, hiredate:1982-01-23 00:00:00.0, sal:1300, comm:0,  
  33. dept:Department [deptNo:10, dName:ACCOUNTING, location:NEW YORK]] 

下面的源码因为大小限制,将其依赖的Jar包删除了,请亲们自行在项目中添加。