Spring Chapter 4 jdbc/hibernate DaoSupport的使用攻略

<!--
	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?
--> 
圖二:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章