Spring 事务管理(编程式事务实现)

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 事务管理编程式事务的实现,讲的不都清楚的,或者将错的,欢迎在评论区评论,点赞关注哈!

发布了24 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44519467/article/details/103750739