spring&JDBC模板类&事务管理平台

Spring的JDBC的模板

![spring框架JDBC模板类.png][1]
jar包:
![jar包.png][2]
创建一个测试类:
    @Test
    // JDBC模板的基本使用:
    public void demo1(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring_day03");
        dataSource.setUsername("root");
        dataSource.setPassword("123");
        
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.update("insert into account values (null,?,?)", "会希",10000d);
    }

将连接池的配置交给Spring管理

1.配置内置连接池
    <!-- 配置Spring的内置连接池 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///spring_day02"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>
2.将模板配置到Spring中(也可以让dao层继承HibernateDaoSupport类注入SessionFactory创建,或者是连接池)
    <!-- 配置JDBC模板 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
3.编写测试类
引入spring-aop.jar
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo2 {
    
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
    
    @Test
    public void demo1(){
        jdbcTemplate.update("insert into account values (null,?,?)", "凤姐",10000d);
    }

}

Spring中配置DBCP连接池

![dbcp链接池.png][3]
【配置连接池】
    <!-- 配置DBCP连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///spring_day02"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>

配置c3p0连接池

![c3p0连接池.png][4]
配置连接池
    <!-- 配置C3P0连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"/>
        <property name="user" value="root"/>
        <property name="password" value="123"/>
    </bean>

Spring进行事务管理一组API

PlatformTransactionManager:平台事务管理器.
真正管理事务的对象
使用Spring JDBC或iBatis 进行持久化数据时使用
    org.springframework.jdbc.datasource.DataSourceTransactionManager
使用Hibernate版本进行持久化数据时使用
    org.springframework.orm.hibernate3.HibernateTransactionManager

TransactionDefinition:事务定义信息
事务定义信息:
隔离级别
传播行为
超时信息
是否只读
TransactionStatus:事务的状态:
记录事务的状态

Spring的这组接口是如何进行事务管理:
平台事务管理根据事务定义的信息进行事务的管理,事务管理的过程中产生一些状态,将这些状态记录到TransactionStatus里面

事务的传播行为:
PROPAGION_XXX        :事务的传播行为
     保证同一个事务中
     PROPAGATION_REQUIRED    支持当前事务,如果不存在 就新建一个(默认)
     PROPAGATION_SUPPORTS    支持当前事务,如果不存在,就不使用事务
     PROPAGATION_MANDATORY    支持当前事务,如果不存在,抛出异常

     保证没有在同一个事务中
     PROPAGATION_REQUIRES_NEW    如果有事务存在,挂起当前事务,创建一个新的事务
     PROPAGATION_NOT_SUPPORTED    以非事务方式运行,如果有事务存在,挂起当前事务
     PROPAGATION_NEVER     以非事务方式运行,如果有事务存在,抛出异常

     PROPAGATION_NESTED    如果当前事务存在,则嵌套事务执行
[事务传播详细解释][5]

转账代码

创建业务层和DAO的类
public interface AccountService {

    public void transfer(String from,String to,Double money);
    }

    public class AccountServiceImpl implements AccountService {

    // 业务层注入DAO:
    private AccountDao accountDao;
    
    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    @Override
    /**
     * from:转出的账号
     * to:转入的账号
     * money:转账金额
     */
    public void transfer(String from, String to, Double money) {
        accountDao.outMoney(from, money);
        accountDao.inMoney(to, money);
    }

    }

    public interface AccountDao {

    public void outMoney(String from,Double money);
    
    public void inMoney(String to,Double money);
    }

    public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {

    @Override
    public void outMoney(String from, Double money) {
        this.getJdbcTemplate().update("update account set money = money - ? where name = ?", money,from);
    }

    @Override
    public void inMoney(String to, Double money) {
        this.getJdbcTemplate().update("update account set money = money + ? where name = ?", money,to);  
    }
          
}
配置业务层和DAO
    <!-- 配置业务层的类 -->
    <bean id="accountService" class="cn.itcast.transaction.demo1.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>
    
    <!-- 配置DAO的类 -->
    <bean id="accountDao" class="cn.itcast.transaction.demo1.AccountDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    </bean>
1.5.1.3编写测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class SpringDemo4 {
    
    @Resource(name="accountService")
    private AccountService accountService;
    
    @Test
    // 转账的测试:
    public void demo1(){
        accountService.transfer("会希", "凤姐", 1000d);
    }
}

Spring的编程式事务(不推荐使用)

手动编写代码完成事务的管理
配置事务管理器
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
    </bean>
配置事务管理的模板
    <!-- 配置事务管理模板 -->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
    </bean>
需要在业务层注入事务管理模板
    <!-- 配置业务层的类 -->
    <bean id="accountService" class="cn.itcast.transaction.demo1.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <!-- 注入事务管理模板 -->
        <property name="transactionTemplate" ref="transactionTemplate"/>
    </bean>
手动编写代码实现事务管理
    public void transfer(final String from, final String to, final Double money) {
        
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                accountDao.outMoney(from, money);
                int d = 1 / 0;
                accountDao.inMoney(to, money);        
            }
        });
    }

spring的声明式事务管理XML方式(推荐使用注解方式):思想就是AOP.

不需要进行手动编写代码,通过一段配置完成事务管理
引入AOP开发的包
    aop联盟.jar
    Spring-aop.jar
    aspectJ.jar
    spring-aspects.jar
配置事务管理器
    <!-- 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
配置事务的通知
    <!-- 配置事务的增强 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
          <!--
                isolation="DEFAULT"        隔离级别
                propagation="REQUIRED"    传播行为
                read-only="false"    只读
                timeout="-1"        过期时间
                rollback-for=""        -Exception
                no-rollback-for=""    +Exception
             -->
            <tx:method name="transfer" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
配置aop事务
    <aop:config>
        <aop:pointcut expression="execution(表达式)" id="pointcut1"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
    </aop:config>

猜你喜欢

转载自blog.csdn.net/qq_40325734/article/details/80710941