如何解决是否有关于如何创建静态数据库助手的标准?
我希望能够拥有一个具有以下语法的DBConnection类,以从数据库中检索数据并调用DB的SPROC:
static ResultSet executeSproc(String sprocName,Object... params)
static ResultSet queryDB(String selectColumns,String tableName,String where)
无需创建DBConnection对象,因为我发现这会导致在调用端关闭连接方面造成混乱的清除(“ executeSproc”函数最终返回ResultSet)。返回结果集的函数意味着调用代码然后必须以某种方式迭代数据(results.next()),因此,它们现在负责关闭连接,但是他们无权访问这样做。即使他们做到了,做起来也很麻烦-我觉得我应该能够在executeSproc(...)的静态调用中完成该类中的连接关闭,但是,如果我这样做,我可以遍历返回的数据。
我认为唯一可行的方法可能是在通过DBConnector中的结果并返回该ArrayList而不是ResultSet之后仅返回一个ArrayList,因此就处理连接而言,在调用代码中无需执行任何操作。这是最好的方法吗?还是有更标准的方法?我已经在Java的“数据库助手”中搜索了东西,但还没有真正找到任何东西。
我有一个静态实现,它关闭了类中的连接,但是由于前面提到的问题,由于调用代码而导致连接关闭太早。
代码: 这里还是一些初步的东西,请多多包涵。
public class DBConnector
{
public static final String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=JavaFXTest;integratedSecurity=true;";
Connection connection;
public DBConnector()
{
connection = null;
try
{
connection = DriverManager.getConnection(DB_URL);
}
catch (Exception ex)
{
ex.printStackTrace();
System.out.println("ERROR: Unable to establish a connection to the DB");
}
}
public ResultSet executeSproc(String sprocName,Object... params)
{
CallableStatement stmt = null;
ResultSet results = null;
// Create sproc execution - really should be using StringBuilder
String spExec = "";
spExec += "{call ";
spExec += sprocName + "(";
// Determine parameter count
int paramCount = params.length;
if (paramCount > 0)
{
for (int i = 0; i < paramCount; i++)
{
spExec += "?,"; // String.format("%s,",params[i]); // "?,";
}
spExec = StringManip.trimLast(spExec,");
}
spExec += ")}";
try
{
stmt = connection.prepareCall(spExec);
if (paramCount > 0)
{
int paramNum = 1;
for (Object param : params)
{
stmt.setObject(paramNum,param);
paramNum++;
}
}
if (stmt.execute())
{
results = stmt.getResultSet();
}
}
catch (SQLException ex)
{
}
return results;
}
public ResultSet queryDB(String selectColumns,String where)
{
Statement stmt;
try
{
stmt = connection.createStatement();
}
catch (SQLException ex)
{
stmt = null;
}
ResultSet resultSet;
String query = "";
query += "SELECT ";
if (selectColumns == "*")
{
query += "* ";
}
else
{
if (selectColumns.length() > 0)
{
String[] columns = selectColumns.split(",");
for (String column : columns)
{
query += column + ",";
}
query = StringManip.trimLast(query,") + " ";
}
else
{
// IllegalFormatException
}
}
query += "FROM " + tableName + " ";
query += where == null ? "" : "WHERE " + where;
try
{
resultSet = stmt.executeQuery(query);
}
catch (SQLException ex)
{
resultSet = null;
}
return resultSet;
}
}
我想一个快速的解决方法是将以下内容添加到DBConnector:
public void closeConnection()
{
try
{
if (connection != null)
connection.close();
}
catch (SQLException ex)
{
}
}
,在调用代码中,只需记住在完成数据库连接后就运行dbc.closeConnection()
。不过,我真的不是很想依靠它,因此,避免此类问题的解决方案的任何技巧将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。