Spring的事务管理:概述不多讲,这里直接上案例,主要是针对于编程式的事务案例
假设现在我们有一个数据库test,里面有一张表books
CREATE TABLE
books
(
isbn
varchar(26) NOT NULL,
name
varchar(80) NOT NULL,
price
float(10,2) NOT NULL,
pubdate
date DEFAULT NULL
);
接下来创建三个类,Book实体类,TemplateUtils工具类,ProTrans类
/**
* 书籍实体类
*/
public class Book {
private String isbn;
private String bookname;
private float bookprice;
private Date bookdate;
public Book() {
}
public Book(String isbn, String bookname, float bookprice, Date bookdate) {
super();
this.isbn = isbn;
this.bookname= bookname;
this.bookprice= bookprice;
this.bookdate= bookdate;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getBookName() {
return bookname;
}
public void setBookName(String bookname) {
this.bookname= bookname;
}
public float getBookPrice() {
return bookprice;
}
public void setBookPrice(float bookprice) {
this.bookprice= bookprice;
}
public Date getBookdate() {
return bookdate;
}
public void setBookdate(Date bookdate) {
this.bookdate = bookdate;
}
@Override
public String toString() {
return "Book{" +
"isbn='" + isbn + '\'' +
", bookname='" + bookname+ '\'' +
", bookprice=" + bookprice+
", bookdate=" + bookdate+
'}';
}
}
/**
* Spring数据库操作工具类
*/
public class TemplateUtils {
private final static String nDriver = "com.mysql.cj.jdbc.Driver" ;
private final static String nUrl = "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC" ;
private final static String nUser = "root";
private final static String nPwd = "010126";
private static BasicDataSource dataSource;
//静态初识:创建连接数据源
static {
//创建DBCP简单数据源并初始化相关数据源属性
dataSource = new BasicDataSource() ;
dataSource.setDriverClassName(nDriver);
dataSource.setUrl(nUrl);
dataSource.setUsername(nUser);
dataSource.setPassword(nPwd);
//指定数据库连接池初始连接数
dataSource.setInitialSize(10);
//设定同时向数据库申请的最大连接数
dataSource.setMaxTotal(50);
//设置连接池中保持的最少连接数量
dataSource.setMinIdle(5);
}
public static TransactionTemplate getTransactionTemplate() {
PlatformTransactionManager platformTransactionManager = new DataSourceTransactionManager(
dataSource);
return new TransactionTemplate(platformTransactionManager );
}
public static JdbcTemplate getJdbcTemplate() {
return new JdbcTemplate(dataSource);
}
public static SimpleJdbcInsert getSimpleJdbcInsert () {
return new SimpleJdbcInsert(dataSource);
}
public static DataSourceTransactionManager getDataSourceTransactionManager(){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
// 设置数据源:此事务数据源须和正式事务管理器的数据源一致
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
/**
* Spring的两种编程模式演示
* 模板事务,平台事务
*/
public class ProTransExample {
//编程式事务管理:事务管理器PlatformTransactionManager方式实现
public void updateBookByIsbn(Book book) {
//第一步:获取JDBC事务管理器,TemplateUtils.getDataSourceTransactionManager(),工具类中实现
DataSourceTransactionManager dataSourceTransactionManager = TemplateUtils.getDataSourceTransactionManager();
// 第二步:创建事务管理器属性对象,设置传播行为属性
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
defaultTransactionDefinition .setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
// 第三步:获得事务状态对象
TransactionStatus transactionStatus = dataSourceTransactionManager .getTransaction(defaultTransactionDefinition );
// 第四步:基于当前事务管理器,获取数据源,创建操作数据库的JDBC模板对象
JdbcTemplate jt = new JdbcTemplate(dataSourceTransactionManager .getDataSource());
try {//第五步:业务操作
jt.update("update books set bookprice="+book.getBookPrice()+",name='"+book.getBookName()
+"' where isbn='"+book.getIsbn()+"' ");
//第六步:提交事务
dataSourceTransactionManager .commit(transactionStatus );
} catch (Exception e) {
dataSourceTransactionManager .rollback(transactionStatus );
e.printStackTrace();
}
}
// 事务模板:第二种事务编程模式
//没有返回值的操作
public void addBook(Book book) {
// 获取事务模板对象
TransactionTemplate transactionTemplate = TemplateUtils.getTransactionTemplate();
transactionTemplate .execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus ) {
try {
// 简单模板化新增数据
SimpleJdbcInsert simpleJdbcInsert = TemplateUtils.getSimpleJdbcTemplate();
simpleJdbcInsert .withTableName("books").usingColumns("isbn", "bookname", "bookprice", "bookdate");
Map<String, Object> map= new HashMap<String, Object>();
map.put("isbn", book.getIsbn());
map.put("bookname", book.getName());
map.put("bookprice", book.getPrice());
map.put("bookdate", book.getPubdate());
simpleJdbcInsert .execute(parameters);
System.out.println("新增数据");
} catch (Exception e) {
transactionStatus .setRollbackOnly();
e.printStackTrace();
}
}
});
}
//有返回值的操作
public Book findBookByIsbn(String isbn) {
TransactionTemplate transactionTemplate = TemplateUtils.getTransactionTemplate();
Book book = null;
List<Map<String, Object>> books = (List<Map<String, Object>>) transactionTemplate .execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus arg0) {
JdbcTemplate jdbcTemplate = TemplateUtils.getJdbcTemplate();
return jdbcTemplate
.queryForList("select isbn,bookname,bookprice,bookdate from books where isbn ='" + isbn + "'");
}
});
// 获取数据
if (books != null) {
//拿到第一条数据
Map<String, Object> m = (Map) books.get(0);
book = new Book();
book.setIsbn(m.get("isbn").toString());
book.setName(m.get("bookname").toString());
book.setPrice((Float) m.get("bookprice"));
book.setPubdate((Date) m.get("bookdate"));
}
return book;
}
public static void main(String[] args) {
//调用方法即可
}
}
以上便是Spring 事务管理编程式事务的实现,讲的不都清楚的,或者将错的,欢迎在评论区评论,点赞关注哈!