📄 dbcon.java
字号:
package org.digitstore.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 类功能 :提供数据库操作功能 建立人 :郑严 <br>
* 修改日期:2003-9-22 <br>
* 修改原因:如果结果集为空,元数据不能采集 <br>
* 修改人 :郑严 <br>
*/
public class DBCon {
private String name = "default";
protected Connection conn = null; //数据库连接
protected PreparedStatement pstmt = null; //语句
protected Statement stmt = null;
Log logger = LogFactory.getLog(this.getClass());
public DBCon() {
}
public DBCon(String name) {
this.name = name;
}
/**
* DBCon的使用方法 首先声明一个DBCon对象,构造函数的参数名为数据库名,数据库的连接配置请见config\db.properties文件
* 然后执行SQL语句 最后调用close()方法,关闭(释放)连接。
*
* 如果执行的是查询语句,则查询结果是一个DBSet结果集, DBSet的使用方法是调用get(row,column);函数
* 其中row是结果集的行数(从零开始) column是结果集的列数或者列名(字段名)。
*
* @param args
*/
public static void main(String[] args) {
DBCon conn = new DBCon("olympics");
System.out.println(System.getProperty("user.dir"));
try {
conn.prepare("SELECT * FROM user_info");
/// conn.setString(1, "pk");
DBSet rs = conn.executeQuery();
// rs.get(0, 0);
// rs.get(0, "pk");
} catch (Throwable e) {
e.printStackTrace();
} finally {
conn.close();
}
}
/**
* 方法功能: 准备PreparedStatement语句 <br>
* 建立日期: (00-4-6 15:37:32) <br>
*
* @param: sql语句---参数以?代替 <br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
*/
public void prepare(String sql) throws SQLException {
if ((conn == null) || conn.isClosed()) {
getConnection();
}
try {
if (pstmt != null) {
pstmt.close();
}
} catch (Throwable e) {
}
try {
logger.debug("prepare:" + sql);
pstmt = getConnection().prepareStatement(sql);
//pstmt.setMaxRows(1000);
} catch (SQLException e) {
logger.debug(e);
throw e;
}
}
/**
* 给参数赋值
*/
public void setObject(int index, Object parameter) throws SQLException {
logger.debug("index=" + index + ",parameter=" + parameter);
if (!(parameter instanceof java.sql.Date)) {
parameter = (parameter == null) ? "" : parameter.toString().trim();
}
//pstmt.setObject(index, Tools.encodeISO(parameter.toString()));
pstmt.setObject(index, parameter.toString());
}
/**
* 给参数赋值
*/
public void setString(int index, Object parameter) throws SQLException {
logger.debug("index=" + index + ",parameter=" + parameter);
parameter = (parameter == null) ? "" : parameter.toString().trim();
//pstmt.setString(index, Tools.encodeISO(parameter.toString()));
pstmt.setString(index, parameter.toString());
}
/**
* 给参数赋值
*/
public void setInt(int index, int parameter) throws SQLException {
logger.debug("index=" + index + ",parameter=" + parameter);
pstmt.setInt(index, parameter);
}
/**
* 给参数赋值
*/
public void setBoolean(int index, boolean parameter) throws SQLException {
logger.debug("index=" + index + ",parameter=" + parameter);
pstmt.setBoolean(index, parameter);
}
/**
* 给参数赋值
*/
public void setDouble(int index, double parameter) throws SQLException {
logger.debug("index=" + index + ",parameter=" + parameter);
pstmt.setDouble(index, parameter);
}
/**
* 写入比较长的字符串 建议在500个字符以上使用
*
* @param index
* @param parameter
* @throws SQLException
*/
public void setBigString(int index, String parameter) throws SQLException {
logger.debug("index=" + index + ",parameter=" + parameter);
java.io.Reader reader = new java.io.StringReader(parameter);
int length = (parameter == null) ? 0 : parameter.length();
pstmt.setCharacterStream(index, reader, length);
}
/**
* 写入字符流
*
* @param index
* @param reader
* @param length
* @throws SQLException
*/
public void setCharacterStream(int index, java.io.Reader reader, int length)
throws SQLException {
logger.debug("index=" + index + ",parameter=" + reader);
pstmt.setCharacterStream(index, reader, length);
}
/**
* 方法功能:执行sql返回结果--两维向量 <br>
* <b>不推荐使用 <b><br>
* 建立日期: <br>
*
* @param: sql 语句 <br>
* @return :查询返回两维Vector[[aaa,bbb],[ccc,ddd]], (未查到结果时返回[],程序中
* 应以((java.util.Vector)ret).size()判断@return是否为空 <br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
*
*/
public DBSet executeQuery(String sql) throws SQLException {
java.sql.ResultSet rs = null;
DBSet vResult = null;
try {
logger.debug("executeQuery:" + sql);
stmt = getConnection().createStatement();
rs = stmt.executeQuery(sql);
vResult = resultset2Vector(rs);
} catch (SQLException e) {
throw e;
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
} catch (Throwable e1) {
}
// closeStmt();
}
return vResult;
}
/**
* 方法功能:执行sql返回结果--两维向量 <br>
* 建立日期:(00-3-27 9:13:28) <br>
*
* @param: <br>
* @return :查询返回两维Vector[[aaa,bbb],[ccc,ddd]], (未查到结果时返回[],程序中
* 应以((java.util.Vector)ret).size()判断@return是否为空 <br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
*
*/
public DBSet executeQuery() throws SQLException {
java.sql.ResultSet rs = null;
DBSet vResult = null;
try {
if (pstmt == null) {
logger.debug("注意:你忘了调用perpare方法了");
}
rs = pstmt.executeQuery();
vResult = resultset2Vector(rs);
} catch (SQLException e) {
logger.debug(e);
throw e;
} finally {
try {
if (rs != null) {
rs.close(); //关闭语句
}
} catch (Throwable e1) {
}
// closeStmt();
//
}
return vResult;
}
/**
* 方法功能:执行sql返回结果 <br>
* <b>不推荐使用 </b> <br>
*
* @return :操作影响的纪录数 <br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
*/
public int executeUpdate(String sql) throws SQLException {
try {
logger.debug("executeUpdate:" + sql);
stmt = getConnection().createStatement();
return stmt.executeUpdate(sql);
} catch (Exception e) {
logger.debug("executeUpdate(String sql) ERROR:" + e.getMessage());
return -1;
} finally {
try {
if (stmt != null) {
stmt.close();
}
} catch (Exception e) {
}
}
}
/**
* 方法功能:执行sql返回结果 <br>
*
* @return :操作影响的纪录数 <br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
*/
public int executeUpdate() throws SQLException {
try {
if (pstmt == null) {
logger.error("注意:你忘了调用perpare方法了");
}
return pstmt.executeUpdate();
} catch (NullPointerException e) {
logger.debug(e);
throw new SQLException("空指针异常在excuteUpdate中,请查看系统日志!");
} finally {
// closeStmt();
}
}
/**
* 方法功能:释放连接, 强烈建议显式调用 <br>
* 建立日期:(00-4-6 15:37:32) <br>
* 建立人 :郑严 <br>
*
* @return <br>
*/
public void close() {
//先关闭statement
closeStmt();
if (conn != null) {
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
logger.debug(e);
}
DBPool.getInstance(name).free(conn);
logger.debug("free connection");
conn = null;
}
}
/**
* 设置手动提交(事务处理)bAutoCommit=true 自动 else 手动 注意: 设置手动提交后一定要调用
* setAutoCommit(false) 建议显式调用setAutoCommit(true) <br>
* 建立日期:(00-3-29 10:46:08) <br>
*
* @param:bAutoCommit=true 自动 else 手动 <br>
* @return :<br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
*/
public void setAutoCommit(boolean bAutoCommit) {
try {
getConnection().setAutoCommit(bAutoCommit);
} catch (SQLException e) {
}
}
/**
* 方法功能:事务提交 <br>
* 建立日期:(00-3-29 11:39:18) <br>
*
* @param: <br>
* @return :<br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
*/
public void commit() throws java.sql.SQLException {
try {
conn.commit();
} catch (java.sql.SQLException e) {
logger.error("exception in commit() ", e);
}
}
/**
* 方法功能:事务回滚 <br>
* 建立日期:(00-3-29 11:40:54) <br>
*
* @param: <br>
* @return :<br>
* 建立人 :郑严 <br>
* 修改日期: <br>
* 修改原因: <br>
* 修改人 :<br>
* @exception java.sql.SQLException
* 异常描述。
*/
public void rollback() {
try {
conn.rollback();
} catch (SQLException e) {
logger.error("exception in rollbak() ", e);
}
}
public Connection getConnection() throws SQLException {
if (conn == null) {
conn = DBPool.getInstance(name).getConnection();
conn.setAutoCommit(false);
}
return conn;
// return newConnection();
}
/**
* 关闭语句句柄
*/
private void closeStmt() {
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (Throwable e) {
}
try {
if (pstmt != null) {
pstmt.close();
pstmt = null;
}
} catch (Throwable e) {
}
}
/**
* 为防止数据库连接释放失败在析构时检查 protected void finalize() throws Throwable { try {
* if(conn == null) return; close(); } catch(Throwable e) { }
* super.finalize(); }
*/
private DBSet resultset2Vector(java.sql.ResultSet rs) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
int columnCount = meta.getColumnCount();
DBSet vResult = new DBSet();
//读取列 元数据
for (int i = 0; i < columnCount; i++) {
vResult.put(meta.getColumnName(i + 1).toUpperCase(), String
.valueOf(i));
}
//循环取值
while (rs.next()) {
java.util.Vector vTemp = new Vector();
for (int i = 0; i < columnCount; i++) {
Object oTemp = rs.getObject(i + 1);
String sTemp = (oTemp == null) ? "" : oTemp.toString();
//vTemp.addElement(Tools.encodeGB(sTemp.trim()));
vTemp.addElement(sTemp.trim());
}
vResult.addElement(vTemp);
}
if (!vResult.isEmpty()) {
vResult.printColumnInfo();
logger.debug(vResult);
}
return vResult;
}
/*
* public static boolean isSelect(String sql) { return
* sql.trim().toUpperCase().indexOf("SELECT") == 0; }
*/
/**
* 查询并关闭连接
*
* @param sql
* sql语句
* @param parameter
* 输入的参数组
* @return 查询结果
*/
public Vector query(String sql, Vector parameter) throws Exception {
try {
prepare(sql);
for (int i = 0; i < parameter.size(); i++) {
setObject(i + 1, parameter.elementAt(i));
}
return executeQuery();
} catch (Exception e) {
throw e;
} finally {
// conn.close();
}
}
/**
* 执行insert或update并关闭连接
*
* @param sql
* sql语句
* @param parameter
* 输入的参数组
* @return 执行结果
*/
public int insertUpdate(String sql, Vector parameter) throws Exception {
try {
prepare(sql);
for (int i = 0; i < parameter.size(); i++) {
setObject(i + 1, parameter.elementAt(i));
}
return executeUpdate();
} catch (Exception e) {
throw e;
} finally {
// conn.close();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -