spring hibernate类似于mybatis,都是一个用来操作数据库的框架,hibernate的优点是不用写任何sql语句,因为用到了HibernateTemplate类,当然了,mybatis有通用mapper,因此大部分增删改查的sql也不需要写,下面来学习下spring hibernate框架的整合。
hibernate框架中有一个默认的hibernate.cfg.xml文件,用来配置mysql或oracle数据库连接信息,但是我们也可以不需要创建hibernate.cfg.xml文件,可以直接在applicationContext.xml文件中提供所有的连接信息,本案例也是。
spring框架与hibernate的优点
Spring框架提供了HibernateTemplate类,所以你不需要再创建配置,BuildSessionFactory,Session,开始与提交事务等那么多的步骤,以前我们操作数据库是这样的,如下是增加一条数据:
//创建configuration对象
Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml");
//创建seessionFactory
SessionFactory factory=cfg.buildSessionFactory();
//创建session对象
Session session=factory.openSession();
//开始创建transaction事务
Transaction tr=session.beginTransaction();
Employee e1=new Employee(111,"arun",40000);
//持久化保存一条数据
session.persist(e1);
//提交事务之后才生效
tr.commit();
//关闭事务
session.close();有了spring与hibernate框架整合之后,事务之类的就不用自己一个个的来管理了,可以在配置文件中做这个事情,上面的代码可以简化成如下:
Employee e1=new Employee(111,"arun",40000); hibernateTemplate.save(e1);
HibernateTemplate类中已经封装了这些增删改查的方法,如下表格。
| No. | 方法 | 描述 |
|---|---|---|
| 1) | void persist(Object entity) | 持久化给定的对象 |
| 2) | Serializable save(Object entity) | 持久化给定的对象,并返回id |
| 3) | void saveOrUpdate(Object entity) | 持久化或更新给定对象,如果entity对象中包含了id,则默认为更新,否则就是保存对象 |
| 4) | void update(Object entity) | 更新给定的对象 |
| 5) | void delete(Object entity) | 删除给定的对象,因为对象中有id |
| 6) | Object get(Class entityClass, Serializable id) | 根据给定的id返回持久化对象 |
| 7) | Object load(Class entityClass, Serializable id) | 根据给定的id返回持久化对象 |
| 8) | List loadAll(Class entityClass) | 返回所有的持久化对象,也就是集合 |
下面是实现spring hibernate的整合示例,为了便于理解,请看截图,如下:

步骤一:创建一个employee员工数据表,sql语句如下:
CREATE TABLE "EMP558"
( "ID" NUMBER(10,0) NOT NULL ENABLE,
"NAME" VARCHAR2(255 CHAR),
"SALARY" FLOAT(126),
PRIMARY KEY ("ID") ENABLE
)
/步骤二:新建Employee员工类,代码如下:
package com.tpyyes;
public class Employee {
private int id;
private String name;
private float salary;
//getters and setters 省略
}步骤三:创建employee.hbm.xml映射文件,这个文件中包含了持久化类的所有字段信息,如下:
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.tpyyes.Employee" table="emp558"> <id name="id"> <generator class="assigned"></generator> </id> <property name="name"></property> <property name="salary"></property> </class> </hibernate-mapping>
步骤四:创建EmployeeDao类,该类中使用了HibernateTemplate类的增删改查的方法,用于持久化数据或查询数据,代码如下:
package com.javatpoint;
import org.springframework.orm.hibernate3.HibernateTemplate;
import java.util.*;
public class EmployeeDao {
HibernateTemplate template;
//set注入将在applicationContext.xml文件中有配置
public void setTemplate(HibernateTemplate template) {
this.template = template;
}
//增
public void saveEmployee(Employee e){
template.save(e);
}
//改
public void updateEmployee(Employee e){
template.update(e);
}
//删
public void deleteEmployee(Employee e){
template.delete(e);
}
//根据id查询对象
public Employee getById(int id){
Employee e=(Employee)template.get(Employee.class,id);
return e;
}
//查询所有对象
public List<Employee> getEmployees(){
List<Employee> list=new ArrayList<Employee>();
list=template.loadAll(Employee.class);
return list;
}
}步骤4:创建applicationContext.xml文件,该文件用于初始化sql数据库连接,通过注入datasource来创建sessionFactory工厂,最后set注入HibernateTemplate对象,这样在EmployeeDao就可以使用HibernateTemplate对象里面的所有方法了,注入流程如下图所示:

代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property> <property name="username" value="system"></property> <property name="password" value="oracle"></property> </bean> <bean id="mysessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="mappingResources"> <list> <value>employee.hbm.xml</value> </list> </property> <!--hibernate.hbm2ddl.auto表示根据hbm.xml映射文件自动创建表,如果有表了就不会再创建了--> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <bean id="template" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="mysessionFactory"></property> </bean> <bean id="d" class="com.tpyyes.EmployeeDao"> <property name="template" ref="template"></property> </bean> </beans>
步骤五:新建InsertTest.java文件,在main方法中测试我们spring与hibernate框架是否整合完成,代码如下:
package com.tpyyes;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class InsertTest {
public static void main(String[] args) {
Resource r=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(r);
EmployeeDao dao=(EmployeeDao)factory.getBean("d");
Employee e=new Employee();
e.setId(114);
e.setName("varun");
e.setSalary(50000);
//调用dao里面的方法保存数据
dao.saveEmployee(e);
}
}