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 事务管理的本质,并灵活运用之. 先决条件 本 ...
随机推荐
- MSSqlServer 数据库降级及数据转移
--MSSqlServer数据库降级及数据转移--MS SQL SERVER高版本数据库(Database_A)恢复数据到低版本数据库(Database_B)中--1.数据库结构对象(包含表.视图.函 ...
- pdf OCR
pdf转word等其他可排版编辑格式的软件: ABBYY Finereader: 老牌OCR软件了,支持各种文字.图片.表格的识别,效率比较高,中文的识别效果也很好,公式的转换效率较差. InftyR ...
- 一:Nginx知识整理
Nginx与服务器集群 一:集群 1.什么是集群 集 合在一起 放在一起 群 一堆 很多 服务器架构集群:多台服务器组成的响应大并发,高数据量访问的架构体系. 分布式服务器架构: 特点: 1)成本高 ...
- spring和springboot常用注解总结
@ConfigurationProperties 可以非常方便的把资源文件中的内容绑定到对象上 @Value("${app.name}") 注入简单值 @Import 通过导入 ...
- 设计模式入门,装饰着模式,c++代码实现
// test03.cpp : Defines the entry point for the console application.////设计模式第3章 装饰者模式#include " ...
- Android - 内存泄漏的情况以及解决方法
[译]Android内存泄漏的八种可能(上) Android防止内存泄漏的八种方法(下). Static Activities 在类中定义了静态Activity变量,把当前运行的Activity实例赋 ...
- Java函数调用总结
//思考:1.方法能不能写方法 2.为什么不能写 public static void main(String[] args) { public static void name(){}; } 方法中 ...
- 车厢调度(train.cpp)
车厢调度(train.cpp) [问题描述] 有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n<=1000) ...
- git之删除过滤
把不想提交的内容删除过滤 git rm --cached **/** -f
- webpack 启动 vue
右击 package.json 单击show npm Scripts