spring学习笔记(ssh整合--下)

一、spring 整合aop事务
上篇文章讨论了spring整合hibernate,就是帮助我们管理sessionFactory对象,今天使用spring整合事务的时候会用到sessionFactory来连接。
下面用一个案例来演示spring整合aop事务的使用方式,即保存用户。
1、使用xml配置事务
<1> 在ApplicationContext.xml中配置

<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url" >jdbc:mysql:///xxx?useUnicode=true&amp;characterEncoding=UTF-8</prop>
            <prop key="hibernate.connection.username" >root</prop>
            <prop key="hibernate.connection.password" >xxx</prop> 
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <!-- 引入orm元数据  -->
    <property name="mappingDirectoryLocations" value="classpath:com/tz/domain">
    </property>

</bean>

<!-- 配置事务管理器 -->
<bean name ="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--配置通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="toLogin" isolation="REPEATABLE_READ"  propagation="REQUIRED" read-only="false"/>
            <tx:method name="save*" isolation="REPEATABLE_READ"  propagation="REQUIRED" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    <!--配置织入--> 
    <aop:config>                          
        <aop:pointcut expression="execution(* com.tz.service.Impl.*ServiceImpl.*(..))" id="txPc"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
    </aop:config> 

<2> 编写 dao 层

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    @Override
    public void save(User user) {
        getHibernateTemplate().save(user);
    }

}

<3> 编写 service 层


public class UserServiceImpl implements UserService {

    @Resource(name="userDao")
    private UserDao  ud;

    @Override
    public void saveUser(User u ) {
        ud.save(u);
    }

<4> 测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(“classpath:ApplicationContext.xml”)
public class hibernateTest {

@Resource(name=”userService”)
private UserService us;

@Test
public void testTx(){
User user = new User();
user.setUser_code(“呆呆”);
user.setUser_password(“12346”);
us.saveUser(user);
}

Junit测试后查看数据库表中有了数据。
2、使用注解配置
修改applicationContext.xml配置文件


<!-- 配置事务管理器 -->
<bean name ="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="toLogin" isolation="REPEATABLE_READ"  propagation="REQUIRED" read-only="false"/>
            <tx:method name="save*" isolation="REPEATABLE_READ"  propagation="REQUIRED" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    配置织入 
    <aop:config>                          
        <aop:pointcut expression="execution(* com.tz.service.Impl.*ServiceImpl.*(..))" id="txPc"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
    </aop:config> 
    -->
<!--开启使用注解配置-->
<tx:annotation-driven/>

在service 类中使用注解即可:

//在类中使用注解
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
public class UserServiceImpl implements UserService {

    @Resource(name="userDao")
    private UserDao  ud;
    //在方法上使用注解单独配置readOnly=false,标识可以对数据库中的数据进行修改
    @Override
    @Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
    public void saveUser(User u ) {
        ud.save(u);
    }
}

同样使用上面的测试类测试就可以。

二、扩大session的作用范围,解决no-session 问题。
思路:之所以会出现这个问题,就是因为 session 的作用范围太小,从一次请求开始到请求结束保证session不断才可以。那么就想到了filter可以实现这种功能所以只需在web.xml中如下配置:

<filter>
    <filter-name>session</filter-name>
    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>session</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这样就可以解决no-session问题了。到此为止,ssh的整合已经结束了,相信大家根据所学的知识,再顺着文章的思路就能完成ssh的整合,为项目实战做准备。

猜你喜欢

转载自blog.csdn.net/weixin_38008100/article/details/81568461
今日推荐