Spring學習筆記(六)
1、SpringJDBC
1.1、Spring在jdbc中的作用
1.2、SpringJDBC實踐
1、添加jar包支持類
spring-jdbc-4.3.14.RELEASE.jar、spring-tx-4.3.14.RELEASE.jar
package cn.org.kingdom.dao.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import cn.org.kingdom.dao.DeptDao; import cn.org.kingdom.vo.Dept; @Repository public class DeptDaoImpl implements DeptDao { @Autowired private JdbcTemplate jt ; public JdbcTemplate getJt() { return jt; } public void setJt(JdbcTemplate jt) { this.jt = jt; } @Override public int addUser(Dept vo) throws Exception { return jt.update("insert into dept(deptno,dname,loc) values(?,?,?)", vo.getDeptno(),vo.getDname(),vo.getLoc()); } }
2、xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <context:property-placeholder location="classpath:db.properties"/> <!-- 掃包 --> <context:component-scan base-package="cn.org.kingdom"/> <bean id="ds" class = "org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </bean> <bean id = "jt" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="ds"/> </bean> </beans>
1.3、事務處理
1.3.1、spring對事務的支持
Spring對事務有很好的支持.提供了事務管理器. PlatformTransactionManager:平臺事務管理器(頂層)
配置事務管理交給Spring來做
<!—①配置事務管理器(AOP:做什麽) --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/> <!-- 2.配置增強(AOP:什麽時機:本質是一個環繞增強) --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="trans"/> </tx:attributes> </tx:advice> <!-- 3.配置增強的地點(AOP:在哪裏增強) --> <aop:config> <aop:pointcut expression="execution(* cn.org.kingdom.service.*Service.*(..))" id="txPoint"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/> </aop:config>
1.3.2、spring事務的屬性說明
1、name:匹配到的方法模式(支持統配符);
2、read-only:查詢的時候,設置為true,其他設置為false (也可以默認不設置)
3、isolation:代表數據庫事務隔離級別(默認不用配置此項)DEFAULT:讓spring使用數據庫默認的事務隔離級別;其他:spring模擬;
4、no-rollback-for: 如果遇到的異常是匹配的異常類型,就不回滾事務;(記錄日誌等)
5、rollback-for:如果遇到的異常是指定匹配的異常類型,才回滾事務; 註意:Spring中默認只能回滾RuntimeException及其子類異常類型.(Exception.Throwabale就不能回滾) 、要求我們:在Service層中所有的異常,使用RuntimeException類型、若原始異常不是RuntimeException,重新包裝成RuntimeException.
6、propagation:事務的傳播方式(當一個方法已經在一個開啟的事務當中了,應該怎麽處理自身的事務)
? ①REQUIRED(默認的傳播屬性):如果當前方法運行在一個沒有事務環境的情況下,則開啟一個新的事務,如果當前方法運行在一個已經開啟了的事務裏面,把自己加入到開啟的那個事務中 (一般默認選擇此項)
? ②REQUIRES_NEW:不管當前方法是否運行在一個事務空間之內,都要開啟自己的事務保存數據建議使用這個
.(了解)
通用的事務管理器
<tx:advice id="crudAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRES_NEW" />
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="del*" />
<tx:method name="get*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
//此配置必須必須放在最後
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
1.3.3、事務的註解配置
@Service("accountService")
@Transactional:該類中所有方法都使用默認的屬性增強
public class AccountServiceImpl implements IAccountService {
@Autowired
@Qualifier("accountDAO")
private IAccountDAO dao;
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void save(){}
@Transactional(readOnly=true)
public void get(){}
public void trans(Long outId, Long inId, Integer money) {
System.out.println("11");
dao.transIn(inId, money);
System.out.println(1/0);//模擬停電
dao.transOut(outId, money);
}
}
@Repository("accountDAO")
public class AccountDAOImpl implements IAccountDAO {
private JdbcTemplate jdbcTemplate;
@Resource(name="dataSource")
public void setDataSource(DataSource ds){
jdbcTemplate = new JdbcTemplate(ds);
}
}
Spring學習筆記(六)