有人可以帮助我一些初学者JDBC吗?

时间:2010-08-27 01:03:57

标签: c# java jdbc

作为一名刚接触Java的C#开发人员,我认为如果我只是展示一些C#代码就可以了,这样我就可以看到等效的Java JDBC调用了什么:

String myConnectionString = "...";
String mySql = "select name from people where id = @myId";
int myId = 123456;

List<Field> fields = new List<Field>();
using (SqlConnection conn = new SqlConnection(myConnectionString)
{
  conn.Open();
  using (SqlCommand cmd = new SqlCommand(mySql,conn))
  {
    cmd.Parameters.AddWithValue("@myId", myId);
    using(SqlDataReader rdr = cmd.ExecuteReader())
    {
      while (rdr.Read())
      {
        String name = rdr.GetString(0);
        fields.Add(name);
      }
    }
  }
}

现在我知道如果出现任何问题,上面的using语句将安全地关闭数据库,而对于java,它有点复杂(try..finally或者其他)。在java中,我不确定究竟需要处理或关闭什么(或者其他什么) - 仅限连接?还是声明呢?

如果你能给我一条腿,那就太好了。非常感谢

编辑:我非常喜欢这里的代码:(Java Exception Handling - Style

Connection conn = MyDatabaseLayer.getConnection();
try {
  ... use conn ...
}
finally {
  conn.close();
}

但是,我是否需要进行任何进一步的异常处理以确保语句和读者以及其他所有内容都被关闭?或者是否足够关闭连接?

2 个答案:

答案 0 :(得分:4)

这是对步骤的粗略解释,从一些随机页面中抄袭:

首先,加载驱动程序。这将是驱动程序jar文件中的一个类。在许多环境中,实际上,从数据源中获得这个,这有点老式,但最好还是看看它们。

Class.forName("com.imaginary.sql.msql.MsqlDriver");

然后你得到一个连接:

  Connection conn = DriverManager.getConnection("jdbc:msql://www.myserver.com:1114/....", "user1", "password");

对于不同的数据库供应商,url字符串往往不同。幸运的是,我们不经常交换数据库,因此您只需要查看一次。现在你终于可以使用该死的东西了。

PreparedStatement ps = conn.prepareStatement("SELECT * FROM FOO WHERE A=?", 1);

准备好的语句会被缓存,因此您可以将其与已插入的参数一起使用。它将使用简单的SQL语句,但为此你可以使用一个语句。您也可以调用conn.executeQuery(...)来获取resultSet,这就是您想要的。

 ResultSet rs = ps.executeQuery();

现在你可以遍历rs了,得到任何东西:

while (rs.next())
{
..
}

ResultSet也有ResultSetmetadata,它可以为您提供列名,列数#(但不是结果总数,这太容易了)。

至于try catch,您需要在使用它们后关闭语句/结果集。 每次。否则会发生坏事。就像在数据库上留下开放资源一样由于你的db connect方法可能会抛出错误,你可以在try catch中说明整个事情,并在finally块中关闭你的语句(和连接,如果你已经在这里做了)。

这就是人们在java中使用ORM框架的原因。

答案 1 :(得分:1)

这里确实需要一个try-finally块。将在即将发布的Java 7中引入using关键字的Java等价物。代码的Java端口如下所示:

// Prepare.
String url = "...";
String sql = "SELECT name FROM people WHERE id = ?";
int id = 123456;
List<String> names = new ArrayList<String>();

// Declare before try.
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;

try {
    // Acquire inside try.
    connection = DriverManager.getConnection(url);
    statement = connection.prepareStatement(sql); 
    statement.setInt(1, id);
    resultSet = statement.executeQuery();

    // Process results.
    while (resultSet.next()) {
        names.add(resultSet.getString("name"));
    }
} finally { 
    // Close in reversed order in finally.
    if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
    if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}

如果不使用连接池,在大多数情况下单独关闭Connection也会关闭StatementResultSet。虽然在JDBC API中没有严格指定,但是普通的JDBC驱动程序会隐式地这样做。但这不是正常的JDBC习惯用法。您应该明确地关闭所有资源。这使得您的代码可以安全地重用于您要引入连接池的情况。

另见: