zoukankan      html  css  js  c++  java
  • Spring框架(6)--JDBCTemplate的使用和Spring的事务控制

    Spring框架中有封装好的JDBCTemplate可以使用,手动创建太麻烦并且没有参考价值,下面只展示通过注解开发的JDBCTemplate的使用代码案例:

    使用步骤:

    1.导入相关的坐标

    使用的是druid链接池:

     1     <dependencies>
     2         <dependency>
     3             <groupId>mysql</groupId>
     4             <artifactId>mysql-connector-java</artifactId>
     5             <version>5.1.47</version>
     6         </dependency>
     7         <dependency>
     8             <groupId>com.alibaba</groupId>
     9             <artifactId>druid</artifactId>
    10             <version>1.1.10</version>
    11         </dependency>
    12         <dependency>
    13             <groupId>org.springframework</groupId>
    14             <artifactId>spring-context</artifactId>
    15             <version>5.0.5.RELEASE</version>
    16         </dependency>
    17         <dependency>
    18             <groupId>org.springframework</groupId>
    19             <artifactId>spring-jdbc</artifactId>
    20             <version>5.0.5.RELEASE</version>
    21         </dependency>
    22       
    27         <dependency>
    28             <groupId>org.aspectj</groupId>
    29             <artifactId>aspectjweaver</artifactId>
    30             <version>1.8.13</version>
    31         </dependency>
    32     </dependencies>

    2.创建数据库表

    自行创建。

    3.创建功能实现类

    自行创建。

    4.配置Spring核心配置文件

     <!--扫描包-->
        <context:component-scan base-package="com.itheima"/>
    
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/ssm_spring"/>
            <property name="username" value="root"/>
            <property name="password" value="123"/>
        </bean>
    
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
    </bean>

    5.创建JDBCTemplate对象并使用

    在Dao层实现类中通过注解注入获取对象:

     @Autowired
        private JdbcTemplate template;

    调用JDBCTemplate的query或者update方法就可以了。

    6.测试

    自行测试。

    重复度跟Spring(4)--注解开发中比较高,所以不详细写步骤了。

    Spring的事务控制:

    Spring事务控制分为编程式事务控制和声明式事务控制。

    编程式事务控制的意思是通过编码来开启事务控制或关闭事务控制。太过于麻烦,了解就行了。

    声明式事务控制是通过配置来开启或关闭事务。声明式事务控制又分为基于xml的声明式事务控制和基于注解的声明式事务控制。

    编程式事务控制:

    编程式事务控制三大对象:

    PlatformTransactionManager

    TransactionDefinition

    TransactionStatus

    PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

    注意:

    PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类,例如:Dao 层技术是jdbc 或 mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager

    Dao 层技术是hibernate时:org.springframework.orm.hibernate5.HibernateTransactionManager

    TransactionDefinition 是事务的定义信息对象,里面有如下方法:

    事务隔离级别

    设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。

    ISOLATION_DEFAULT

    ISOLATION_READ_UNCOMMITTED

    ISOLATION_READ_COMMITTED

    ISOLATION_REPEATABLE_READ

    ISOLATION_SERIALIZABLE

    事务传播行为

    REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)

    SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

    MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常

    REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

    NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

    NEVER:以非事务方式运行,如果当前存在事务,抛出异常

    NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作

    超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置

    是否只读:建议查询时设置为只读

    TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

     以上了解就可以了。

    声明式事务控制:

    使用步骤:

    1.导入相应的jar包

     1 <!-- spring的事务管理 -->
     2 <dependency>
     3     <groupId>org.springframework</groupId>
     4     <artifactId>spring-tx</artifactId>
     5     <version>5.0.5.RELEASE</version>
     6 </dependency>
     7 <!-- Aop的切入点表达式解析 -->
     8 <dependency>
     9     <groupId>org.aspectj</groupId>
    10     <artifactId>aspectjweaver</artifactId>
    11     <version>1.8.7</version>
    12 </dependency>

    2.配置事务管理器

    1 <!-- 事务管理器(在Spring的核心配置文件中) -->
    2 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    3     <property name="dataSource" ref="dataSource"/>
    4 </bean>

    3.配置事务的切面和织入关系

    xml配置:

     1 <!--事务切面-->
     2 <aop:config>
     3     <aop:advisor advice-ref="txAdvice" 
     4                  pointcut="execution(* com.itheima.service.impl.*Impl.*(..))">
     5     </aop:advisor>
     6 </aop:config>
     7 <!--事务的详细配置-->
     8 <tx:advice id="txAdvice" transaction-manager="transactionManager">
     9     <tx:attributes>
    10         <tx:method name="save*" propagation="REQUIRED" read-only="false"/>
    11         <tx:method name="update*" propagation="REQUIRED" read-only="false"/>
    12         <tx:method name="delete*" propagation="REQUIRED" read-only="false"/>
    13         <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
    14         <tx:method name="*"/>
    15     </tx:attributes>
    16 </tx:advice>

    注解配置:

    在Spring核心配置文件中:

    <!--开启Spring声明式事务的注解支持-->
    <tx:annotation-driven />

    在对应的类上加入事务注解:

     1 @Transactional  //表示当前类的所有方法都加入注解支持 propagation:REQUIRED read-only:false
     2 public class AccountServiceImpl implements AccountService {
     3 
     4     @Autowired
     5     private AccountDao accountDao;
     6 
     7     public void transfer(String outMan, String inMan, double money) {
     8         accountDao.out(outMan, money);
     9         int i = 10 / 0;
    10         accountDao.in(inMan, money);
    11     }
    12 }

    4.测试

  • 相关阅读:
    Linux定时运行程序脚本
    git tips
    Python循环
    Head First Design Patterns
    animation过渡效果
    图像处理池化层pooling和卷积核
    TensorFlow的梯度裁剪
    神经网络优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam
    CNN网络架构演进
    TensorFlow object detection API应用
  • 原文地址:https://www.cnblogs.com/j9527/p/12036167.html
Copyright © 2011-2022 走看看