/*
*
*
*/
package com.huahuan.database;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import org.jplus.hyb.database.DatabaseINI;
import org.jplus.util.LoggerManage;
/**
*
* @author e
*/
public class DatabaseAccess {
private Connection conn = null;
private PreparedStatement pstm = null;
private CallableStatement cstm = null;
private ResultSet rs = null;
/**
* 预处理参数列表
*/
private List parameterList = null;
public DatabaseAccess() {
//控制台提示
// System.out.println("---");
System.out.println("(gai)连接数据库");
conn = DatabaseINI.getConnection();
parameterList = new ArrayList();
}
/**
* 放置一个参数到sql预处理列表
*
* @param parameter 参数
*/
public void setPreparedParameter(Object parameter) {
parameterList.add(parameter);
}
/**
* 预处理,并加入参数
*
* @param sql 预处理语句
* @throws SQLException
*/
private void prepare(String sql) throws SQLException {
pstm = getConn().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
int index = 1;
for (Object parameter : parameterList) {
pstm.setObject(index++, parameter);
}
printSql(sql);
}
//准备存储过程参数
private void prepareCall(String call) throws SQLException {
cstm = getConn().prepareCall(call);
int index = 1;
for (Object parameter : parameterList) {
cstm.setObject(index++, parameter);
}
printSql(call);
}
//不清除预处理参数列表,执行select count语句 返回一个总条数
public int executeCount(String sql) {
int count = 0;
try {
this.prepare(sql);
rs = pstm.executeQuery();
if (rs != null && rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
return count;
}
//执行查询的SQL并返回结果集
public ResultSet executeQuery(String sql) {
try {
this.prepare(sql);
parameterList.clear();
rs = pstm.executeQuery();
} catch (SQLException e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
return rs;
}
//可执行插入、更新、删除的SQL
public boolean executeUpdate(String sql) {
boolean b = false;
try {
this.prepare(sql);
parameterList.clear();
pstm.executeUpdate();
b = true;
} catch (Exception e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
return b;
}
//专用于执行select语句,并放回数据库自动生成的主键。返回-1说明插入失败
public Integer executeInsert(String sql) {
Integer primarykey = -1;
try {
this.prepare(sql);
pstm.execute();
parameterList.clear();
rs = pstm.getGeneratedKeys();
while (rs.next()) {
primarykey = rs.getInt(1);
}
} catch (Exception e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
return primarykey;
}
//执行存储过程
public boolean executeProc(String call) {
boolean b = false;
try {
this.prepareCall(call);
parameterList.clear();
cstm.execute();
b = true;
} catch (Exception e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
return b;
}
public void close() {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
}
if (pstm != null) {
try {
pstm.close();
} catch (SQLException e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
}
if (cstm != null) {
try {
cstm.close();
} catch (SQLException e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
}
if (getConn() != null) {
try {
getConn().close();
} catch (SQLException e) {
LoggerManage.logger.getLogger(e.getMessage(), e);
}
}
System.out.println("(gai)关闭数据库");
}
/**
* 输出SQL语句
*
* @param sql
*/
private void printSql(String sql) {
StringBuffer s = new StringBuffer(sql);
for (Object o : parameterList) {
if (o.getClass().getName().equals("java.lang.String") && o != null) {
s = s.replace(s.indexOf("?"), s.indexOf("?") + 1, "'" + o.toString() + "'");
} else {
s = s.replace(s.indexOf("?"), s.indexOf("?") + 1, o.toString());
}
}
System.out.println("sql:" + s.toString().replaceAll("`", ""));
}
/**
* @return the conn
*/
public Connection getConn() {
return conn;
}
}