jdbcTemplate事务管理
1、基于TransactionTemplate的编程式事务管理
Spring之路(39)–基于TransactionTemplate的编程式事务管理
本篇通过TransactionTemplate类,实现了对固定流程代码的封装,只需要将视作原子性操作的几个数据库操作放入一个方法中处理即可实现事务。
修改配置类,在上一篇注册PlatformTransactionManater类型bean的基础上,注册TransactionTemplate类型的bean,代码如下:
package org.maoge.templatetran;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
import com.alibaba.druid.pool.DruidDataSource;
/**
* Spring配置类
*/
@Configuration
public class SpringConfig {
/**
* 定义数据源bean
*/
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/myblog?useUnicode=true&characterEncoding=utf-8");
dataSource.setUsername("root");
dataSource.setPassword("Easy@0122");
return dataSource;
}
/**
* 定义事务管理bean
*/
@Bean
public PlatformTransactionManager transactionManager() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource());// 注入dataSource
return transactionManager;
}
/**
* 定义TransactionTemplate类型的bean
*/
@Bean
public TransactionTemplate transactionTemplate() {
TransactionTemplate transactionTemplate=new TransactionTemplate();
transactionTemplate.setTransactionManager(transactionManager());//注入事务管理器
return transactionTemplate;
}
/**
* 配置namedParameterJdbcTemplate组件
*/
@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(dataSource());// 注入dataSource
return template;
}
/**
* 为BlogDao注册bean
*/
@Bean
public BlogDao blogDao() {
BlogDao blogDao = new BlogDao();
blogDao.setNamedTemplate(namedParameterJdbcTemplate());// 注入namedParameterJdbcTemplate
return blogDao;
}
}
数据对象BlogDo和数据操作对象BlogDao没有任何变化:
package org.maoge.templatetran;
import java.util.HashMap;
import java.util.Map;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
/**
* @theme DAO--博客
* @author maoge
* @date 2020-01-29
*/
public class BlogDao {
public NamedParameterJdbcTemplate getNamedTemplate() {
return namedTemplate;
}
public void setNamedTemplate(NamedParameterJdbcTemplate namedTemplate) {
this.namedTemplate = namedTemplate;
}
private NamedParameterJdbcTemplate namedTemplate;
/**
* 新增
*/
public void insert(BlogDo blog) {
Map<String, Object> map = new HashMap<>();
map.put("author", blog.getAuthor());
map.put("content", blog.getContent());
map.put("title", blog.getTitle());
// 注意使用:xxx占位
namedTemplate.update("insert into blog(author,content,title)values(:author,:content,:title)", map);
}
}
package org.maoge.templatetran;
/**
* @theme 数据对象--博客
* @author maoge
* @date 2020-01-27
*/
public class BlogDo {
private Long id;
private String title;
private String author;
private String content;
// 省略get get
}
测试验证,注意使用事务时,通过TransactionTemplate类的方法使用:
package org.maoge.templatetran; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate; public class Main {
public static void main(String[] args) {
// 获取容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
// 容器中获取TransactionTemplate
TransactionTemplate transactionTemplate = (TransactionTemplate) context.getBean("transactionTemplate");
// 容器中获取数据库操作组件
BlogDao blogDao = (BlogDao) context.getBean("blogDao");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
// 注意!该方法中的操作会实现事务
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
BlogDo blog = new BlogDo();
blog.setContent("测试");
blogDao.insert(blog);
int a = 1 / 0;// 发生异常,导致事务回滚,所以并不会插入任何一行数据
blogDao.insert(blog);
}
});
}
}
需要注意的是,TransactionTemplate执行时,不论发生受检查的异常(Exception),还是不受检查的异常(RuntimeException),均会执行回滚操作,这个是比较符合我们期望的,在下一篇声明式事务管理里面,你会发现默认情况不是这样的,有点小坑啊。
其他
1)spring jdbcTemplate 事务,各种诡异,包你醍醐灌顶!
2)3.16Spring对jdbcTemplate查询语句的封装和编程式事务及声明式事务
3)Spring学习笔记(五):JDBCTemplate+事务管理
jdbcTemplate事务管理的更多相关文章
- Spring学习笔记(五):JDBCTemplate+事务管理
1 概述 Spring为开发者提供了JDBCTemplate,可以简化很多数据库操作相关的代码,本文主要介绍JDBCTemplate的使用以及事务管理功能. 2 JDBC Template 2.1 配 ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- Spring JdbcTemplate 与 事务管理 学习
Spring的JDBC框架能够承担资源管理和异常处理的工作,从而简化我们的JDBC代码, 让我们只需编写从数据库读写数据所必需的代码.Spring把数据访问的样板代码隐藏到模板类之下, 结合Sprin ...
- Spring jdbctemplate和事务管理器 全注解配置 不使用xml
/** * spring的配置类,相当于bean.xml */@Configuration//@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans ...
- Spring jdbctemplate和事务管理器
内部bean 对象结构: @Autowiredprivate IAccountService accountService; @Service("accountService")@ ...
- spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate
什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现 ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- spring事务管理器设计思想(一)
在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...
- spring笔记--事务管理之声明式事务
事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使 ...
随机推荐
- Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD.SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗? 很显然,答案是否定的! 对该问题产生疑问的根源还是对Sp ...
- 《C++ Primer》笔记 第3章 字符串、向量和数组
位于头文件的代码一般来说不应该使用using声明. 如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去.与之相反,如果不使用等号,则执行的是直接 ...
- 《Selenium自动化测试实战》新书上市,有需要朋友们可以了解下,欢迎大家多提宝贵意见
京东:https://item.jd.com/13123910.html当当:http://product.dangdang.com/29204520.html 1. 本书基于 Python 3.8 ...
- [个人总结]pip安装tensorboard太慢
在执行pip install语句的时候直接指定国内豆瓣的镜像源进行下载: pip install -i https://pypi.douban.com/simple 你想下载的包的名称 例如下载ten ...
- Java 基础加强 02
基础加强·反射 和 枚举 类的加载概述和加载时机 * A:类的加载概述 * 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化来实现对这个类的初始化 * 加载 * 就是指 ...
- IDEA 远程调试服务器代码
在 /home/ttx/app/uco-azj/catalina/30017/bin/set_env.sh export CATALINA_OPTS="-Xms1g -Xmx2g -XX:+ ...
- 翻译:《实用的Python编程》04_03_Special_methods
目录 | 上一节 (4.2 继承) | 下一节 (4.4 异常) 4.3 特殊方法 可以通过特殊方法(或者称为"魔术"方法(magic method))自定义 Python 行为的 ...
- 200-Java语言基础-Java编程入门-006 | Java数组定义及使用(引用数据类型)
一.数组概述和定义格式说明 为什么要有数组(容器): 为了存储同种数据类型的多个值 数组概念: 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引 ...
- x64 下记事本WriteFile() API钩取
<逆向工程核心原理>第30章 记事本WriteFile() API钩取 原文是在x86下,而在x64下函数调用方式为fastcall,前4个参数保存在寄存器中.在原代码基础上进行修改: 1 ...
- 7、MyBatis教程之分页实现
8.分页实现 1.limit实现分页 思考:为什么需要分页? 在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使 ...