一步一步深入spring(7)-- 整合spring和JDBC的环境

1.配置数据源

(1).添加支持数据源的jar包commons-dbcp.jar 、commons-pool.jar
当然也要添加其他的spring用到的jar以及这里用到的数据库mysql的jar  mysql-connector-java-5.0.7-bin.jar
(2).在bean.xml中添加配置文件代码
 1     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 2         <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
 3         <property name="url" value="jdbc:mysql://127.0.0.1:3306/yangyang"/>
 4         <property name="username" value="root"/>
 5         <property name="password" value="123456"/>
 6          连接池启动时的初始值
 7          <property name="initialSize" value="1"/>
 8          连接池的最大值
 9          <property name="maxActive" value="500"/>
10          最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止
11          <property name="maxIdle" value="2"/>
12           最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
13          <property name="minIdle" value="1"/>
14      </bean>
2.配置事务
配置事务时,需要在命名空间中添加引用事务声明的tx命名空间,配置事务有两种方式,一种是基于注解,一种是基于xml方式
这里先来实现基于注解的方式。
 配置spring对事务的支持:
1     <!-- spring的事务管理器 -->
2     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
3          <property name="dataSource" ref="dataSource"/>
4     </bean>
5     
6     <!-- 采用@Transactional使用注解方式处理事务 -->
7     <tx:annotation-driven transaction-manager="txManager"/>

 3.编写业务bean,这里只给出实现部分的代码:

 1 package com.yangyang.service.impl;
 2 
 3 import java.util.List;
 4 
 5 import javax.sql.DataSource;
 6 
 7 import org.springframework.jdbc.core.JdbcTemplate;
 8 import org.springframework.transaction.annotation.Transactional;
 9 
10 import com.yangyang.model.Person;
11 import com.yangyang.service.PersonService;
12 
13 //受spring的事务管理
14 @Transactional
15 public class PersonServiceImpl implements PersonService{
16 
17     private JdbcTemplate jdbcTemplate;//通过jdbcTemplate来操作数据源
18     public void setDataSource(DataSource dataSource) {
19         this.jdbcTemplate = new JdbcTemplate(dataSource);
20     }
21 
22     @Override
23     public void save(Person person) {
24         jdbcTemplate.update("insert into person(name) values(?)", new Object[]{person.getName()}, 
25                 new int[]{java.sql.Types.VARCHAR});
26     }
27 
28     @Override
29     public void update(Person person) {
30         jdbcTemplate.update("update person set name=? where id=?",new Object[]{person.getName(),person.getId()}, 
31                 new int[]{java.sql.Types.VARCHAR,java.sql.Types.INTEGER});
32     }
33 
34     @Override
35     public void delete(Integer personId) {
36         jdbcTemplate.update("delete from person where id=?",new Object[]{personId}, 
37                 new int[]{java.sql.Types.INTEGER});
38     }
39 
40     @Override
41     public Person getPerson(Integer personId) {
42         return (Person)jdbcTemplate.queryForObject("select * from person where id=?", new Object[]{personId},new int[]{java.sql.Types.INTEGER}
43         ,new PersonRowMapper());
44     }
45 
46     @Override
47     public List<Person> getPersons() {
48         return (List<Person>)jdbcTemplate.query("select * from person",new PersonRowMapper());
49     }
50 
51 }

对查询支持的RowMapper 类

 1 package com.yangyang.service.impl;
 2 
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 
 6 import org.springframework.jdbc.core.RowMapper;
 7 
 8 import com.yangyang.model.Person;
 9 
10 public class PersonRowMapper implements RowMapper{
11 
12     @Override
13     public Object mapRow(ResultSet rs, int index) throws SQLException {
14         Person person=new Person();
15         person.setName(rs.getString("name"));
16         person.setId(rs.getInt("id"));
17         return person;
18     }
19 
20 }

当然我们也需要将业务bean配置到spring容器中,完整的配置文件如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xmlns:context="http://www.springframework.org/schema/context"
 5         xmlns:aop="http://www.springframework.org/schema/aop"
 6         xmlns:tx="http://www.springframework.org/schema/tx"    
 7         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 8             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
 9             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
