zoukankan      html  css  js  c++  java
  • hibernate和spring整合总结

    一、DataSource基础
    1、JdbcTemplate包装了增删改查方法
    Dao类继承JdbcDaoSupport,可以通过getJdbcTemplate()方法获得JdbcTemplate,配置的时候需要引入DataSource
    Dao类继承JdbcTemplate,则可以直接使用增删改查,配置的时候需要引入DataSource


    2、applicationContext.xml的配置:
    <!-- 
    引入properties文件(固定写法)
    -->
    <bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <value>classpath:jdbc.properties</value>
    </property>
    </bean>

    <bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    </bean>
    3.1、如果Dao类继承JdbcDaoSupport,则加重Dao的时候
    <bean id="classesDao" class="cn.itheima02.jdbc.dao.ClassesDao">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    </bean>
    3.2、Dao类继承JdbcTemplate
    <bean id="classesDao3" class="cn.itheima02.jdbc.dao.ClassesDao3">
    <property name="jdbcTemplate">
    <ref bean="jdbcTemplate"/>
    </property>
    </bean>
    3.3、进行查询语句的格式:问题new ClassesRawMapper()不通用
    1、获得对象queryForObject("select * from classes where cid=?", new Object[]{1L}, new ClassesRawMapper());
    2、获得基本类型queryForObject("select cname from classes where cid=?", new Object[]{1L}, new ColumnRawMapper());
    2、获得集合query("select * from classes", new ClassesRawMapper())

    二、事务管理器 transaction-manager 
    1、导包:
    xmlns:tx="http://www.springframework.org/schema/tx"
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    2、详细:引入DataSource(粘贴)、事务管理器(粘贴)、通知(粘贴)
        dao和service需配、aop的配置(表达式需配,其他固定)

    <!-- 
    引入DataSource(粘贴)
    -->
    <bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <value>classpath:jdbc.properties</value>
    </property>
    </bean>
    <bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    </bean>
    <!-- dao和service需配 -->
    <bean id="classesDao" class="cn.itheima02.jdbc.transaction.ClassesDaoImpl">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    </bean>

    <bean id="classesService" class="cn.itheima02.jdbc.transaction.ClassesServiceImpl">
    <property name="classesDao">
    <ref bean="classesDao"/>
    </property>
    </bean>

    <!-- 
    事务管理器(粘贴)
    -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    </bean>
    <!-- 
    通知(粘贴)
     transaction-manager 事务管理器  告诉spring容器用什么技术来启动事务的
    -->
    <tx:advice transaction-manager="transactionManager" id="tx">
    <tx:attributes>
    <!-- 
    name
    方法的名称  save*  以save开头的方法 
    propagation
    在一个方法中,调用了好几个方法,而这几个方法中还存在事务,怎么样保证所有的方法在一个事务下运行
    read-only
    true 只读事务
    false 读写事务
    -->
    <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED"
    read-only="false"/>
    </tx:attributes>
    </tx:advice>
    <!-- 
    aop的配置(表达式需配,其他固定)
     -->
    <aop:config>
    <aop:pointcut expression="execution(* cn.itheima02.jdbc.transaction.ClassesServiceImpl.*(..))" id="perform"/>
    <aop:advisor advice-ref="tx" pointcut-ref="perform"/>
    </aop:config>

    三、spring和hibernate结合后的application配置:
    <!-- 
    1、引入dataSource
    -->
    <bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <value>classpath:jdbc.properties</value>
    </property>
    </bean>




    <bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    </bean>


    <!-- 2、sessionFactory配置(粘贴,如果hibernate.cfg.xml路径有变,需改-->
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>

    <!-- 
    3、程序员写的东西(配置dao和service)
    -->

    <bean id="classesDao" class="cn.itheima02.spring.hibernate.dao.ClassesDaoImpl">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>

    <bean id="classesService" class="cn.itheima02.spring.hibernate.service.ClassesServiceImpl">
    <property name="classesDao">
    <ref bean="classesDao"/>
    </property>
    </bean>


    <!-- 
    4、spring容器做的事情和配置(只需修改表达式)
    -->

    <aop:config>
    <aop:pointcut expression="execution(* cn.itheima02.spring.hibernate.service.*.*(..))" id="perform"/>
    <aop:advisor advice-ref="tx" pointcut-ref="perform"/>
    </aop:config> 

    <!-- 
    5、通知(粘贴)
    -->

    <tx:advice id="tx" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="save*" read-only="false"/>
    </tx:attributes>
    </tx:advice>

    <!-- 
    6、事务管理器(粘贴)
    -->

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>

    四、利用注解实现spring和hibernate结合applicationContext.xml的配置
    公共的:事务管理器、sessionFactory,
    dao和service,切面和通知都在源码中实现

    <!-- 1、类的扫描器 -->
    <context:component-scan base-package="cn.itheima02.spring.hibernate"></context:component-scan>
    <!-- 
    2、事务的注解解析器
    -->

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- 
    3、事务管理器
    -->

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>

    <!-- 
    4、sessionFactory
    -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean> 

    <!-- 
    5、hibernateTemplate
    -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>
     
    有大改动的:
    1、使用注解Dao不能继承了,应该改为
    public class ClassesDaoImpl extends HibernateDaoSupport implements ClassesDao{


    public void saveClasses(Classes classes) {
    // TODO Auto-generated method stub
    this.getHibernateTemplate().save(classes);
    }


    }
    修改后:
    @Service(value="classesService")
    @Transactional(readOnly=true)
    public class ClassesServiceImpl implements ClassesService{

    @Resource(name="classesDao")
    private ClassesDao classesDao;


    @Transactional(readOnly=false)//覆盖类上的事务注解
    public void saveClasses(Classes classes) {
    // TODO Auto-generated method stub
    this.classesDao.saveClasses(classes);
    }
    }

    五、spring与hibernate的xml和注解比较
       xml
          书写形式比较复杂,但是效率高
          在配置文件中:
             关于dataSource:
                 如果在配置文件中,引入hibernate.cfg.xml文件,这个时候,不需要引入dataSource
                 如果在配置文件中,不引入hibernate.cfg.xml文件,这个时候,引入dataSource
             写法:
                1、在配置文件中引入sessionFactory
                2、测试
                3、写程序员做的事情
                    1、写dao
                    2、测试dao
                    3、写service
                    4、测试service
                    5、aop:config的配置
                         1、切入点表达式
                         2、通知
                              1、事务管理器
                              2、声明哪些属性应该采用什么样的方式进行处理
                                     隔离机制(默认)  方法的名称  传播机制(默认)   事务机制
                    6、写客户端进行测试:看生成的service对象是否为代理对象
                    7、完成相应的操作
       注解
          书写比较简单,但是效率低
  • 相关阅读:
    Python基础之 一 字典(dict)
    python基础之-字符串
    Python基础之 一列表
    Python基础之 一 补充
    python基础之-数据类型
    python之模块随笔记-sys
    python之练习-三层菜单
    Python基础之 二
    SQL Server 数据类型
    SQLServer视图
  • 原文地址:https://www.cnblogs.com/kuyuyingzi/p/4266386.html
Copyright © 2011-2022 走看看