Spring的配置文件
- <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"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd
- http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
- <context:component-scan base-package="action,biz,dao"/>
- </beans>
配置數據源
- <bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
- <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
- <property name="username" value="bam1"/>
- <property name="password" value="bam1"/>
- <!-- 連接池啓動時的初始值 -->
- <property name="initialSize"value="1"/>
- <!-- 連接池的最大值 -->
- <property name="maxActive"value="500"/>
- <!-- 最大空閒值.當經過一個高峯時間後,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle爲止 -->
- <property name="maxIdle"value="2"/>
- <!-- 最小空閒值.當空閒的連接數少於閥值時,連接池就會預申請一些連接,以避免洪峯來時再申請而造成的性能開銷 -->
- <property name="minIdle"value="1"/>
- </bean>
- Spring容器中給我們提供了專門針對JDBC操作的輔助類,需要使用注入的方式給JDBC輔助類注入數據源對象,在XML文件中進行添加如下代碼:
- <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
- <constructor-arg ref="dataSource"></constructor-arg>
- //注入數據源對象需要使用構造函數的方法注入,第三方類需要手動注入
- </bean>
實體類Person
- public class Person
- {
- private int personId;
- private String personName;
- }
DAO層數據操作類
- @Repository
- public class PersonDaoImpl implements PersonDao
- {
- @Resource(name="jdbc") //注入的第三方的bean需要指明name設置
- private JdbcTemplate jdbc;
- @Override
- public int add(Person per)
- { //update執行數據庫操作
- return jdbc.update("insert intoperson(pid,pname) values(?,?)",per.getPersonId(),per.getPersonName());
- }
- @Override
- public Person queryById(int id)
- { //queryForObject執行數據庫查詢操作查詢一個
- return jdbc.queryForObject("select* from person where pid=?",new Object[]{id}, new PersonRowMapper());
- }
- @Override
- public List<Person> queryAll()
- { //query查詢多個
- return jdbc.query("select* from person",new PersonRowMapper()); // PersonRowMapper爲RowMapper的實現類
- }
- }
實現RowMapper接口的實現類
- public class PersonRowMapper implementsRowMapper<Person>
- {
- @Override
- public Person mapRow(ResultSet set, int index) throws SQLException
- {
- return new Person(set.getInt("pid"),set.getString("pname"));
- }
- }
Spring容器獲取Bean的工具類編寫
- public class BeanUtil {
- private static AbstractApplicationContext app;
- static {
- app = new ClassPathXmlApplicationContext("beans.xml");
- }
- //使用工具類getBean方法返回需要獲取的bean對象,使用了泛型
- public static <T> T getBean(String name,Class<T> tClass) {
- return app.getBean(name, tClass);
- }
- }
Spring採用註解方式配置事務
Spring配置文件
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"ref="dataSource"/>
</bean>
<!– 採用@Transactional註解方式使用事務 -->
<tx:annotation-driven transaction-manager="txManager"/>
一般的話事務都是在action中添加,因爲在action中更會涉及到多個事務的操作,操作不同表,我們可以對整個action添加事務,也可以對具體方法添加事務,在爲方法添加了事務後,對業務操作類就不需要再添加事務了
比如在PersonAction中爲addPerson添加事務
- @Resource
- private PersonBiz personBiz; //注入依賴對象person的業務操作類
- //添加事物處理
- @Transactional //聲明事務處理
- public String addPerson()
- {
- return "ok";
- }
//爲addPerson聲明事務處理後,在方法體中如果有涉及到多個操作,在操作中發生異常操作失敗的時候,就會進行事務的回滾,回到事務處理的起始
@Transactional(類型=值)
事物傳播行爲介紹:
@Transactional(propagation=Propagation.REQUIRED)
如果有事務, 那麼加入事務, 沒有的話新建一個(默認情況下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不爲這個方法開啓事務
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
@Transactional(propagation=Propagation.MANDATORY)
必須在一個已有的事務中執行,否則拋出異常
@Transactional(propagation=Propagation.NEVER)
必須在一個沒有的事務中執行,否則拋出異常(與Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務.
事務傳播屬性NESTED
- public class PersonServiceBean implements PersonService {
- @Resource
- Private OtherService otherService ;
- @Transactional
- public void xxx(){
- stmt.executeUpdate("update person set name='888' whereid=1");
- otherService.update();//OtherService的update方法的事務傳播屬性爲NESTED
- stmt.executeUpdate("delete from person where id=9");
- }
- }
NESTED是一個比較特殊的屬性,可以理解爲事務的嵌套,就如上面的xxx方法是使用了事務的,也就是說一整個方法體屬於一個事務,但是因爲otherService.update被nested屬性修飾了所以當這個方法出現異常而,其他操作沒有出現異常的話,整個事務也會提交,除了otherService.update的事務不被提交