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

作为Java新手的C#开发人员,我认为如果我只是展示一些C#代码可能是最简单的,这样我就可以看到等效的Java JDBC调用是什么:

String myConnectionString = "..."; String mySql = "select name from people where id = @myId"; int myId = 123456; List fields = new List(); 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中,我不确定究竟需要处理或关闭什么(或者其他什么) – 仅限连接? 还是声明呢?

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

编辑:我真的很喜欢这里的代码:( Javaexception处理 – 样式 )

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

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

这是对步骤的粗略解释,从一些随机页面中大量复制:

首先,加载驱动程序。 这将是驱动程序jar文件中的一个类。 在许多环境中,实际上,从数据源获得这个,这有点老式,但可能更好地看到螺母和螺栓。

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

然后你得到一个连接:

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

对于不同的db供应商,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框架的原因。

你确实需要一个try-finally块。 将在即将推出的Java 7中引入using Java关键字。您的代码的Java端口如下所示:

 // Prepare. String url = "..."; String sql = "SELECT name FROM people WHERE id = ?"; int id = 123456; List names = new ArrayList(); // 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习惯用法。 您应该明确地关闭所有资源。 这使您的代码可以安全地重用于您要引入连接池的情况。

也可以看看:

  • Java中“using”关键字的等价物
  • JDBC教程
  • JDBC连接池实践
  • 与MySQL的JDBC连接