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); } }