zoukankan      html  css  js  c++  java
  • 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理

    Spring的数据库编程

     Spring框架提供了JDBC模板模式------>JdbcTemplate

    简化了开发,在开发中并不经常是使用

    实际开发更多使用的是Hibernate和MyBatis

    1).Spring JDBCp配置

    如果使用Spring JDBC操作数据库,要有如下的配置:

    在xml配置文件

    <!-- 配置数据源:可以使用各种数据源如c3p0.... -->
    <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
         <property name="driverClassName"  value="com.mysql.jdbc.Driver" />
         <property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
         <property name="username" value="root" />
         <property name="password" value="1234" />
    </bean> 
    
    
    <!-- 配置jdbc模块 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    配置JDBC模板需要将dataSource注入到jdbcTemplate

     有时候也需要将JdbcTemplate注入到相应的Bean中可以使用:

    @Autowired
    private JdbcTemplate jdbcTemplate ;

    2).JdbcTemplate  常用方法

    --->public int update(String sql,Object args []):l=可以对数据库进行增加、修改、删除等操作...

    --->public List<T> query (String sql,RowMapper<T> rowMapper,Object args[]):该方法执行对数据库的查询...

     相关jar:

    -logging

    -mysql-connector-java-

    -aop

    -beans

    -context

    -core

    -expression

    -jdbc

    tx

    注:在dao方法中的操作可以使用@Componment、@Respository、@Service、@controller进行对包扫描,使用@Autowire进行自动注入!

     3).测试:

     新建数据库

    数据库对应的实体类:

    User.java

    public class User {
        private Integer id;
        private String name;
        private String pw;
            //....
    }

     tx.xml

    <!-- 配置数据源 -->
    <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
         <property name="driverClassName"  value="com.mysql.jdbc.Driver" />
         <property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
         <property name="username" value="root" />
         <property name="password" value="1234" />
    </bean> 
    
    <!-- 配置jdbc模块 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

     测试:

     public ApplicationContext getapp(){
             return new 
                     ClassPathXmlApplicationContext("tx.xml");
         }
    
        //增删改....
        @Test
        public void test1(){
            JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate");
            System.out.println(jdbcTemplate);
                   Object a [] = {4,"user4","pwd4"};
            Object b [] = {5,"user5","pwd5"};
            
            String sql = "insert into user values(?,?,?)";
            
            //添加用户
            jdbcTemplate.update(sql, a);
            jdbcTemplate.update(sql, b);
            
            //查询
            sql = "select * from user";
            
            RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
            List<User> users =  jdbcTemplate.query(sql, rowMapper, null);
            for(User user : users){
                System.out.println(user);
            }    
        }

     

    编程式事务管理

     1).基于底层API的编程式事务管理

    基于底层API的编程式事务管理就是根据PlatformTransactionManager、TransactionDefinition和

    TransactionStatus几个核心接口,通过编程的方式解决来进行事务处理。

    需要在spring的配置文件中:

    <!-- 配置数据源 -->
    <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
         <property name="driverClassName"  value="com.mysql.jdbc.Driver" />
         <property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
         <property name="username" value="root" />
         <property name="password" value="1234" />
    </bean> 
    
    <!-- 配置jdbc模块 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    <!-- 为数据源添加事物管理 -->
    <bean id="dataSourceTransactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

     test

        //事务管理...
        @Test
        public void test2(){
            JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate");
            //事物管理器
            DataSourceTransactionManager tx = (DataSourceTransactionManager) getapp().getBean("dataSourceTransactionManager"); 
            //默认事物定义,隔离级别、传播行为....
            TransactionDefinition tf = new DefaultTransactionDefinition();
            //开启事物
            TransactionStatus ts = tx.getTransaction(tf);    
            
         String res
    = tx(jdbcTemplate, tx, tf, ts); System.out.println(res); } public String tx(JdbcTemplate jdbcTemplate,DataSourceTransactionManager tx, TransactionDefinition tf,TransactionStatus ts){ String msg = "执行成功,没有事物回滚!"; try{ Object a [] = {2,"user2","pwd2"}; String sql = "insert into user values(?,?,?)"; //添加用户 //主键重复 jdbcTemplate.update(sql, a); //提交事务 tx.commit(ts); }catch(Exception e){ //出现异常,事物回滚 tx.rollback(ts); msg= "主键重复!!!"; e.printStackTrace(); } return msg; }

     

    以上的这种操作会让事物处理的代码散落在业务逻辑代码中,破坏了原有代码的条理性,并且让每一个业务方法都包含了

    类似启动事物、提交以及回滚事务的样板式代码。

    TransactionTemplate的execute方法有一个TransactionCallback接口类型的参数,该接口定义了doInTransaction方法、通常

    以匿名内部类的方式实现TransactionCallback接口,在doInTransaction方法中写业务逻辑代码

     public T doInTransaction(TransactionStatus arg0)

     TransactionStatus类型参数、可以在方法的任何位置调用该参数方法的setRollbackOnly方法将事务标识为回滚、以执行事务回滚

    根据默认规则:

    如果在执行回调方法过程中如果抛出未检查异常或者显示调用setRollbackOnly方法,则回滚事物

    如果事务执行完成或抛出了checked类型的异常,则提交事务

    代码待完成......

  • 相关阅读:
    kaggle—first play—Titanic
    数据挖掘——时间序列分析
    数据挖掘——关联算法
    数据挖掘——聚类分析总结
    数据挖掘——特征工程
    数据挖掘——基于sklearn包的分类算法小结
    数据挖掘——分类算法——贝叶斯分类、决策树
    数据挖掘——分类算法——KNN
    数据挖掘——回归分析2——简单神经网络的python实现
    【springBoot】小记
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10099782.html
Copyright © 2011-2022 走看看