转载:原文:
dlgdlg_2008
对于不同的数据库连接来源需求,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); } } |