spring笔记(四)

事务管理:比如转账,要么都完成,要么都不完成
1.DAO:

public interface BookShopDAO {
    //根据书号获取书的单价
    public int findBookPriceIsbn(String isbn);
    //更新书的库存,使书号对应的库存-1
    public void updateBookStock(String isbn);
    //更新用户的账户余额,使username的balance-price
    public void updataUserAccount(String username,int price);
}

2.实现接口

@Repository("bookShopDAO")
public class BookShopDaoImpl implements BookShopDAO {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public int findBookPriceIsbn(String isbn) {
        String sql="select price from book where isbn=?";
        return jdbcTemplate.queryForObject(sql,Inter.class,isbn);
    }

    @Override
    public void updateBookStock(String isbn) {
        String sql="UPDATA  book_stock SET stock=stock-1 where isbn=?";
        jdbcTemlate.update(sql,isbn);
    }

    @Override
    public void updataUserAccount(String username, int price) {
        String sql="UPDATA  account SET balance=balance-? where username=?";
        jdbcTemlate.update(sql,price,username);
    }

}

3.改配置xml
4.测试(库存-1,账户余额没变)
5.配置事务管理器(基于注解)

配置事务管理器
<bean id="transationManager" class="--DataSourceTransationManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--启用事务注解-->
<tx:annptation-driver ansaction-manager="transationManager"/>

6.添加事务注解@Transational
事务的传播行为:一个事务调用另一个事务时,是重开一个事务,还是有事务就行(用调用的事务)比如:和朋友区吃饭,又遇到共同的朋友,是另开一桌还是公用一桌
@Transational(propagation=Propagation.REQUIRED)//使用propagation指定事务的传播行为,及当前的事务被另一个事务方法调用时如何使用事务,默认取值为required,即使用调用方法的事务
@Transational(propagation=Propagation.REQUIRED_NEW)启用新事务
事务其他属性:(隔离级别,回滚,只读,过期)
隔离:@Transational(propagation=Propagation.REQUIRED_NEW,isolation=Isolation.READ_COMMITTED)
//使用isolation指定事务的隔离级别,最常用的取值为READ_COMMITTED
回滚://默认情况下,spring的声明式事务对所有的运行时异常进行回滚,也可通过对应的属性进行设置
noRollbackFor={userAccountException.class}对这个异常不回滚
通常情况下取默认值
只读:使用readOnly指定事务是否只读,只读数据不更新数据,可以帮助数据库引擎优化 ,若真的是一个只读取数据库值得方法,应设置readOnly=true。默认:readOnly=false
使用timeout指定强制回滚之前事务可以占用的时间
使用xml配置事务
1.配置事务处理器transactionManager
2.配置事务属性根据方法名指定事务的属性
3.配置事务切入点,以及把事务切入点和事务属性关联起来<aop:advisor advice-ref=”advice的id” pointcut-ref=”pointcut的id”>

spring整合Hibernate
1.整合什么:
IOC 容器生成hibernate的SessionFactory
让hibernate使用上Spring的声明式事务
2.步骤
1)加hibernate
a.require中jar包,mysql驱动,c3p0
b.添加hibernate配置文件:hibernate.cfg.xml

<session-factory>
<配置HIBERNATE的基本属性>
<!--1.数据源需配置到IOC容器中,所以在此处不需要配置数据源-->
<!--2.关联的.hbm.xml也在IOC容器配置 sessionFactory实例时在进行配置-->
<!--3.配置hibernate的基本属性:方言,SQL显示及格式化,生成数据表的策略以及二级缓存-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--配置hibernate二级缓存-->
    c.创建持久化类 Account:id,username,balance
                 Book:id,bookName,isbn,price,stock
    d.生成对应的.hbm.xml文件

2)加Spring
a.require中jar包
b.spring配置文件applicationContext.xml

<!--配置数据源-->
<导入资源文件:db.properties>
<!--导入资源文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置c3p0数据源-->
<bean id="dataSouce" class="com----combopooledDataSource">
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="jdbcUrl" value="${jdbc.jdbcurl}"/>
    <property name="driverClass" value="${jdbc.driverClass}"/>
    <property name="initPoolSize" value="${jdbc.initPoolSize}"/>
    <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
</bean>
<!--配置hibernate的sessionFactory实例:通过Spring提供的localSessionFactoryBean进行配置-->
<bean id="sessionFactory" class="----LocalSessionFactoryBean">
    <!--配置数据源属性-->
    <property name="dataSource" ref="dataSource">
    <!--配置hibernate配置文件的位置和名称-->
    <property name="configLocation" value="classpath:hibernate.cfg.xml">
    <!--配置hibernate映射文件的位置和名称-->
    <property name="mappingLocation" value="classpath:com/---/*.hbm.xml">
</bean>
<!--配置spring的声明式事务-->
<!--1.配置事务管理器-->
    <bean id="transationManager" class="----">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
<!--2.配置事务属性,需要事务管理器-->
<tx:advice id="txAdvice" transation-manager="transationManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>
<!--3.配置事务切入点,以及把事务切入点和事务属性关联起来-->
<aop:config>
    <aop:pointcut expression="execution(--) " id="">
    <aop:advisor advice-ref="advice的id" pointcut-ref="pointcut的id">>
</aop:config>

3)整合

猜你喜欢

转载自blog.csdn.net/sinat_34817187/article/details/51926142