多个复选框选项存储在数据库的单个字段中

时间:2013-03-05 20:30:08

标签: java html mysql

我在.jsp中使用HTML,在servlet中使用Java来处理jsp。

我有一个Skills表单,有12个复选框可供选择。 显然可以选择多个,然后我想将它们发送到数据库。 (例如,Adam可以拥有Java和C ++,Bob只拥有Java)。

我希望我的数据库中只有一个字段包含所有复选框的信息。目前,我将这些技能作为一个字符串与" "分开,然后当我尝试检索信息时,我得不到正确的信息。 例如,如果我搜索任何带有“Java”的员工,我会回复Bob的详细信息而不是Adam的信息,因为它是字符串“Java C ++”的一部分而不是单独的。

您对如何将多个复选框选项存储到数据库中的单个字段中有任何建议吗?但是可以将它们分开以便于检索?

3 个答案:

答案 0 :(得分:2)

正如Jrod指出的那样,使用LIKE关键字可能会满足您的需求。

然而,从侧面说明,从长远来看,还有其他方法可能更好。

1-N关系

如果您在单独的表格中拥有自己的技能,则可以将它们以一对多的关系连接起来,这意味着您可以按技能查询,然后将相关人员加入查询。这将使您能够拥有更复杂的查询,例如能够搜索多个匹配技能或条件匹配技能,而不是其他技能。

位标志

正如你所说他们是复选框我假设你的技能是有限的(通过复选框的数量)另一种方法是使用整数和使用位标志 - 例如:

  • Java = 1
  • C ++ = 2
  • Lisp` = 4
  • haskell = 8
  • Python = 16

将所有复选框中的累计值相加并将其存储为整数将允许您使用bitwise AND(&)

查询数据库

答案 1 :(得分:1)

尝试使用LIKE运算符代替预备语句中的=

PreparedStatement statement = con.prepareStatement ("SELECT * FROM servlet WHERE skill LIKE '%" + Skills + "%'AND year ='"+ Years+"'");

要根据两种技能进行选择,您可以链接相似的语句:

PreparedStatement statement = con.prepareStatement ("SELECT * FROM servlet WHERE skill LIKE '%" + Skill1 + "%'AND skill LIKE '%" + Skill2 + "%'AND year ='"+ Years+"'");

答案 2 :(得分:0)

你可以使用

 StringBuffer sql = new StringBuffer();
String skills[]=req.getParameterValues("skills");
sql.append("select * from skillRelation where ");

for(int i=0;i<skills.length;){
  sql.append(" skill like '%").append(skills[i]).append("%'");
  if(++i < skills.length) {
    sql.append(" and ");
  }
}