Spring-day3-JBDC和aop中的事务
一、Spring整合JDBC。
1.Spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术。即JDBCTemplate模板对象。用来操作jdbc。与JbUtils中的QueryRunner类相似。需要导入Spring基础包之外,还需要c3p0连接池的包,mysql驱动的包,以及Spring,jdbc的包
package cn.guanyq.JdbcTemplate; import java.beans.PropertyVetoException; import org.junit.Test; import org.springframework.jdbc.core.JdbcTemplate; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JdbcTempolateDemo { @Test public void test() throws PropertyVetoException{ ComboPooledDataSource datasource = new ComboPooledDataSource(); datasource.setDriverClass("com.mysql.jdbc.Driver"); datasource.setJdbcUrl("jdbc:mysql:///test"); datasource.setUser("root"); datasource.setPassword("123"); //创建对象模板。 JdbcTemplate jdbctempolate = new JdbcTemplate(datasource); String sql="insert into user values(null,'tom')"; jdbctempolate.update(sql); } }
2.Spring容器中整合Jdbc
依赖性关系。首先需要将连接池交给Spring容器管理,也就是注册ComboPooledDataSource对象。并注入相关需要的参数,在这里可以用读取外部properties配置文件的方式。然后注入所需要的四个参数。代码如下:
<context:property-placeholder location="classpasth:src下路径"/>
上面代码为读取properties的配置文件。在这里配置文件可以是:
jdbc.ClassDriver=com.mysql.jdbc.Driver jdbc.Url=jdbc:mysql:///test jdbc.user=root jdbc.password=123
注册连接池对象
<bean name="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="classDriver" value="${jdbc.ClassDriver}">
</property> <property name="url" value="${jdbc.Url}">
</property> <property name="password" value="${jdbc.password}">
</property> <property name="user" value="${jdbc.user}">
</property> </bean>
注意要加前缀,以免和关键字重复。
连接池对象注册之后就需要注册JdbcTempolate,对象。根据依赖性关系,需要给这个模板对象注入datasource对象
然后注册dao层对象。类中的jbdcTempolate需要提供set方法。来注入JdbcTempolate对象。
<!-- 读取properties配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 首先 需要将连接池,也就是datasource放入Spring容器 -->
<bean name="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 创建datasource时需要的配置配置注入 -->
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 将jdbcTempolate对象放入连接池 -->
<bean name="jdbctempolate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource"></property>
</bean>
<!--将Userservice对象放入Spring容器当中 -->
<bean name="userservice" class="cn.guanyq.service.UserServiceImpl">
<property name="jdbctempolate" ref="jdbctempolate"></property>
</bean>
二、Spring中的aop事务。
1.代码准备,经典转账操作。
1)编码式管理事务。
public void doTransaction(final Integer from, final Integer to, final Double money) { //调用excute方法来管理事务。 transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus arg0) { //减钱 。 accountDao.decreaseMoney(from, money); //出现异常 //int i=1/0; //加钱 accountDao.increaseMoney(to, money); } });
<bean name="accountService" class="cn.guanyq.aop.AccountServiceImpl"> <property name="accountDao" ref="accountDao"></property> <!-- <property name="transactionTemplate" ref="transactionTemplate"></property> --> </bean> <!-- 编码式事务管理:将事务核心管理器配置到容器 依赖于datasource,名字必须为transactionManager--> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"></property> </bean> <!-- 事务管理模板配置到容器 依赖于事务核心管理器--> <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"></property> </bean>
2)xml配置
需要再导入tx约束。即事务约束。
3)
<!-- 配置通知 依赖于事务核心管理器。transactionManager -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="do*" isolation="REPEATABLE_READ" read-only="false" propagation="REQUIRED"/>
<tx:method name="save*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="delete*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="delete*" isolation="DEFAULT" read-only="false" propagation="REQUIRED"/>
<tx:method name="select*" isolation="DEFAULT" read-only="true" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 将通知织入 -->
<aop:config>
<aop:pointcut expression="execution(* cn.guanyq.aop.*ServiceImpl.*(..))" id="pc"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>

浙公网安备 33010602011771号