Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有未知参数的准备语句_Java_Mysql_Jdbc_Prepared Statement - Fatal编程技术网

Java 带有未知参数的准备语句

Java 带有未知参数的准备语句,java,mysql,jdbc,prepared-statement,Java,Mysql,Jdbc,Prepared Statement,我正在尝试创建一个函数,在其中我可以连接到数据库并选择一些结果。我想用一个预先准备好的语句来做,但不知道给出了什么类型的参数 假设这是我的测试数据 int id = 5; String name = "John Doe"; 然后我想这样调用我的函数: read("SELECT * FROM users WHERE id=?", id); 或 如图所示,有一个或多个参数作为输入,但当我必须将其设置为问号时,我会被卡住,因为我必须说明它是字符串(setString)还是int(setInt) 我

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

假设这是我的测试数据

int id = 5;
String name = "John Doe";
然后我想这样调用我的函数:

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

如图所示,有一个或多个参数作为输入,但当我必须将其设置为问号时,我会被卡住,因为我必须说明它是
字符串(
setString
)还是
int
setInt

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

1公共无效读取(字符串查询、字符串…参数){
2.试试看{
3.
4 Connection con=DriverManager.getConnection(数据库URL、用户名、密码);
5.
6 PreparedStatement pstmt=con.prepareStatement(查询);
7表示(int i=0;i
由于您正在发送字符串参数,您只需将第9行更改为
setString(i+1,args[i])


你也可以使用一个对象。。。参数并调用setObject(i+1,args[i]),如果您知道调用它的类型。

不要自己尝试这样做。这个问题已经解决了很多次,例如Spring Framework的
JdbcTemplate
类。@Kayaman谢谢你的提示,但我刚刚开始使用java连接到数据库,所以我不会直接使用Spring。我想先学习和理解
JDBC
的基础知识。所以我现在最好使用一个普通的语句,然后不要创建这样的泛型方法。相反,编写一个名为
getUserById(int-id)
getUserByIdAndName(int-id,String-name)
的方法。虽然id听起来像主键,这使得它是唯一的,所以用id和名称进行选择是没有意义的。也许
getUsersByName(字符串名)
?我与数据库的所有通信都有一个函数。如果我必须为所有不同的表创建一个单独的函数,那么文件将变得越来越大。是的,您将编写更多的代码(和大量的样板文件),但设计将更加健壮。这是你的选择:懒惰,设计拙劣,或者键入更多代码,并有一个良好的定义良好的数据库接口。但是,如果我有一个datetime,我仍然可以使用
setString
,如果我正确格式化了它?这取决于数据库JDBC驱动程序。有些人会让你。如果您更改为对象。。。版本中,只需在正确的位置传递一个java.sql.Timestamp()作为参数。
read("SELECT * FROM users WHERE id=? AND name=?",id,name);
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);
    }
}