<!--
Spring Chapter 4 jdbc/hibernate DaoSupport的使用攻略
Goal:採用昨天的方法來配置切面控制(這樣說不太準確)!
-->
今天呢,主要就是講解如何使用spring中的內置包來實現AOP
一,HibernateDaoSupport(這個要重要點,所以先將這個)
說明:使用這個就不得不用到AOP的相關的包,在導入Spring時需要選中圖一中的那三個包(jdbc需要前面四個包)!
然後在寫好了接口,並且寫好了接口的實現類後,就開始配置Spring的applicationContext.xml文件了,由於Hibernate會
使用到SessionFactory,所以這裏就要開始層層遞進的進行配置!
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--這個sessionFactory一般是自動建好的,我們直接飲用就OK了!-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="file:src/hibernate.cfg.xml" />
</bean>
<!--配置事務所在類(與sessionFactory的class如出一轍)-->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!--寫入sessionFactory的引用-->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--開始配置事務transaction-manager引用前面我們寫的事務的所在類的id-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attribute>
<!--需要過濾的方法name表示方法名稱(採用正則匹配),propagation表示是否開啓事務,QEQUIRED(必需開啓),NEVER(不開啓)-->
<tx:method name="add*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
<!--read-only表示只讀,一遍只讀等於true表示無需開啓事務,isolation="READ_COMMITTED" 表示事務只有讀取完畢才能進行下一個事務!-->
<tx:method name="query*" read-only="true"/>
</tx:attribute>
</tx:advice>
<!--開始配置切面-->
<aop:config>
<!--配置切入點-->
<aop:cutpoint expression="execution(* com.shu.dao.impl.*.*(..))" id="ucut" />
<!--配置切面,不同於昨天我們講的那個<aop:aspect>-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="ucut"/>
</aop:config>
<!--配置您需要的dao類,不要忘記給這個dao類添加一個sessionFactory的屬性-->
<bean id="udao" class="com.shu.dao.impl.UserDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
//這樣,配置就寫好了~我們只需要new classPathXmlApplicationContext().getBean("udao")就可以調用裏面的方法了!
注意,在dao類中我們應該這樣寫(繼承類實現了接口):
pubilc class UserDao extends hibernateDaoSupport implemnts IUser{
@override
public void addUser(UserInfo user){
this.getHibernageTemplate().save(user);
//....
}
}
其實這裏想講的是:可以採用this.getHibernateTemplate().方法名來進行各種操作!
二,jdbcDaoSupport的使用攻略
同上面的步驟,但是我們在導入的Spring的時候就需要多導入一個,見圖二(至於Hibernate是默認選中的,所以就不說了);
a)applicationContext.xml文件的配置
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--首先需要配置數據源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--配置連接信息-->
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=testdb" />
<property name="username" value="sa" />
<property name="password" value="123456" />
</bean>
<!--然後配置所需要的dao類就OK了,當然,不能忘記加上一個datasource的屬性-->
<bean id="udao" class="com.shu.dao.impl.UserDao">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
b)配置好後,我們需要在目標dao類中這樣寫:
public UserInfo extends jdbcDaoSupport implments IUser{
@override
public void addUser(){
//execute是執行sql語句的方法
this.getJdbcTemplate().execute(sql);
}
/**
* 查詢單個的接口ResultSetExtractor中,不會自動幫你迭代,所以要自己寫一個rs.next()來進行!
*/
public Object querySingle() {
return super.getJdbcTemplate().query("select * from UserInfo where uid=1",new ResultSetExtractor<UserInfo>(){
public UserInfo extractData(ResultSet rs) throws SQLException,
DataAccessException {
UserInfo ui=null;
if(rs.next()){
ui=new UserInfo();
ui.setUid(rs.getInt("uid"));
ui.setUname(rs.getString("uname"));
ui.setRemark(rs.getString("remark"));
}
return ui;
}
});
}
/**
* 在RowMapper中,框架會自動幫你迭代,所以就不用寫rs.next()了,不然會迭代兩次,並且後面直接return後框架會自動給你添加到list
*/
public List queryList() {
return super.getJdbcTemplate().query("select * from UserInfo",new RowMapper<UserInfo>(){
public UserInfo mapRow(ResultSet rs, int ind)
throws SQLException {
UserInfo ui=new UserInfo();
ui.setUid(rs.getInt("uid"));
ui.setUname(rs.getString("uname"));
ui.setRemark(rs.getString("remark"));
return ui;
}
});
}
}
<!--
Author:Lovingshu's Forever
Date:2011-11-23 22:35
Remark:Too bad those days~What happend?
-->
圖二: