代码之家  ›  专栏  ›  技术社区  ›  Chris

有人能帮我一些JDBC初学者吗?

  •  4
  • Chris  · 技术社区  · 14 年前

    作为一名刚接触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 回复  |  直到 7 年前
        1
  •  4
  •   Steve B.    14 年前

    以下是对这些步骤的粗略解释,从一些随机页面上随意复制:

    首先,加载驱动程序。这将是驱动程序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语句一起工作,但是为此,您可以只使用一个语句。你也可以打个电话连接执行(…)获取结果集,这是您想要的。

     ResultSet rs = ps.executeQuery();
    

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

    ResultSets还有ResultSetmetadata,它可以提供列名、列数(但不能提供结果总数,这太简单了)。

    至于try-catch,您需要在使用它们之后关闭语句/结果集。 每一次 . 否则坏事就会发生。比如在数据库上留下开放资源。因为db connect方法可能会抛出错误,所以您可以在try catch中捕获整个过程,并在finally块中关闭语句(以及连接,如果您在这里完成了的话)。

    这就是为什么人们在java中使用ORM框架。

        2
  •  1
  •   Community Fabien Hure    4 年前

    try-finally 在这里封锁。Java等价于 using 关键字将在即将到来的Java7中引入。代码的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 在大多数情况下,独自一人也会关闭 Statement ResultSet