Hibernate最主要的功能是将各种JDBC的操作以一种面向对象的方式封装起来,让开发者完全用面向对象的方式来操作数据库中的各种对象。在Hibernate中,一张数据表对应一个实体类,类中的属性对应表中的字段。把对表的各种操作抽象成一个会话(Session)类,将Session的一个实例与实体类的实例绑定。实体类实例中包含有数据表的一条数据,然后通过Session实例的save, delete, update, query 等操作就可以完成对数据库的操作了。
下面写一个简单的例子,实现对数据库的查询。数据库使用Oracle中自带的表,scott用户下的EMP表和DEPT表。
1、生成Session的类
- package com.meng.hibernate;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateSessionFactory {
- private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
- private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
- private static Configuration configuration = new Configuration();
- private static SessionFactory sessionFactory;
- private static String configFile = CONFIG_FILE_LOCATION;
- static {
- try {
- configuration.configure(configFile);
- sessionFactory = configuration.buildSessionFactory();
- } catch (Exception e) {
- System.err.println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- private HibernateSessionFactory() {
- }
- public static Session getSession() throws HibernateException {
- Session session = (Session) threadLocal.get();
- if (session == null || !session.isOpen()) {
- if (sessionFactory == null) {
- rebuildSessionFactory();
- }
- session = (sessionFactory != null) ? sessionFactory.openSession() : null;
- threadLocal.set(session);
- }
- return session;
- }
- public static void rebuildSessionFactory() {
- try {
- configuration.configure(configFile);
- sessionFactory = configuration.buildSessionFactory();
- } catch (Exception e) {
- System.err.println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- public static void closeSession() throws HibernateException {
- Session session = (Session) threadLocal.get();
- threadLocal.set(null);
- if (session != null) {
- session.close();
- }
- }
- public static SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- public static void setConfigFile(String configFile) {
- HibernateSessionFactory.configFile = configFile;
- sessionFactory = null;
- }
- public static Configuration getConfiguration() {
- return configuration;
- }
- }
2、Employee实体类
- package com.meng.po;
- import java.util.Date;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.ManyToOne;
- import javax.persistence.Table;
- @Entity
- @Table(name="EMP")
- public class Employee {
- @Id
- private int empno;
- private String ename;
- private String job;
- private int mgr;
- private Date hiredate;
- private int sal;
- private int comm;
- @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
- @JoinColumn(name="DEPTNO")
- private Department dept;
- public int getEmpno() {
- return empno;
- }
- public void setEmpno(int empno) {
- this.empno = empno;
- }
- public String getEname() {
- return ename;
- }
- public void setEname(String ename) {
- this.ename = ename;
- }
- public String getJob() {
- return job;
- }
- public void setJob(String job) {
- this.job = job;
- }
- public int getMgr() {
- return mgr;
- }
- public void setMgr(int mgr) {
- this.mgr = mgr;
- }
- public Date getHiredate() {
- return hiredate;
- }
- public void setHiredate(Date hiredate) {
- this.hiredate = hiredate;
- }
- public int getSal() {
- return sal;
- }
- public void setSal(int sal) {
- this.sal = sal;
- }
- public int getComm() {
- return comm;
- }
- public void setComm(int comm) {
- this.comm = comm;
- }
- public Department getDept() {
- return dept;
- }
- public void setDept(Department dept) {
- this.dept = dept;
- }
- @Override
- public String toString() {
- return "Employee [empno:" + empno + ", ename:" + ename + ", job:" + job + ", mgr:" + mgr + ", hiredate:"
- + hiredate + ", sal:" + sal + ", comm:" + comm + ", \ndept:" + dept + "]";
- }
- }
3、Department实体类
- package com.meng.po;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.Table;
- @Entity
- @Table(name="DEPT")
- public class Department {
- @Id
- @Column(name="DEPTNO")
- private int deptNo;
- @Column(name="DNAME")
- private String dName;
- @Column(name="LOC")
- private String location;
- public int getDeptNo() {
- return deptNo;
- }
- public void setDeptNo(int deptNo) {
- this.deptNo = deptNo;
- }
- public String getdName() {
- return dName;
- }
- public void setdName(String dName) {
- this.dName = dName;
- }
- public String getLocation() {
- return location;
- }
- public void setLocation(String location) {
- this.location = location;
- }
- @Override
- public String toString() {
- return "Department [deptNo:" + deptNo + ", dName:" + dName + ", location:" + location + "]";
- }
- }
4、测试类
- package com.meng.test;
- import java.util.Iterator;
- import java.util.List;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import com.meng.hibernate.HibernateSessionFactory;
- import com.meng.po.Employee;
- public class EmployeeQueryTest {
- public static void main(String[] args){
- Session session = HibernateSessionFactory.getSession();
- Query query = session.createQuery("from Employee");
- List<Employee> employees = query.list();
- System.out.println("雇员信息:");
- for(Employee employee : employees){
- System.out.println(employee);
- }
- HibernateSessionFactory.closeSession();
- }
- }
5、Hibernate配置文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
- <property name="hibernate.connection.password">tiger</property>
- <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:EF35</property>
- <property name="hibernate.connection.username">scott</property>
- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
- <property name="show_sql">true</property>
- <mapping class="com.meng.po.Employee"/>
- <mapping class="com.meng.po.Department"/>
- </session-factory>
- </hibernate-configuration>
将上面第9行的 EF35 改成你自己的数据库实例名。
6、项目中要使用到的Jar包
7、运行上面的 Test 文件,结果如下:
- 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_
- 雇员信息:
- Hibernate: select department0_.DEPTNO as DEPTNO1_0_, department0_.DNAME as DNAME1_0_, department0_.LOC as LOC1_0_ from DEPT department0_ where department0_.DEPTNO=?
- Employee [empno:7369, ename:SMITH, job:CLERK, mgr:7902, hiredate:1980-12-17 00:00:00.0, sal:800, comm:0,
- dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]]
- Hibernate: select department0_.DEPTNO as DEPTNO1_0_, department0_.DNAME as DNAME1_0_, department0_.LOC as LOC1_0_ from DEPT department0_ where department0_.DEPTNO=?
- Employee [empno:7499, ename:ALLEN, job:SALESMAN, mgr:7698, hiredate:1981-02-20 00:00:00.0, sal:1600, comm:300,
- dept:Department [deptNo:30, dName:SALES, location:CHICAGO]]
- Employee [empno:7521, ename:WARD, job:SALESMAN, mgr:7698, hiredate:1981-02-22 00:00:00.0, sal:1250, comm:500,
- dept:Department [deptNo:30, dName:SALES, location:CHICAGO]]
- Employee [empno:7566, ename:JONES, job:MANAGER, mgr:7839, hiredate:1981-04-02 00:00:00.0, sal:2975, comm:0,
- dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]]
- Employee [empno:7654, ename:MARTIN, job:SALESMAN, mgr:7698, hiredate:1981-09-28 00:00:00.0, sal:1250, comm:1400,
- dept:Department [deptNo:30, dName:SALES, location:CHICAGO]]
- Employee [empno:7698, ename:BLAKE, job:MANAGER, mgr:7839, hiredate:1981-05-01 00:00:00.0, sal:2850, comm:0,
- dept:Department [deptNo:30, dName:SALES, location:CHICAGO]]
- Hibernate: select department0_.DEPTNO as DEPTNO1_0_, department0_.DNAME as DNAME1_0_, department0_.LOC as LOC1_0_ from DEPT department0_ where department0_.DEPTNO=?
- Employee [empno:7782, ename:CLARK, job:MANAGER, mgr:7839, hiredate:1981-06-09 00:00:00.0, sal:2450, comm:0,
- dept:Department [deptNo:10, dName:ACCOUNTING, location:NEW YORK]]
- Employee [empno:7788, ename:SCOTT, job:ANALYST, mgr:7566, hiredate:1987-04-19 00:00:00.0, sal:3000, comm:0,
- dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]]
- Employee [empno:7839, ename:KING, job:PRESIDENT, mgr:0, hiredate:1981-11-17 00:00:00.0, sal:5000, comm:0,
- dept:Department [deptNo:10, dName:ACCOUNTING, location:NEW YORK]]
- Employee [empno:7844, ename:TURNER, job:SALESMAN, mgr:7698, hiredate:1981-09-08 00:00:00.0, sal:1500, comm:0,
- dept:Department [deptNo:30, dName:SALES, location:CHICAGO]]
- Employee [empno:7876, ename:ADAMS, job:CLERK, mgr:7788, hiredate:1987-05-23 00:00:00.0, sal:1100, comm:0,
- dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]]
- Employee [empno:7900, ename:JAMES, job:CLERK, mgr:7698, hiredate:1981-12-03 00:00:00.0, sal:950, comm:0,
- dept:Department [deptNo:30, dName:SALES, location:CHICAGO]]
- Employee [empno:7902, ename:FORD, job:ANALYST, mgr:7566, hiredate:1981-12-03 00:00:00.0, sal:3000, comm:0,
- dept:Department [deptNo:20, dName:RESEARCH, location:DALLAS]]
- Employee [empno:7934, ename:MILLER, job:CLERK, mgr:7782, hiredate:1982-01-23 00:00:00.0, sal:1300, comm:0,
- dept:Department [deptNo:10, dName:ACCOUNTING, location:NEW YORK]]
下面的源码因为大小限制,将其依赖的Jar包删除了,请亲们自行在项目中添加。