• 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>
  • 相关阅读:
    setMasksToBounds
    CSRF跨站
    ORM: object relationship mapping
    orm查询
    图书管理系统(增删改)
    django图书管理半成品(MySQL)
    模板继承(练习测试)
    模板层(template)
    django命令(笔记,自己看的)
    django(注册→登录→主页)增强版
  • 原文地址:https://www.cnblogs.com/sybk/p/10004728.html
Copyright © 2020-2023  润新知