是否有关于如何创建静态数据库助手的标准?

问题描述

我希望能够拥有一个具有以下语法的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 (将#修改为@)