10             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">     
11   
12     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
13         <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
14         <property name="url" value="jdbc:mysql://127.0.0.1:3306/yangyang"/>
15         <property name="username" value="root"/>
16         <property name="password" value="123456"/>
17          连接池启动时的初始值
18          <property name="initialSize" value="1"/>
19          连接池的最大值
20          <property name="maxActive" value="500"/>
21          最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止
22          <property name="maxIdle" value="2"/>
23           最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
24          <property name="minIdle" value="1"/>
25      </bean>
26      
27     <!-- spring的事务管理器 -->
28     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
29          <property name="dataSource" ref="dataSource"/>
30     </bean>
31     
32     <!-- 采用@Transactional使用注解方式处理事务 -->
33     <tx:annotation-driven transaction-manager="txManager"/>
34 
35     <bean id="personService" class="com.yangyang.service.impl.PersonServiceImpl">
36         <property name="dataSource" ref="dataSource"></property>
37     </bean>
38 </beans>

接下来编写单元测试来测试我们的类,这里省略了,可以看到配置成功。

当然我们会想把jdbc连接的部分以properties的形式抽出来,这样就有

driverClassName=org.gjt.mm.mysql.Driver
url=jdbc:mysql://127.0.0.1:3306/yangyang
username=root
password=123456
initialSize=1
maxActive=500
maxIdle=2
minIdle=1

然后在bean中改为:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xmlns:context="http://www.springframework.org/schema/context"
 5         xmlns:aop="http://www.springframework.org/schema/aop"
 6         xmlns:tx="http://www.springframework.org/schema/tx"    
 7         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 8             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
 9             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
10             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
11  <!-- 加上aop的命名空间以及DTD验证 -->
12      
13      <!-- spring对外部文件的支持 -->
14      <context:property-placeholder location="classpath:resources/jdbc.properties"/>
15      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
16         <property name="driverClassName" value="${driverClassName}"/>
17         <property name="url" value="${url}"/>
18         <property name="username" value="${username}"/>
19         <property name="password" value="${password}"/>
20          <!-- 连接池启动时的初始值 -->
21          <property name="initialSize" value="${initialSize}"/>
22          <!-- 连接池的最大值 -->
23          <property name="maxActive" value="${maxActive}"/>
24          <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
25          <property name="maxIdle" value="${maxIdle}"/>
26          <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
27          <property name="minIdle" value="${minIdle}"/>
28      </bean>
29      
30     <!-- spring的事务管理器 -->
31     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
32          <property name="dataSource" ref="dataSource"/>
33     </bean>
34     
35     <!-- 采用@Transactional使用注解方式处理事务 -->
36     <tx:annotation-driven transaction-manager="txManager"/>
37 
38     <bean id="personService" class="com.yangyang.service.impl.PersonServiceImpl">
39         <property name="dataSource" ref="dataSource"></property>
40     </bean>
41 </beans>

执行单元测试发现也是ok的

下面再来利用xml配置的方式来实现事务,在xml中配置如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xmlns:context="http://www.springframework.org/schema/context"
 5         xmlns:aop="http://www.springframework.org/schema/aop"
 6         xmlns:tx="http://www.springframework.org/schema/tx"    
 7         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 8             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
 9             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
10             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
11  <!-- 加上aop的命名空间以及DTD验证 -->
12      
13      <!-- spring对外部文件的支持 -->
14      <context:property-placeholder location="classpath:resources/jdbc.properties"/>
15      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
16         <property name="driverClassName" value="${driverClassName}"/>
17         <property name="url" value="${url}"/>
18         <property name="username" value="${username}"/>
19         <property name="password" value="${password}"/>
20          <!-- 连接池启动时的初始值 -->
21          <property name="initialSize" value="${initialSize}"/>
22          <!-- 连接池的最大值 -->
23          <property name="maxActive" value="${maxActive}"/>
24          <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
25          <property name="maxIdle" value="${maxIdle}"/>
26          <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
27          <property name="minIdle" value="${minIdle}"/>
28      </bean>
29      
30     <!-- spring的事务管理器 -->
31     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
32          <property name="dataSource" ref="dataSource"/>
33     </bean>
34 
35     <!-- 使用配置的形式使用注解 -->
36     <aop:config>
37         <aop:pointcut  id="transactionPointcut" expression="exception(* com.yangyang.service..*.*(..))"/>
38         <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
39     </aop:config>
40     
41     <tx:advice id="txAdvice" transaction-manager="txManager">
42         <tx:attributes>
43                 <!--get开头的方法不添加事务  -->
44             <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
45             <tx:method name="*"/>
46         </tx:attributes>
47     </tx:advice>
48     
49     <bean id="personService" class="com.yangyang.service.impl.PersonServiceImpl">
50         <property name="dataSource" ref="dataSource"></property>
51     </bean>
52 </beans>

这样,我们不需要在业务类中加入任何注解,通过配置也能实现事务鼓管理

原文地址:https://www.cnblogs.com/shunyang/p/3311098.html