【发布时间】: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