我确实开始学习工具包spring jdbc
。阅读一些关于事务的文档春天结束了他们的模板。然而,有些普通的事情我不太清楚。
1) 如果我们有Spring Data
,为什么总是只听到Spring JDBC
Spring框架有一些项目,如Spring MVC
, Spring Security
等。
首先我试图在Spring的主页上找到Spring JDBC
,但没有找到它。而不是我发现Spring Data
项目。经过一番研究,我发现Spring Data
在JDBC Extensions
子项目中使用了Spring JDBC
,最后有一些oracle
的具体操作,这让我很感兴趣。我意识到什么没有看到或听到任何使用或看到参考教程Spring Data
。真的很糟糕吗?
2) 我应该每次都创建新的JdbcTemplate实例吗
接下来是JdbcTemplate
,有用的模板方法。所有文档都充满了像
public class JdbcCorporateEventDao implements CorporateEventDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// JDBC-backed implementations of the methods on the CorporateEventDao follow...
}
他们也写在docs
JdbcTemplate类的实例在配置后是线程安全的
这是误导。为什么在setDataSource
方法中,如果他们可以把dataSource
放在已经创建的实例中,他们会创建新的实例?
3) 我们如何使用TransactionTemplate
来编写复杂的客户端逻辑?TransactionTemplate
与TransactionStatus
一起工作的另一个模板。据我所知,它可以帮助我管理我的事务但是有多大帮助?在TransactionTemplate
的execute
方法的开头,我们有transactionManager.getTransaction(this)
。在execute
方法的末尾,我们有this.transactionManager.commit(status)
行。因此,我的理解是,我在doInTransaction
方法中放置的所有内容将在单个事务中执行。但是如何在其他方法中执行具有相同事务的其他DAO
呢?它限制了编写具有复杂逻辑的客户机。我的意思是所有的逻辑都必须在一个方法中?我认为这不是真的。
我指的是复杂的逻辑。例如,我有自己的模板方法。
/*abstract class definition*/
public final void execute(){
onPreExec();
exec();
onPostExec();
}
abstract void exec(); //client execute few DAOs methods
public void onPreExec(){}
public void onPostExec(){} //commit or rollback transaction in another method
/*other class members*/
4) 是线程安全的使用"天车"、"TD"、"t"?
我开始进一步调查this.transactionManager.commit(status)
的背后是什么。这对我来说代表PlatformTransactionManager
和TransactionDefinition
。我如何理解,
/*abstract class definition*/
protected PlatformTransactionManager ptm;
protected TransactionDefinition td;
protected TransactionStatus ts;//TS with PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED
public final void execute(){
onPreExec();
exec();
onPostExec();
}
abstract void exec(); //client execute few DAOs methods
public void onPreExec(){//start transaction
ts=ptm.getTransaction(td);
}
public void onPostExec(){//end transaction
if (exec.wasCompletedSuccessfully()){
dao.markJobCompleted(); //do some for fix execution completeness
ptm.commit(ts);
} else {ptm.rollback(ts);}
}
/*other class members*/
至少在某些情况下,这看起来比transactionTemplate.execute()
方法更方便。虽然仅仅分为几个部分transactionTemplate.execute()
方法。
但仍然不清楚它是线程安全的吗?也就是说,我可以使用它,并确保jdbcTemplate
的JDBC
和callableStatment.execute()
方法的所有内部调用都将引用此事务,并且仅引用此事务。并且不会在其他线程中看到另一个事务。
关于JdbcTemplate:
jdbc模板是spring提供的与数据库交互的模板。您可以使用简单的JDBC代码来连接数据库并执行操作,但在这种情况下,您必须处理与连接关闭等相关的问题。Spring jdbc模板处理所有这些问题,最终用户只需要使用这些api并执行操作。
关于新的JDBCTemplate(),我认为这只是一个例子,即你不需要在每个类中创建jdbc模板对象。您可以创建它的bean,如数据源或为此创建BaseDAO类。
还有一件事,请浏览Spring Data Support视频。
您需要认识到Spring已经存在11年了。这是进化而来的。有很多项目一开始是作为Spring的附属项目,后来被纳入了Spring。自从Rod Johnson第一次写Spring JDBC以来,它就一直存在。Spring Data是最近才发展起来的