spring操作数据库 jdbc

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>

这个简化数据库操作 及其事务控制

maven依赖就导入了 jdbc 和 tx

如果用mybatis,则还需要导入orm模块,做事务控制时候,orm模块支持各种版本的mybatis

配置数据源和jdbcTemplate(Spring 提供简化数据库操作的工具)

xml中:

<tx: annnotation-driven/>

config:

@EnableTransactionManagement
@ComponentScan(value="com.toov5")
@Configuration
public class TxConfig { @Bean
public ComboPooledDataSource dataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("12345");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); return dataSource;
} @Bean
public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
// Spring 对 @Configuration列特殊处理; 给容器加组件方法,多次调用都是从容器中找组件
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource()); //调用 dataSource() 方法
return jdbcTemplate;
} //事务管理器 管理数据源 事务开始 回滚之类的都是有事务管理器来做
@Bean //注册事务管理器在容器中
public PlatformTransactionManager transactionManager() throws PropertyVetoException {
return new DataSourceTransactionManager(dataSource());
} }

(套路都是 @EnableXXX)

service:

@Service
public class BookService { @Autowired
private BookDao bookDao; @Transactional
public void insertUser() {
bookDao.insertUser();
}
}

步骤:

1、开启事务管理功能

2、@Transactional 标注到方法

3、配置事务管理器到容器

看下源码:

大家可以按照这个思路点击或者debug调试查看:

1  @EnableTransactionManagement

利用 TransactionManagementConfigurationSelector 给容器中导入两个组件:

AutoProxyRegisrar

ProxyTransactionManagementConfiguration

2 AutoProxyRegistrar

给容器注册一个 InfrastructureAdvisorAutoProxyCreator组件

InfrastructureAdvisorAutoProxyCreator 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器) 代理对象执行方法利用拦截器链进行调用

3  ProxyTransactionManagementConfiguration   给容器注册事务增强器

1 给容器中注册事务增强器

事务增强器要用事务注解的信息  AnnotationTransactionAttributeSource 解析事务注解

事务拦截器 TransactionInterceptor 保存了事务属性信息 、事务管理器

是个MethodInterceptor 方法拦截器

在目标方法执行的时候 执行拦截器链 : 先获取事务相关的属性  再获取PlantformTransactionManager 平台的事务管理器。如果没有实现添加任何TransactionManager, 则最终会从容器中按照类型

获取一个PlantformTransactionManager

执行目标方法,如果异常,获取事务管理器,利用事务管理器 回滚操作。 如果正常利用事务管理器提交事务。

Spring注解(事务)的更多相关文章

  1. spring注解事务使用总结

    在使用spring的注解事务的时候,需要考虑到事务的传播行为.遇到什么类型的异常时,事务才起作用.事务方法之间的嵌套调用时,怎么样才生效等等诸多问题.网上搜到很多的主要还是一堆理论文字描述,我这里给出 ...

  2. Spring -- 注解事务 以及 7个传播行为

    注解事务: 1.开启注解事务配置: <!-- 事务管理器 --> <bean id="transactionManager" class="org.sp ...

  3. spring 注解事务

    前提:在applicationContext.xml中配置<tx:annotation-driven transaction-manager="transactionManager&q ...

  4. spring注解事务管理

    使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/b ...

  5. 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制

    新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这 ...

  6. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  7. 记录一次Spring boot 搭建框架连接Mysql数据库注解事务不回滚的故障

    搭建了一个新框架,使用了spring boot 替换以简化原来繁杂的spring配置,使用Spring注解管理事务,持久层使用mybatis. 连接mysql数据库完成项目的过程中发现不支持事务,因为 ...

  8. Spring中注解事务方面的问题

    我们可以在spring的配置文件beans.xml中对事务进行注解配置,这样在相应的类中就不用对事务进行管事,对于某个类,想单独交给spring来管理,那么就在相应的类上加入@Transactiona ...

  9. spring中注解事务认识

    1.配置事务管理器 <!-- 设定transactionManager事务管理器 --> <bean id="txManager" class="org ...

随机推荐

  1. C语言函数重入

    C语言函数重入 可重入函数:可以被中断的函数,即这个函数执行时,可以中断其执行,可以由一个或多个任务并发使用,而不比担心数据错误. 不可重入函数(不安全函数) 不能运行在多任务环境下,除非能保证互斥( ...

  2. 【BZOJ4627】[BeiJing2016]回转寿司 SBT

    [BZOJ4627][BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿司带给小Z的味觉感 ...

  3. Powershell Get Domain Mailbox的几种方法

    一.Disconnected Mailboxes 1.Finding Disconnected Mailboxes The first function is called Get-Disconnec ...

  4. 【Python之路】第二十二篇--Django【基础篇】

    1 Django流程介绍 MTV模式       著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...

  5. html常见兼容性问题

    html常见兼容性问题? 1.双边距BUG float引起的  使用display 2.3像素问题 使用float引起的 使用dislpay:inline -3px 3.超链接hover 点击后失效 ...

  6. Xcode 编译静态库

    有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到c++的代码的时候,可以通过编译成静态库的方式来使用.本文中使用的Xcode版本是8.3,静态库制作过程和其他版本基本一样,可能出 ...

  7. 【我的Android进阶之旅】解决bug:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    前言 今天用Android Studio 生成Activity的时候,默认继承AppCompatActivity ,而在AndroidManifest.xml我对该Activity设置了一个主题,然后 ...

  8. Unity3d 面向对象设计思想(六)(Unity3d网络异步数据)

    在MonoBehavior类中有一个方法是StartCoroutine.里面要求的是一个接口为IEnumerator协同的返回值, 在Unity3d中,协同的作用是马上返回结果的.而不影响其它程序的运 ...

  9. What are the top 10 things that we should be informed about in life

    1.Realize that nobody cares, and if they do, you shouldn't care that they care. Got a new car? Nobod ...

  10. Spring-Hello World实例

    Spring Hello World实例 创建Java项目 添加Jar包 创建源文件 现在在Spring项目下创建实际的源文件.首先,要创建一个名为com.tuorialsponit的包,然后在该co ...