gpt4 book ai didi

java - 根据用户输入集查询数据库 - JAVA

转载 作者:太空宇宙 更新时间:2023-11-04 11:18:28 25 4
gpt4 key购买 nike

我对编程很陌生。我正在开发一个应用程序,它有 6 个字段供用户输入,并且根据输入的输入,我必须从数据库中查询行。

这是我的表单的图像 enter image description here

我有以下输入组合:

  • 一个数字
  • B号码
  • A 数字,B 数字
  • 数字、开始日期/时间
  • A 号码、B 号码、开始日期/时间
  • B编号、开始日期/时间
  • 数字、开始日期/时间、结束日期/时间
  • B编号、开始日期/时间、结束日期/时间
  • A 数字、B 数字、开始日期/时间、结束日期/时间

用户可以通过我上面描述的所有方式输入内容。我必须根据用户输入查询数据库。

假设用户输入一个数字,那么我的查询将是

从 table_name 中选择 *,其中 Anumber = 'input'

如果用户同时输入anumber和bnumber,那么我的查询将是

从 table_name 中选择 *,其中 Anumber = 'input' AND bnumber = 'input2'

等等...

我正在分享一些我的代码,以便人们了解我到底在做什么以及可以做得更好。

if (TextAnumber.isEmpty() && TextBnumber.isEmpty() && StrUserStartDate.isEmpty() && StrUserStartTime.isEmpty()
&& StrUserEndDate.isEmpty() && StrUserEndTime.isEmpty()) {
JOptionPane.showMessageDialog(null, "Please Enter At Least One Input");
}

if (StrUserStartDate.isEmpty() && !StrUserStartTime.isEmpty()) {
JOptionPane.showMessageDialog(null, "Please Enter Start Date");
}
if (!StrUserStartDate.isEmpty() && StrUserStartTime.isEmpty()) {
JOptionPane.showMessageDialog(null, "Please Enter Start Time");
}

if (StrUserEndDate.isEmpty() && !StrUserEndTime.isEmpty()) {
JOptionPane.showMessageDialog(null, "Please Enter End Date");
}
if (!StrUserEndDate.isEmpty() && StrUserEndTime.isEmpty()) {
JOptionPane.showMessageDialog(null, "Please Enter End Time");
}

if (!StrUserEndDate.isEmpty() && !StrUserEndTime.isEmpty() && StrUserStartDate.isEmpty()
&& StrUserStartTime.isEmpty()) {
JOptionPane.showMessageDialog(null, "Please Enter Start Date/Time");
}

if (!TextAnumber.isEmpty() && TextBnumber.isEmpty() && StrUserStartDate.isEmpty() && StrUserEndDate.isEmpty()) {
ResultSet rs = stmt.executeQuery(
"select anumber,bnumber FROM CDR WHERE ANUMBER = '" + TextAnumber + "' ORDER BY ANUMBER");
while (rs.next()) {
graphNodeA = rs.getString("ANUMBER");
graphNodeB = rs.getString("BNUMBER");
graph.addNode(graphNodeA);
graph.addNode(graphNodeB);
i++;
graph.addEdge("string" + i, graphNodeA, graphNodeB);
}
}
if (TextAnumber.isEmpty() && !TextBnumber.isEmpty() && StrUserStartDate.isEmpty() && StrUserEndDate.isEmpty()) {
ResultSet rs = stmt.executeQuery(
"select anumber,bnumber FROM CDR WHERE ANUMBER = '" + TextBnumber + "' ORDER BY BNUMBER");
while (rs.next()) {
graphNodeA = rs.getString("BNUMBER");
graphNodeB = rs.getString("ANUMBER");
graph.addNode(graphNodeA);
graph.addNode(graphNodeB);
i++;
graph.addEdge("string" + i, graphNodeA, graphNodeB);
}
}
if (!TextAnumber.isEmpty() && !TextBnumber.isEmpty() && StrUserStartDate.isEmpty()
&& StrUserEndDate.isEmpty()) {
ResultSet rs = stmt.executeQuery("select anumber,bnumber FROM CDR WHERE ANUMBER = '" + TextAnumber
+ "' AND BNUMBER = '" + TextBnumber + "' ORDER BY ANUMBER");
while (rs.next()) {
graphNodeA = rs.getString("ANUMBER");
graphNodeB = rs.getString("BNUMBER");
graph.addNode(graphNodeA);
graph.addNode(graphNodeB);
i++;
graph.addEdge("string" + i, graphNodeA, graphNodeB);
}
}

为此,我使用了 If/Else,这对我来说似乎非常复杂,而且代码看起来也非常粗糙。

我想问的是,对于这种问题是否有更好的解决方案?我希望我能在这里解决我的问题:)

最佳答案

为了改进代码,我的建议是使用 Hibernate 标准。它不仅可以改进您的代码,还可以防止您的应用程序问题,例如 sql 注入(inject)。例如,假设您的表的 hibernate 类是 CDR.java,您可以按如下所示处理查询:

    Criteria cr = session.createCriteria(CDR.class);
if (!TextAnumber.isEmpty()) {
cr.add(Restrictions.eq("ANUMBER", TextAnumber));
}
if (!TextBnumber.isEmpty()) {
cr.add(Restrictions.eq("BNUMBER", TextBnumber));
}
//make sure to format your date to the right format
if (!StrUserStartDate.isEmpty().isEmpty()) {
cr.add(Restrictions.gt("StartDate",StrUserStartDate));
}
if (!StrUserEndDate.isEmpty().isEmpty()) {
cr.add(Restrictions.lt("EndDate",StrUserEndDate));
}

List results = cr.list();

另一项改进是为重复代码创建新方法,以提高可读性和修复错误。

有关 hibernate 的更多信息,请参阅此处的文档: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

这里还有一个关于它的很棒的教程: https://www.tutorialspoint.com/hibernate/hibernate_criteria_queries.htm

关于java - 根据用户输入集查询数据库 - JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45185637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com