首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

多DAO的事物处置

2012-11-09 
多DAO的事物处理多DAO操作,可能存在事务处理的必要,一般发生在对多张表进行数据修改或者记录增删的时候(CR

多DAO的事物处理

多DAO操作,可能存在事务处理的必要,一般发生在对多张表进行数据修改或者记录增删的时候(CRUD,中的CUD)。怎样实现简单美观的CUD操作,一直是我想要追求的。我使用的平台是webwork,不过本文和webwork无关,接下去我把我实现的方法与大家探讨探讨,我对设计模式不是很了解,所以不知道Transaction类是否存在线程安全问题,希望大家能够批评指正。(QQ:5336598)

接口有:

IDAO

public interface IDAO {public void setDBConnection(TXDBConnection dbc);}

?

主要的类有:

Transaction (定义事务的简单方法)

import java.sql.*;import com.common.util.Debug;public class Transaction {private TXDBConnection txdbc = null;public Transaction() {txdbc = new TXDBConnection();try {txdbc.setConn(DriverManager.getConnection("proxool.conn"));} catch (Exception e) {e.printStackTrace();txdbc.setConn(null);}}public void putDAO(IDAO dao) {dao.setDBConnection(txdbc);}public void begin() throws SQLException {txdbc.getConn().setAutoCommit(false);}public void commit() throws SQLException {txdbc.getConn().commit();txdbc.getConn().setAutoCommit(true);}public void rollback() throws SQLException {txdbc.getConn().rollback();txdbc.getConn().setAutoCommit(true);}public void closeConn() throws SQLException{if (txdbc.getConn() != null) {txdbc.getConn().close();txdbc.setConn(null);            Debug.println("conn is not null");        }else{        Debug.println("conn is null!");        }}}

?

TXDBConnection(定义对数据库操作的方法,比如add、update、delete等等都可以在这里定义,我暂时只实现添加的方法[我用的是sqlserver2000数据库 jdbc 3.0 驱动,里面的insert会返回当前插入的key值])

?

import java.sql.*;/** * 支持事物的DBConnection *  * @author TT *  */public class TXDBConnection {private ResultSet rs;private ResultSetMetaData resultMeta;private PreparedStatement psql;private Connection conn;public Connection getConn() {return conn;}public void setConn(Connection conn) {this.conn = conn;}/** *  * @param sql * @param values * @return */public long addPrepareSqlReturnKey(String sql, String[] values)throws SQLException {if (Debug.SQL_DEBUG) {Debug.println(sql);}long newId = -1;psql = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);for (int i = 1; i <= values.length; i++) {psql.setString(i, values[i - 1]);}psql.executeUpdate();ResultSet rs = psql.getGeneratedKeys();if (rs.next()) {newId = Long.parseLong(rs.getString(1));}close();return newId;}public void close() {try {if (rs != null) {rs.close();rs = null;} else {}if (psql != null) {psql.close();psql = null;} else {}} catch (Exception ex) {ex.printStackTrace();}}}

?

接下去是具体的实例:(模拟情景是组织1->n电话,就是1个组织有多个不同电话的二层表结构)

?

组织以institution表示,电话以phone表示,直接从service层或者说是业务层bo层开始

?创建InstitutionDAO

public class InstitutionDAO implements IDAO{public long addInst(Institution inst) throws SQLException{String sql = "insert into INSTITUTION_T (INST_NAME) values (?)";String[] values = { inst.getInstName};return txdbc.addPrepareSqlReturnKey(sql, values);}private TXDBConnection txdbc = new TXDBConnection();public void setDBConnection(TXDBConnection txdbc){this.txdbc = txdbc;}}

?PhoneDAO类

public class PhoneDAO implements IDAO{private TXDBConnection txdbc = new TXDBConnection();public void setDBConnection(TXDBConnection txdbc){this.txdbc = txdbc;}public long addPhone(Phone phone) throws SQLException{??String sql = "insert into PHONE_T (INST_ID, PHON_NO)values(?,?)";??String[] values = {phone.getInstId(),phone.getPhonNo()?};??return txdbc.addPrepareSqlReturnKey(sql, values);?}}

?创建BO以完成事务处理

public class InstitutionBO {InstitutionDAO dao = null;PhoneDAO pdao = null;public boolean addInst(Institution inst,List list){//list中为Phone对象dao =  new InstitutionDAO();pdao = new PhoneDAO();Phone phone = null;Transaction tx = new Transaction();try{tx.begin();//tx.putDAO(dao);long key = dao.addInst(inst);//tx.putDAO(pdao);for(int i=0;i<list.size();i++){phone = (Phone)list.get(i);phone.setInstId(String.valueOf(key));pdao.addPhone(phone);}tx.commit();return true;}catch(Exception ex){ex.printStackTrace();try{tx.rollback();}catch(SQLException ex1){ex1.printStackTrace();}return false;}}}

?

热点排行