spring数据源的注入、JdbcTemplate管理、编程式的事务管理DataSourceTransactionManager
2010-06-14 22:00
对于不同的数据库连接来源需求,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); } } |
相关推荐
Spring框架支持两种类型的事务管理:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编码的方式来管理事务,适用于需要细粒度控制的情况。 - **声明式事务管理**:通过配置来管理事务,更易于使用且...
接下来,配置数据源和JdbcTemplate。在Spring的配置文件(如`applicationContext.xml`)中,可以这样设置: ```xml <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> ...
### Spring JdbcTemplate与声明式事务知识点详解 #### JdbcTemplate基本使用概述 JdbcTemplate是Spring框架提供的用于简化JDBC API操作的对象。它通过提供一个高级抽象层来减少编码工作量,并帮助开发者避免处理...
通过自动配置、内嵌Web服务器、JdbcTemplate的简单操作、声明式事务管理、拦截器以及数据源的配置,开发者可以更专注于业务代码的编写,提高开发效率和代码质量。同时,Spring Boot的灵活性使得它可以适应各种复杂的...
1. **Spring数据源类型** - **BasicDataSource**: Spring内置的`org.springframework.jdbc.datasource.BasicDataSource`是最常用的数据源实现,它基于Apache Commons DBCP库,提供连接池功能。 - **...
4. `spring-tx-5.0.0.RELEASE.jar`:提供了事务管理功能,可以配合JDBCTemplate进行事务的声明式或编程式管理。 5. `commons-logging-1.2.jar`:Apache Commons Logging库,是Spring的日志适配器,允许我们灵活地...
当然,实际项目中可能需要使用更复杂的数据源配置,如DataSourceTransactionManager和PlatformTransactionManager来处理事务。 接下来,我们将在Spring MVC控制器类中使用JdbcTemplate。Spring MVC通过`@Autowired`...
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,而Spring则是一个强大的企业级应用框架,提供了AOP(面向切面编程)和依赖注入等功能,使得多数据源的管理变得更为便捷。 在实际开发中,...
Spring提供了PlatformTransactionManager接口,如DataSourceTransactionManager,用于管理不同数据源的事务。通常需要为每个数据源配置一个事务管理器,并确保在事务管理策略中正确地指定使用哪个数据源。 3. **...
4. **事务管理**:Spring 提供了声明式事务管理,可以将事务管理逻辑从业务代码中解耦。在配置文件中启用事务管理器,并指定需要进行事务控制的类或方法。 ```xml <bean id="transactionManager" class="org....
总结起来,Spring通过JdbcTemplate简化了JDBC操作,提供了一套强大的事务管理机制,包括声明式和编程式事务管理,使得开发者可以专注于业务逻辑,而不是底层的数据库操作和事务控制。在实际项目中,结合Spring的IoC...
在Java企业级应用中,数据源...4. **事务管理**:如果使用了Spring的声明式事务管理,还需要确保事务配置正确指向这个数据源。例如,使用`<tx:annotation-driven>`标签时,需要指定`transactionManager`。 ```xml ...
在Spring 1.2框架中,操作多个数据源是...当涉及到事务管理时,确保使用`PlatformTransactionManager`的子类如`DataSourceTransactionManager`,并将其与动态数据源配合使用。你需要配置一个事务管理器,如: ```xml ...
2. **配置事务管理器**:对于每个数据源,我们需要配置相应的`PlatformTransactionManager`。Spring提供了`DataSourceTransactionManager`,我们可以根据数据源bean的名字来配置。 ```java @Bean(name = ...
例如,对于基于JDBC的事务管理,我们会使用`<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">`,并将其与数据源关联。 2. **定义事务传播行为**: 事务...
在Spring中,`PlatformTransactionManager`是所有事务管理器的接口,如`DataSourceTransactionManager`就是针对数据源的事务管理器。`@Transactional`注解用于标记需要进行事务管理的方法,其包含多个属性,如`...
同时,我们需要配置一个`PlatformTransactionManager`,如`DataSourceTransactionManager`,它是Spring处理事务的核心组件,负责与数据源交互来管理事务的生命周期。 在类或方法上添加`@Transactional`注解,可以...
我们可以选择`DataSourceTransactionManager`,为每个数据源创建一个事务管理器。然后,根据业务逻辑,决定使用哪个事务管理器进行事务操作。 5. **切换数据源**: 要在运行时动态切换数据源,我们可以创建一个`...
Spring Boot默认的`@Transactional`注解只能处理单个数据源的事务,对于跨数据源的事务,可能需要自定义事务管理策略。 6. **安全性考虑**:确保敏感的数据库连接信息,如用户名和密码,不要直接硬编码在配置文件中...
在上述代码中,`@Qualifier`用于指定要注入的数据源,而`@Transactional`注解的`value`属性则指定了使用的事务管理器。为了处理多个数据源的事务,我们需要为每个数据源创建一个`PlatformTransactionManager`的实例...