ibatis3 spring3 struts2整合 执行事物中的异常的处理

时间:2021-04-06 21:41:40
我现在故意执行sql报错 测试事物的
我要执行两次添加操作  两次添加同样的数据  报唯一约束的错  然后让他回滚 返回  根据条件返回值

这是我想要的效果

现在是  发现有异常就回滚 可是由于有异常 

 

方法中的

if(res1==res2&&res1==1)
     return 0;

    else return -1;

 

就不执行了

现在想让事物可以正常使用,也能根据执行sql的结果进行判断。

 

对于异常该怎么处理。

--------------------------------------------------------------------------------userdao 

 

package com.haitu.dao.impl;

import java.sql.SQLException;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.haitu.model.UserInf;

public class UserDao implements com.haitu.dao.UserDaoInf{
   private SqlSession sqlSession ;
   
   public UserDao(SqlSession sqlSession) {
  // TODO Auto-generated constructor stub
    this.sqlSession=sqlSession;
  }
 
  public int addUser(UserInf userInf)  {
     
     int res1= sqlSession.update("UserInf.addUser",userInf);
     int res2= sqlSession.update("UserInf.addUser",userInf);

//??????此处执行事物问题   执行两次添加操作  两次添加同样的数据  报唯一约束的错  然后让他回滚
   //由于出现异常下面的判断代码执行不了 

  if(res1==res2&&res1==1)
     return 0;

    else return -1;
  }
  
  public List<UserInf> selectUser() {
   return sqlSession.selectList("UserInf.selectUser");
  }
}

 

------------------------------------------------------------------spring配置:

 

<?xml version="1.0" encoding="UTF-8"?>

<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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-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">
 
 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations" value="WEB-INF/jdbc.properties"></property>
 </bean>
 
 <!-- 配置数据库 -->
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
   <property name="driverClass" value="${driverClass}"> </property>
  <property name="jdbcUrl" value="${jdbcUrl}"> </property>
  <property name="user" value="${user}"> </property>
  <property name="password" value="${password}"> </property>
  <property name="maxPoolSize" value="${maxPoolSize}"> </property>
  <property name="minPoolSize" value="${minPoolSize}"> </property>
  <property name="maxIdleTime" value="${maxIdleTime}"> </property>
  <property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"> </property>
 </bean>
 
 
 
 
 
 <!-- 加载 abities
  SqlSessionFactoryBean 这里是与ibatis以前版本区别的地方
  这里不是继承 sprig的FactoryBean 因为spring的版本没有更新 由ibatis jar包自己开发类继承了
  spring的FactoryBean类
  另外 必备属性:dataSource 
   -->
 <bean id="sqlMapClient"
  class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource">
   <ref local="dataSource" />
  </property>
    <property name="configLocation" value="classpath:ibatis.xml"></property>
  </bean>
 
 <!-- 把加载了 配置文件的 sqlMapClient 注入 SqlSessionTemplate模板-->
 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlMapClient" />
    </bean>
    
    <!-- 通过spring 把已经加载ibatis配置文件sqlMapClient bean 注入到 dao类 供
 dao类查询数据 -->
    <bean id="UserDao" class="com.haitu.dao.impl.UserDao">
   <!-- 使用构造器注入 -->
   <constructor-arg ref="sqlSession" />
 </bean>
    
    <!-- pojo -->
 <bean id="UserAction" class="com.haitu.action.UserAction" scope="prototype" >
    <property name="userDao" ref="UserDao"></property>
  </bean>


 <!-- 事务的定义 -->
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource">
   <ref local="dataSource" />
  </property>
 </bean>
 
  <aop:config>
    <aop:pointcut id="daoMethods" expression="execution(public * com.haitu.dao.UserDaoInf.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods"/>
   </aop:config>

 

 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method  name="*"  rollback-for="Exception"  propagation="REQUIRED"/>
  </tx:attributes>
 </tx:advice>
 
</beans>

 

--------------------------------------------------------------------------------struts2配置:

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.locale" value="zh_CN" />
      <constant name="struts.i18n.encoding" value="UTF-8" />
 
    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
         <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
        
        <!--  将json串作为text返回-->
         <action name="userinf_*" class="UserAction" method="{1}">
             <result  type="stream" name="plain">
                       <param name="contentType">text/html</param>
             <param name="inputName">inputStream</param>
             </result>
         </action>
    </package>
 
     
 </struts>

--------------------------------------------------------------------------------ibatis配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<configuration>

   
   <!-- 对应一些POJO类 然后可以在mapper中引用Emp 等就等于引用这个类类型-->
 <typeAliases>
  <typeAlias type="com.haitu.model.UserInf" alias="UserInf" />
  </typeAliases>
   <!-- 加载相关ibatis的映射文件 -->
 <mappers>
  <mapper resource="com/haitu/model/UserInf.xml" />
  </mappers>

</configuration>

 

--------------------------------------------------------------------------------useraction 中的方法

 

public String addUserInf()    {
  try {
    inputStream = new StringBufferInputStream(new String("{success: true, msg:\"添加成功\"}".getBytes("utf-8"),"iso-8859-1"));
   } catch (Exception e) {
   // TODO: handle exception
  }
   
       int res=userDao.addUser(userinf);
      System.out.println("----------------"+res);
         return "plain";

 }

 

6 个解决方案

#1


事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!

#2


引用 1 楼  的回复:
事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!


修改下 
是报错代码后面的代码全部不执行了!

#3


引用 2 楼  的回复:
引用 1 楼 的回复:
事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!


修改下 
是报错代码后面的代码全部不执行了!


是的  就是这样 

#4


有没有试过先捕捉异常,处理完成之后,再将异常抛出给事务,进行回滚处理呢??

#5


引用 4 楼  的回复:
有没有试过先捕捉异常,处理完成之后,再将异常抛出给事务,进行回滚处理呢??


这样应该可以 可是总是这样做 我觉得太差了 是不是我配置的不对 或者怎么弄  正常来说不是这样做的吧

#6


知道怎么处理了 
 public int addUser(UserInf userInf) {
    try{
  int res1= sqlSession.update("UserInf.addUser",userInf);
  int res2= sqlSession.update("UserInf.addUser",userInf);
   }cathch(RuntimeException e )
{
  throw e;
}
}

然后在action中 try  catch

#1


事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!

#2


引用 1 楼  的回复:
事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!


修改下 
是报错代码后面的代码全部不执行了!

#3


引用 2 楼  的回复:
引用 1 楼 的回复:
事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!


修改下 
是报错代码后面的代码全部不执行了!


是的  就是这样 

#4


有没有试过先捕捉异常,处理完成之后,再将异常抛出给事务,进行回滚处理呢??

#5


引用 4 楼  的回复:
有没有试过先捕捉异常,处理完成之后,再将异常抛出给事务,进行回滚处理呢??


这样应该可以 可是总是这样做 我觉得太差了 是不是我配置的不对 或者怎么弄  正常来说不是这样做的吧

#6


知道怎么处理了 
 public int addUser(UserInf userInf) {
    try{
  int res1= sqlSession.update("UserInf.addUser",userInf);
  int res2= sqlSession.update("UserInf.addUser",userInf);
   }cathch(RuntimeException e )
{
  throw e;
}
}

然后在action中 try  catch