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 事务管理的本质,并灵活运用之. 先决条件 本 ...
随机推荐
- 那些年的Java学习笔记
1.1L是什么意思??L表示long ,long占用8个字节,表示范围:-9223372036854775808 ~ 9223372036854775807 1l就是1. 2.alt+shift+j ...
- C#,动态加载DLL,通过反射,调用参数,方法,窗体
.net中常会用到动态加载DLL,而DLL中可能包含各种参数.方法.窗体,如何来调用动态加载这些参数.方法.窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System. ...
- 【转】Dom节点操作常用方法
1.访问/获取节点 document.getElementById(id); //返回对拥有指定id的第一个对象进行访问 document.getElementsByName(name); //返回带 ...
- java IO流实现删除文件夹以及文件夹中的内容
这篇主要是对IO文件流对文件常用处理中的删除文件夹,平时我们直接删除文件夹既可以删除里面的全部内容. 但是java在实现删除时,只能是文件才会被删除. 所以这里需要定义一个方法,来递归调用方法(递归调 ...
- [转]webapi部署在IIS7.5报404的解决方案
1.iis 目录权限设置 2.转自:http://www.cnblogs.com/youlies/p/6042169.html 在web.config添加如下节点 <system.webServ ...
- Java基础知识错误分析
答案:A,C 解析: 题目2: 答案:B 解析: 题目3: 答案:A 解析: 题目4: 答案:D 解析: 题目5: 答案:C 题目六: 答案:C 解析:
- Creator4.2建模心得与技巧1——树的建立与跟随摄像机旋转
Creator建模: 树一般在虚拟现实程序中都用面来实现,一种方法是通过两个面相互垂直成90度叠放在一起,另一种方法是让树面正对着视角一起旋转.这里主要说一下第二种方法. 主要思路:把树面一直正对着摄 ...
- 项目经验:GIS<MapWinGIS>建模第三天
记录下GIS工程进展
- 安装Chrome driver/ IE driver
2014-08-15 11:38 22100人阅读 评论(0) 收藏 举报 分类: python基础学习(97) >>>安装Chrome driver chrome driver ...
- SSIS ->> Environment Variables
SQL Server Integration Services(SSIS) 在2012版本引入了Environment Variables这个新特性.它允许我们为一个环境创建出一套变量用于为项目内的包 ...