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