读书人

封装好的DB类怎么进行事务的提交和回滚

发布时间: 2011-12-20 22:26:40 作者: rapoo

封装好的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异常,你必须得处理这些东西,这样数据层的代码就会上移到业务逻辑层,感觉不是很好。。。。

读书人网 >Java Web开发

热点推荐