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="" />
</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="" />
</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="" />
</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 [] = {,"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类型的异常,则提交事务
代码待完成......
8.spring:事务管理(上):Spring的数据库编程、编程式事务管理的更多相关文章
- 全面分析 Spring 的编程式事务管理及声明式事务管理--转
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- spring事务管理——编程式事务、声明式事务
本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...
- Spring编程式事务管理及声明式事务管理
本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...
- spring 编程式事务管理和声明式事务管理
编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...
- Spring 声明式事务与编程式事务详解
本文转载自IBM开发者论坛:https://developer.ibm.com/zh/articles/os-cn-spring-trans 根据自己的学习理解有所调整,用于学习备查. 事务管理对于企 ...
- 【spring 6】Spring和Hibernate的整合:编程式事务
一.编程式事务简介 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用beginTransaction() ...
- spring的声明式事务和编程式事务
事务管理对于企业应用来说是至关重要的,当出现异常情况时,它可以保证数据的一致性. Spring事务管理的两种方式 1.编程式事务 使用Transaction Ttempleate或者直接使用底层的Pl ...
- 春天的事务之9.3编程式事务 - 跟我学spring3
9.3编程式事务 9.3.1编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同 ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
随机推荐
- Magento 2中文文档教程 - Magento 2.1.x 系统需求
Magento 2.1.x 系统需求 操作系统 (Linux x86-64) Linux发行版如红帽企业Linux(RHEL),CentOS,Ubuntu,Debian,等等 内存需求 升级的应用程序 ...
- 互联网轻量级框架SSM-查缺补漏第九天
简言: 第九章 Spring Ioc的概念 IoC(Inversion of Control)控制反转:比如想喝橙汁,在没有饮品店的日子,最直观的做法是买果汁机.橙汁.这是你自己“主动”创造的过程,也 ...
- JS里的居民们5-数组(栈)
编码1(栈顶在最右) 练习如何使用数组来实现栈,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关进栈.退栈.获取栈 ...
- 004声明式服务调用Feign & 断路器Hystrix
1.POM配置 和普通Spring Boot工程相比,添加了Eureka Client.Feign.Hystrix依赖和Spring Cloud依赖管理 <dependencies> &l ...
- 01_微信小程序支付
[支付流程] 1.小程序内调用登录接口,获取到用户的openid(我们这一步骤让前端去获取) 2.服务端代码这边生成订单 3.服务端调用支付统一下单的api 4.服务端将再次签名,返回5个参数(前端得 ...
- vs2010开发activex(MFC)控件/ie插件(一)
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50782904 vs2010开发activex(MFC)控件: 第一步:生成ac ...
- Android 单元测试Junit
- 分分钟搞懂 HD 钱包
转自:http://blog.sina.com.cn/s/blog_12ce70a430102v8c7.html 第一次看到 HD 这个词被用在比特币钱包中时,很容易就把它理解成硬件(Hardware ...
- 记开发个人图书收藏清单小程序开发(四)DB设计
早上起来,又改动了一下: 主要是,将非常用信息全部拆分出来,让Table尽量的小,小到不能继续拆分了,这样区分DB逻辑.增加了FileBank存储Book的封面图片,统一管理图片资源. 新添加的Typ ...
- MySQL数据操作(借鉴)
/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld ...