【问题标题】:java analog to C# SqlConnection and data access layer (my attempt)java 模拟 C# SqlConnection 和数据访问层(我的尝试)
【发布时间】:2010-12-28 16:59:17
【问题描述】:

我正在尝试使用 java 数据访问,所以这是我想出的:
告诉我您对此有何看法
(有点像C#中的SqlConnection)

import java.sql.*;
public class SqlConnection {

    Connection connection;

    public Connection GetConnection() {return connection;}

    public void Connect(String cs, String user, String pass)
    {
         try {
                Class.forName("net.sourceforge.jtds.jdbc.Driver");      
                connection = DriverManager.getConnection(cs, user, pass);
                System.out.println("connected");

                } catch (Exception e) {         
                e.printStackTrace();
            }   
    }

    public void Disconnect() 
    {
        if(connection != null){
            try {
                connection.close();
            } catch (SQLException e){
                e.printStackTrace();
            }
            connection = null;
        }
    }
}

我想我会这样使用它

public class MyDAL {
public Foo[] GetFoos()
{
SqlConnection conn = new SqlConnection();
PreparedStatement comm = null;
ResultSet rs = null;
         try {
             conn.Connect(cs, user, pass);           
             comm = conn.GetConnection()
             .prepareStatement("SELECT * FROM foos");
             rs = comm.executeQuery();           
             while (rs.next()) {                    
                    String s = rs.getString("name");
                    ...
                    }         
            } catch (Exception e) {         
            e.printStackTrace();
            }
            finally
            {
                               DBUtil.Close(rs);
                               DBUtil.Close(comm);
                   conn.Disconnect();
            }
}

【问题讨论】:

  • 不清楚你的问题是什么。这是否是一个好方法?这是相当主观的,但至少不需要每次需要连接时都调用Class.forName(一次就足够了),而且它似乎会吃掉异常,这使得使用它很痛苦。代码是否正确?不,它甚至不会编译。你能把事情清理一下并澄清你在问什么吗?
  • 我可以把 Class.forName 放在哪里,这样就不需要每次都调用eat(我将创建这个 SqlConnection 的许多实例)

标签: java data-access-layer sqlconnection


【解决方案1】:

如果你想学习 java JDBC 这很好。我不会使用大写的方法名称(通常是 C#,而不是 java),而是使用记录器(主要是 log4j,但选择你最喜欢的风格)而不是 stdout 和 stderr。

捕捉异常是非常糟糕的做法;最好先捕获所有特定异常,以便您可以发出合理的错误消息。如果你真的认为你可以让你的软件正常运行,你总是可以在那之后捕捉到异常。

在这种特殊情况下,我会在 Connect 中捕获特定异常并抛出我的家庭构建CannotConnectException(originalException)。这种异常并不少见,但也不是正常的流程,典型的检查异常。

如果你想做一些可扩展的事情,那么至少使用Apache DBCP,一个数据库连接池来代替。

如果您想了解大多数 Java 数据库相关应用程序中使用的东西,请选择 Hibernate 或 EJB3(也由 Hibernate 完成)。你真的不会再看到太多原始的 JDBC 应用程序了。

【讨论】:

  • 我的应用程序只需要执行来自数据库的 4 个存储过程,它们将返回一行包含 3 列数据,但它需要非常快地完成
  • 快有多快?我认为速度更多地取决于您的 SQL 服务器,而不是调用它的 java 代码。存储过程的效率和它使用的表的索引通常更重要。您显示的代码并不慢,但 hibernate 或其他任何东西都不是。
  • 嗯,是的,但是如果我只需要执行 4 个每个返回 1 或 3 个字符串的过程,我为什么还要设置休眠或其他任何东西
  • 如果那是你唯一的目标,那就没有理由了。我只是把它读作“我正在尝试用 Java 做数据库的东西,这是要走的路吗?”而不是像一次性脚本一样的东西。我真的不明白您为什么不为此使用命令行(mysql?)命令或脚本(python,perl),这对于简单的东西来说往往要简单得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多