Java 在mysql中是否可以将表本身的属性名作为字符串传递?

Java 在mysql中是否可以将表本身的属性名作为字符串传递?,java,mysql,Java,Mysql,我有一个带有属性id和name1、name2、name3……name10的表,其中所有这十个名称都属于该id id name1 name2 name3 name4 name5 name6 name7 name8 name9 name10 201 ijk lmn xyz abc efg hks dkm jjl dkn awt 202 mjl pan van slm tko kds jar slk dkf asd 现在

我有一个带有属性id和name1、name2、name3……name10的表,其中所有这十个名称都属于该id

id   name1 name2 name3 name4 name5 name6 name7 name8 name9 name10
201  ijk   lmn   xyz   abc   efg   hks   dkm   jjl   dkn   awt
202  mjl   pan   van   slm   tko   kds   jar   slk   dkf   asd
现在,我需要检索id,以10个名称中遇到的名称为准。如果它是一个print语句,则很容易通过保持字符串名称不变来使用循环增加数字。但是在使用mysql语句时如何做到这一点呢?首先,甚至可以将属性名作为字符串传递吗

例如:当传递where条件的字符串时

String uname=jf1.getText();
PreparedStatement stmt=conn.prepareStatement("Select * from staff where id = ?");
stmt.setString(1,uname);
ResultSet rs=stmt.executeQuery();
rs.next();
但是当我需要检查从name1到name10的所有属性时,会是这样吗

String uname=jf1.getText();
PreparedStatement stmt=conn.prepareStatement("Select id from staff where ?=?");
for(int i=1;i<=10<i++)
stmt.setString(1,"name"+i);
stmt.setString(2,uname);

其中uname由用户通过文本字段给出。

否,这是不可能的:表名和表属性都不能作为参数值传递。如果使用?=?运行代码,JDBC将指示RDBMS比较name+i和uname这两个值以获得结果

在这种情况下,需要动态生成查询。假设属性名称已正确清理,则这很好

另一种选择是包含所有十列的语句,如下所示:

PreparedStatement stmt=conn.prepareStatement(
    "select * from staff where ? = case ? when 1 then name1 when 2 then name2 when 3 then name3 ... else null end"
);

现在,您可以将值绑定到第一个参数,将名称列的编号绑定到第二个参数。

使用IN

SELECT
   id
FROM
   staff
WHERE
   ? IN (name1, name2, name3, name4, name5,
         name6, name7, name8, name9, name10);

@Luiggi Mendoza,你怎么可能在我按下“发布问题”按钮的同时编辑标题?那是不可能的。你在15:46:49Z发布了你的问题,我的编辑时间是15:47:02Z。有几秒钟的区别:我认为这个句子既不应该是表属性,也不应该是表名。无论如何,那么我如何完成这个操作呢?所以我假设stmt.setString也应该被分配到10。例如:stmt.setString1,name1;stmt.setString2,name2;。。。。stmt.setString10,name10@学习者它应该是stmt.setInt2,因为案例比较了?参数设置为整数。联埃特派团现在处于指数1。代码的其余部分保持不变-即只有两个参数。如果在任何时候添加了其他属性(如名称11或地址等),这种查询方式将不起作用,对吗?@learner Correct-添加新属性名称将要求您更改查询的SQL。您可能会对其进行配置以避免重新编译,但很可能需要重新编译以支持与新添加的属性相关联的其余功能。您还可以通过一个简单的循环生成SQL,该循环生成一个嵌入到查询其余部分的CASE表达式。