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 事務管理編程式事務的實現,講的不都清楚的,或者將錯的,歡迎在評論區評論,點贊關注哈!