【问题标题】:prepared statement with unknow arguments带有未知参数的准备好的语句
【发布时间】:2014-05-07 17:34:32
【问题描述】:

我正在尝试创建一个函数,我可以在其中连接到数据库并选择一些结果。我想用一个准备好的语句来做到这一点,但不知道给出的是什么类型的参数。

假设这是我的测试数据

int id = 5;
String name = "John Doe";

然后我想这样调用我的函数:

read("SELECT * FROM users WHERE id=?", id);

read("SELECT * FROM users WHERE id=? AND name=?",id,name);

如图所示,我得到一个或多个参数作为输入,但是当我必须将其设置为问号时,我会卡住,因为我必须说它是 String(setString) 还是 @987654326 @(setInt)。

在不知道变量是什么的情况下如何解决这个问题? (第 9 行)

1 public void read(String query, String... args){
2   try{
3       
4       Connection con = DriverManager.getConnection(databaseURL, username, password);
5       
6       PreparedStatement pstmt = con.prepareStatement(query);
7       for(int i = 0; i < args.length;i++){
8           //What do I put here?
9           pstmt.setValue(i,args[i]);
10      }


        String select = "use datapersistentie;";
        pstmt.executeQuery(select);

        ResultSet rs = pstmt.executeQuery(query); 

        while (rs.next()) {   
          // do something with the result
        }

        stmt.close();
        con.close();
    } catch (Exception e){
        System.out.println(e);
    }
}

【问题讨论】:

  • 不要自己尝试这样做。这个问题已经解决了很多次了,比如Spring Framework的JdbcTemplate类。
  • @Kayaman 感谢您的提示,但我刚刚开始使用 java 连接到数据库,所以我不直接使用 spring。我想先学习和了解JDBC的基础知识。所以我现在最好使用正常的陈述?
  • 那么不要创建这样的泛型方法。而是编写一个名为getUserById(int id)getUserByIdAndName(int id, String name) 的方法。虽然 id 听起来像一个主键,这使得它是唯一的,但同时使用 id 和名称进行选择是没有意义的。也许getUsersByName(String name)
  • 我与数据库的所有通信都具有一个功能。如果我必须为所有不同的表创建一个单独的函数,那么文件会变得更大
  • 是的,您最终会编写更多代码(以及大量样板文件),但设计会更加健壮。这是您的选择:懒惰并且设计不佳或输入更多代码并具有良好定义的数据库接口。

标签: java mysql jdbc prepared-statement


【解决方案1】:

由于您发送的是字符串参数,您只需将第 9 行更改为 setString(i+1,args[i])

如果您知道要调用它的类型,也可以使用 Object... 参数并调用 setObject(i+1,args[i])。

【讨论】:

  • 但是如果我有一个日期时间,如果我的格式正确,我仍然可以使用setString
  • 这取决于数据库 JDBC 驱动程序。有些会让你。如果您更改为 Object... 版本,您只需将 java.sql.Timestamp() 作为参数传递到正确的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
相关资源
最近更新 更多