package classmate;
import java.sql.*;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DataStore {
DataSource dataSource = null;
private static Connection conn = null;
private Statement stmt = null;
private boolean hadErrors = false;
//construct
public DataStore(DataSource dataSource) throws Exception{
this.dataSource = dataSource;
conn = dataSource.getConnection();
stmt = conn.createStatement();
}
//invoke transaction
public void beginTransaction() throws SQLException{
conn.setAutoCommit(false);
}
//perform transaction
public void commitTransaction() throws SQLException{
//hadErrors = false
if(!hadErrors){
conn.commit();
}
else{ //hadErrors = true
conn.rollback();
hadErrors = false;
}
hadErrors = false;
conn.setAutoCommit(true);
}
//mark error
public void ErrorOccur(){
hadErrors = true;
}
//execute insert,delete,update
synchronized public void execute(String sql) throws SQLException{
if(stmt != null)
stmt.executeUpdate(sql);
else{
Log log = LogFactory.getLog("mylog");
log.error("fail to execute sql");
}
}
//execute select
synchronized public ResultSet read(String sql) throws SQLException{
if(stmt != null){
ResultSet tmp = null;
tmp = stmt.executeQuery(sql);
return tmp;
}else{
return null;
}
}
// count of result
synchronized public int readCount(String sql) throws SQLException{
int nCount = 0;
try{
if(stmt != null){
ResultSet tmp = null;
tmp = stmt.executeQuery(sql);
if(tmp != null && tmp.next()){
nCount = tmp.getInt(1);
}else{
nCount = 0;
}
}
}catch(SQLException e){
nCount = 0;
}
return nCount;
}
// close db
synchronized public void stop(){
try{
if(conn != null){
conn.close();
stmt.close();
}
}catch(Exception e){
Log log = LogFactory.getLog("mylog");
log.error("fail to close db- DataStore.java");
}finally{
conn = null;
}
}
}
还在研究,貌似DCL的问题还存在。