日期:2014-05-17  浏览次数:20798 次

封装好的DB类如何进行事务的提交和回滚
已经写好的Db类,代码如下:
Java code
public class Db {

     /**
     * @param args
     */
    //dbUrl数据库连接串信息,其中“1521”为端口,“ora9”为sid
    private String dbUrl = "jdbc:oracle:thin:@192.168.86.204:1521:qc";
    //theUser为数据库用户名
    private String usr = "god";
    //thePw为数据库密码
    private String psw = "onmygod";
    //几个数据库变量
    private Connection con = null;
    private Statement sta = null;
    private ResultSet rs = null;

    //初始化连接
    public void dbconn() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
            //与url指定的数据源建立连接
            con = DriverManager.getConnection(dbUrl, usr, psw);
            //采用Statement进行查询
            sta = con.createStatement();
    } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //执行查询
     public ResultSet select(String sql)
      {
          dbconn();
          try {
            rs=sta.executeQuery(sql); //Statement的executeQuery()方法则是用于SELECT等查询数据库的SQL,executeUpdate()方法会返回int结果,表示记录变动的数目,executeQuery()方法会返回java.sql.ResultSet对象            
          } catch (SQLException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
          }
         return rs;
      }     
     
     //执行增删改
      public int change(String sql)
      {
          dbconn();
          int i=0;
          try {
            i=sta.executeUpdate(sql); 
          } catch (SQLException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
            return i;
          }
          return i;
      }     

    //关闭连接
    public void close() {
        try {
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (sta != null)
                    sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if (con != null)
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
            }
        }
    }
}


在别的地方对数据进行多条语句的操作,希望全部语句执行成功才提交,要怎么写呢,声明的类变量没办法访问con,就没办法用法con.setAutoCommit(autoCommit);肿么写...

------解决方案--------------------
把获取连接的代码提到外面不就行了吗...
最多加个控制符,如果没有手动设置autoCommit的话就自动获取连接,否则就用手动控制
------解决方案--------------------
楼上的思路是最简单可行的。
事务和连接直接相关,你把连接控制好了,做为参数传递即可。
------解决方案--------------------
不要每次操作都重置connection
Java code
     //执行增删改
      public int change(String sql)
      {
          [color=#FF0000]dbconn();[/color]          int i=0;
          try {
            i=sta.executeUpdate(sql); 
          } catch (SQLException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
            return i;
          }
          return i;
      }

------解决方案--------------------
探讨
不要每次操作都重置connection

Java code
//执行增删改
public int change(String sql)
{
dbconn(); int i=0;
try {
i=sta.executeUp……

------解决方案--------------------
如果非要用这个类,那没办法控制事务,你必需修改这个类,就如同楼上各位说的.......
------解决方案--------------------
弄个构造方法,在里面连接数据库,操作数据库时使用这个连接,然后写个获取连接的方法,使用拿到的连接控制是否自动提交。
不过问题是conn.Commit()会抛出SQLException异常,你必须得处理这些东西,这样数据层的代码就会上移到业务逻辑层,感觉不是很好。。。。