spring資料來源的注入、JdbcTemplate管理、程式設計式的事務管理DataSourceTransactionManager
阿新 • • 發佈:2019-01-06
對於不同的資料庫連線來源需求,spring提供了javax.sql.DataSource注入,更換資料來源只要在Bean定義中修改配置,而不用修 改任何一行程式碼。
應不同的系統,可能使用不同的資料來源,例如:jdbc、連線池、或是JNDI等等,資料變更是底層的行為,不應影響到上層的業務邏輯。
例子:
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/demo</value>
</property>
<property name="username">
<value>caterpillar</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>
<bean id="userDao" class="onlyfun.caterpillar.UserDao">
<property name="dataSource">
<ref bean="datasource"/>
</property>
</bean>
</beans>
其中"driverClassName"、"url"、"username"、"password"四個屬性分別用來設定JDBC驅動程式類別、資料庫 URL協定、使用者名稱、密碼,而DriverManagerDataSource繼承了javax.sql.DataSource.
注意:
(1)、該例子使用的是簡單的jdbc連線,如果應用到工程,必須使用連線池,這時只要更換class屬性為 class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
(2)、如果採用的是JNDI連線,可以這麼設定:
<bean id="dataSource"
class="org.springframework.indi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/demo</value>
</property>
</bean>
Spring學習筆記JDBC模版管理
對於Spring應用,Spring 提供了一個更好的資料持久化的框架,Spring讓持久層的類UserDao繼承 org.springframework.jdbc.core.JdbcTemplate這個封裝了jdbc操作的類,要建立JdbcTemplate的 例項,必須要有一個DataSource物件作為建構時的物件.
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
例子(1):-----取得模版
package onlyfun.caterpillar;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class UserDAO implements IUserDAO {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
return null;
}
}
例子(2):-----update操作(同樣的操作適用於update、insert、delete)
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate
.update(
"UPDATE user SET age = ? WHERE id = ?",
new PreparedStatementSetter() {
public void setValues(PreparedStatementSetter ps)
throws SQLException {
ps.setInt(1, 18);
ps.setString(2, "erica");
}
}
);
第一個用於建立PreparedStatement的SQL。第二個引數是為PreparedStatement設定引數的
PreparedStatementSetter
注意:我們還可以通過JdbcTemplate.call方法呼叫儲存過程.
程式設計式的事務管理:我們可以使用 org.springframework.jdbc.datasource.DataSourceTransactionManager(platformTransactionManager 的一個實現)作為我們的事務管理員,我們在Bean定義中配置,並將DataSource注入給它。
配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/TestDB</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="userDAO" class="onlyfun.caterpillar.UserDAO">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
</beans>
DAO操作類:
package onlyfun.caterpillar;
import javax.sql.DataSource;
import org.springframework.jdbc.core.*;
import org.springframework.transaction.*;
import org.springframework.transaction.support.*;
import org.springframework.dao.*;
public class UserDAO {
private DataSource dataSource;
private PlatformTransactionManager transactionManager;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void insertUser(User user) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("INSERT INTO USER VALUES('Spring008', 'caterpillar', 'M', 29)");
jdbcTemplate.update("INSERT INTO USER VALUES('Spring009', 'momor', 'F', 26)");
jdbcTemplate.update("INSERT INTO USER VALUES('Spring010, 'beckyday', 'F', 35)");
} catch (DataAccessException ex) {
transactionManager.rollback(status); // 也可以執行status.setRollbackOnly();
throw ex;
}
transactionManager.commit(status);
}
}
應不同的系統,可能使用不同的資料來源,例如:jdbc、連線池、或是JNDI等等,資料變更是底層的行為,不應影響到上層的業務邏輯。
例子:
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/demo</value>
</property>
<property name="username">
<value>caterpillar</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>
<bean id="userDao" class="onlyfun.caterpillar.UserDao">
<property name="dataSource">
<ref bean="datasource"/>
</property>
</bean>
</beans>
其中"driverClassName"、"url"、"username"、"password"四個屬性分別用來設定JDBC驅動程式類別、資料庫 URL協定、使用者名稱、密碼,而DriverManagerDataSource繼承了javax.sql.DataSource.
注意:
(1)、該例子使用的是簡單的jdbc連線,如果應用到工程,必須使用連線池,這時只要更換class屬性為 class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
(2)、如果採用的是JNDI連線,可以這麼設定:
<bean id="dataSource"
class="org.springframework.indi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/demo</value>
</property>
</bean>
Spring學習筆記JDBC模版管理
對於Spring應用,Spring 提供了一個更好的資料持久化的框架,Spring讓持久層的類UserDao繼承 org.springframework.jdbc.core.JdbcTemplate這個封裝了jdbc操作的類,要建立JdbcTemplate的 例項,必須要有一個DataSource物件作為建構時的物件.
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
例子(1):-----取得模版
package onlyfun.caterpillar;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class UserDAO implements IUserDAO {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
return null;
}
}
例子(2):-----update操作(同樣的操作適用於update、insert、delete)
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate
.update(
"UPDATE user SET age = ? WHERE id = ?",
new PreparedStatementSetter() {
public void setValues(PreparedStatementSetter ps)
throws SQLException {
ps.setInt(1, 18);
ps.setString(2, "erica");
}
}
);
第一個用於建立PreparedStatement的SQL。第二個引數是為PreparedStatement設定引數的
PreparedStatementSetter
注意:我們還可以通過JdbcTemplate.call方法呼叫儲存過程.
程式設計式的事務管理:我們可以使用 org.springframework.jdbc.datasource.DataSourceTransactionManager(platformTransactionManager 的一個實現)作為我們的事務管理員,我們在Bean定義中配置,並將DataSource注入給它。
配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/TestDB</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="userDAO" class="onlyfun.caterpillar.UserDAO">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
</beans>
DAO操作類:
package onlyfun.caterpillar;
import javax.sql.DataSource;
import org.springframework.jdbc.core.*;
import org.springframework.transaction.*;
import org.springframework.transaction.support.*;
import org.springframework.dao.*;
public class UserDAO {
private DataSource dataSource;
private PlatformTransactionManager transactionManager;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void insertUser(User user) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("INSERT INTO USER VALUES('Spring008', 'caterpillar', 'M', 29)");
jdbcTemplate.update("INSERT INTO USER VALUES('Spring009', 'momor', 'F', 26)");
jdbcTemplate.update("INSERT INTO USER VALUES('Spring010, 'beckyday', 'F', 35)");
} catch (DataAccessException ex) {
transactionManager.rollback(status); // 也可以執行status.setRollbackOnly();
throw ex;
}
transactionManager.commit(status);
}
}