码迷,mamicode.com
首页 > 编程语言 > 详细

Spring学习(五)spring整合hibernate

时间:2015-08-27 00:34:25      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:spring   hibernate   

上一篇博客中讲到spring dao层对jdbc的封装,用到了模板模式的设计思想 。这篇我们来看看spring中的orm层对hibernate的封装,也就是所谓的spring整合 hibernate。这里同样用了模板模式, 将hibernate开发流程封装在ORM层提供的模板类HibernateTemplate中,通过在DAO中对模板类的使用,实现对传统hibernate开发流程的代替。

一、先来看看Hibernate的传统开发流程:

    1) 配置SessionFactory对象
        hibernate.cfg.xml <session-factory>
        a 数据源  driver_class url username password
        b 映射文件 mapping
        c 可选参数 show_sql format_sql dialect ...
    2) 创建SessionFactory实例
        工厂类 - 解析xml - SessionFactory
    3) 获取会话 Session
        sessionFactory.getSession()
如果是 insert delete update
        4) 开启事务 Transaction
            session.beginTransaction()
        5) 执行操作 save() delete() update()
        6) 提交/回滚事务
            commit() / rollback()
如果是 select
        4) 定义执行hql语句
        5) 编译hql Query
            session.createQuery()
        6) 执行hql 
            list()  unqueObject()
    7) 关闭会话 
        session.close()

spring中hibernate的使用和传统hibernate使用基本类似,同样要在配置文件中配置SessionFactory、数据源等,只不过,spring 要在容器中配置HibernateTemplate,通过将这个bean对象注入到dao层,来完成数据库的操作。

二、整合过程:

    1) 添加spring框架支持(core层)

    2) 添加spring整合hibernate需要的jar(hibernate目录)

    3) 添加hibernate支持(导入3.5/3.6版本jar包)spring4.0中,如果以注解的方式整合hibernate,仅支持hibernate3.6及以上版本

    4) 反向生成表对应的javaBean和映射文件
    5)编写applicationContext.xml文件添加支持

三、具体实现:

applicationContext.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
         <!-- 
            StuDaoImpl hibernateTemplate配置成ioc容器
          -->
    <bean id="dao" class="com.etoak.dao.CityDaoImpl">
        <property name="ht" ref="ht"></property>
    </bean>

    <!-- 
        此时的HibernateTemplate暂时不具备数据库的连接能力
        需要为其提供一个SessionFactory对象
            1 数据源~描述当前需要连接的数据库
            2 映射文件~描述当前需要对哪个表进行操作
            setSessionFactory()
     -->
    <bean id="ht" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sf"></property>
    </bean>
    <!-- 
        配置SessionFactory[接口]对象
            1 实现类
                spring框架内部并没有提供SessionFactory实现类
            2工厂bean
                spring为SessionFactory提供了一个工厂类进行实例化
                    LocalSessionFactoryBean impliments FactoryBean
        如何使用这个工厂配置SessionFactory对象?
            和hibernate配置的方式类似
            1 数据源
                setDataSource(DataSource ds)
            2映射文件
                setMappingResources(String[] mapping)
            3 可选参数
                setHibernateProperties(Properties props)
            list元素:表示调用当前setter方法需要注入的参数类型
                    每在工程中添加一个映射文件,就需要在list元素下添加
                        一个value子元素指向该映射文件
     -->
    <bean id="sf" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="ds"></property>
        <property name="mappingResources" >
            <list>  
                <value>com/etoak/po/City.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
    </bean>
    <!-- 
        配置DataSource数据源

     -->
      <bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/yitu"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
      </bean>

</beans>

CityDaoImpl.java(dao)

package com.etoak.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.etoak.po.City;

/**
 * 使用hibernate方式对city进行crud操作
 * spring提供的整合方案  HibernateTemplate
 * @author D_xiao
 *
 */
public class CityDaoImpl {
    private HibernateTemplate ht;

    public void setHt(HibernateTemplate ht) {
        this.ht = ht;
    }

    public boolean addCity(City city){
        Serializable se = ht.save(city);
        //se 添加成功后该数据的主键值
        Integer id = (Integer)se;
        return id>0;
    }

    /**
     * 根据主键查询单条数据
     * get  立即加载
     *          一级缓存 - 二级缓存 - 数据库  - null
     * load 延迟加载[数据库连接延迟]
     *      查询阶段        
     *          一级缓存 ->终止查询,返回代理对象
     *      使用阶段
     *          二级缓存 ->数据库 -> Exception
     *      代理模式 
     *      判断能否使用load方法,
     * 这里不能用load 只能用get
     */         
    public City selectCityById(Integer id){
        return ht.get(City.class, id);
    }
    //这里无法控制成功失败,只有在添加事务后才能控制
    public boolean delCityById(Integer id){
        ht.delete(ht.load(City.class, id));//这里可以用load,因为在查询(对象)和使用(删除)中有会话
        return true;
    }

    public boolean updateCity(City city){
        ht.update(city);
        return true;
    }
    //查询批量数据 List<City>
    public List selectAllCity(){
        String hql = "from City";
        List list = ht.find(hql);
        return list;
    }

    //非主键查询单条数据  
    public City selectCityByName(String name){
        String hql = "from City where name=?";
        Object[] args = {name};
        List list = ht.find(hql,args);
        if(list.size()!=0)
            return (City)list.get(0);
        else 
            return null;

    }

    //查询数据量
    //hibernate3.2之后查询数据量返回类型都为long类型
    public long selectCityCount(){
        String hql = "select count(*) from City";
        List list = ht.find(hql);
        return (long)list.get(0);
    }

    /**
     * 分页查询
     * hibernate中分页查询:
     *      serFirstResult()  serMaxResult()
     * HibernateTemplate 中提供的方法(save update delete get load find)默认封装了hibernate整套流程
     * 但该模板类中爷提供了一部分方法仅封装了hibernate部分功能
     *      execute(HibernateCallback[接口] c1)
     *          T  当前需要查询的数据类型
     * 匿名内部类访问外部属性  需将属性设置为final
     */
    public List<City> selectCityByPage(final int start,final int end){
        return ht.execute(new HibernateCallback<List<City>>(){
            //该方法仅封装了会话session的创建
            @Override
            public List<City> doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery("from City");
                query.setFirstResult(start);
                query.setMaxResults(end);
                return query.list();
            }

        });
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring学习(五)spring整合hibernate

标签:spring   hibernate   

原文地址:http://blog.csdn.net/frightingforambition/article/details/48013691

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!