Spring 学习笔记(四)——数据访问与事务

一、Spring 数据访问

1. 数据访问模板化


2. Spring DAO 支持类
    在  <bean> 中为 DAO  支持类配置数据源 dataSource 属性,它会在内部自动创建 template 实例,直接通过 get Template 方法即可获取


3. 配置数据源
3.1 配置JNDI 数据源

<jee:jndi-lookup id = "dataSource" jndi-name = "/jdbc/SpitterDS" resource-ref = "true" />

    如果应用程序运行在 Java 应用程序服务器上,则必须将 resource-ref 的值设为 true,这样指定的 JNDI 中资源的名称 jndi-name 前会自动加上 java:comp/env/ 前缀

3.2 使用数据源连接池

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <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>
<context:property-placeholder location="db.properties"/> <!-- 加载属性文件 -->
 其它属性: 

3.3 基于 jdbc 驱动的数据源配置     Spring 提供两种数据源对象,通过 jdbc 驱动来定义数据源:

这两个的数据源配置与 DBCP 的 BasicDataSource 类,唯一的区别是它们没有提供连接池功能:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <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>
<context:property-placeholder location="jdbc.properties"/> <!-- 加载属性文件 -->

4. 在 Spring 中使用 jdbc
    Spring 为 jdbc 提供三个模板类,其中 SimpleJdbcTemplate 功能最强大的

Spring3 之后已经不支持 Java5 版本

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
	<constructor-arg ref="dataSource" />
</bean>

5. 在 Spring 中使用 hibernate

<!-- 配置 sessionFactory -->    
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="mappingResources">
            <list>
                <value>product.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.HSQLDialect
            </value>
        </property>
    </bean>
<!-- 使用注解方式 -->
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="packagesToScan">
            <list>
                <value>com...</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            </props>
        </property>
    </bean>
<!-- 对于 hibernate4 只有一个 LocalSessionFactoryBean 来完成 Spring 整合 hibernate4 的配置 -->

二、事务管理

1. 事务的四个特性

2. Spring 的事务管理器

2.1 Spring 对 jdbc、mybatis 提供的事务管理器

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
2.2 Spring 对 hibernate 提供的事务管理器
<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
3. 声明式事务

3.1 事务属性
(1)传播行为

(2)隔离级别



不同数据库的隔离级别不一定相同
(3)只读
    如果事务只是对数据库进行读操作,可以将事务的只读属性设置为 true,优化数据库
(4)事务超时
    可以设置事务超时属性,以避免事务长时间占用数据库资源,因为事务可能会涉及到对数据库资源的锁定
(5)回滚规则
    默认情况下,事务只有在遇到运行期异常时才会回滚。你可以设置事务的回滚规则
3.2 示例
<!-- 定义事务通知 -->    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
            <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
            <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
            <tx:method name="exec*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
            <tx:method name="find*" propagation="SUPPORTS" />
            <tx:method name="get*" propagation="SUPPORTS" />
            <tx:method name="select*" propagation="SUPPORTS" />
            <tx:method name="submit*" propagation="REQUIRES_NEW" read-only="false" rollback-for="java.lang.Exception" />
            <tx:method name="deal*" propagation="REQUIRES_NEW" read-only="false" rollback-for="java.lang.Exception" />
        </tx:attributes>
    </tx:advice>
<!-- 定义完整事务切面 -->
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.ifaex.service..*Impl.*(..))" />  <!-- 定义完整事务切点 -->       
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="txdvice" />  <!-- 定义完整事务切面 -->
    </aop:config>

3.3 使用注解驱动声明事务
<tx:annotation-driven transaction-manager = "txManager" />
<!-- transaction-manager 指定事务管理器,默认值是 transactionManager -->
@Transactional(readOnly = true)
public class DefaultFooService implements FooService {

    public Foo getFoo(String fooName) {
        // do something
    }

    // these settings have precedence for this method
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void updateFoo(Foo foo) {
        // do something
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值