如何为两个查询条件执行单个 Prepared Statement

Posted

技术标签:

【中文标题】如何为两个查询条件执行单个 Prepared Statement【英文标题】:How to execute single PreparedStatement for two querys conditions 【发布时间】:2015-02-01 20:21:04 【问题描述】:

我希望查询根据用户编号检索结果。另一个查询按用户名检索。我做了一些工作,但在 NetBeans 中它没有显示任何错误,并且通过输出它只是停留在最初的 if() 条件

如果我在此过程中做错了什么,请帮助我解决...

<% String val_name = request.getParameter("name");
String val_number = request.getParameter("number");
String query;
if((val_name != null)&&(val_number != null))  %>
    <h4> Use only one Column for Search </h3>
<% 
else if((val_name == null)&&(val_number == null))  %>
    <h4> Enter any Information on above field ... </h4>
<% 
else 
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","hari","root");  Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","hari","root");
    PreparedStatement stat;
    ResultSet rs;
    if(val_number != null) 
        query= val_number;                // user Entered only Number Field ...
        String sql="SELECT * FROM EMP WHERE EMPNO= ?";
        stat=con.prepareStatement(sql);
        stat.setString(1,val_number);
        rs=stat.executeQuery();
    
    else 
        query= val_name;  // user Entered only Name Field ...
        String sql="SELECT * FROM EMP WHERE ENAME = ?";
        stat=con.prepareStatement(sql);
        stat.setString(1,val_name);
        rs=stat.executeQuery();
    

    try 
        if(rs!=null) 
            %>
            <br>
            <table class="gridtable" border=1 cellspan=60 cellpadding=16>
            <tr>
            <th> Emp ID </th>
            <th> Emp Name </th>
            <th> Emp Dept </th>
            <th> Emp D.o.B </th>
            <th> Show Record </th>
            <th> Record Update </th>
            <th> Compassionate </th>
            </tr>
            <%
            while(rs.next()) 
                %>
                <tr>
                <td><%= rs.getInt("EMPNO")%> </td>
                <td><%= rs.getString("ENAME") %> </td>
                <td><%= rs.getString("JOB")%> </td>
                <td><%= rs.getInt("DEPTNO")%> </td>
                <td><button><a  class="ui-button" type="button" href="/result.jsp?name="<%=name%> target="destination"> Show </a> </buton></td>
                <td><button><a  class="ui-button" type="button" href="/update.jsp?name="<%=name%> target="destination"> Update </a> </buton></td>
                <td><button><a  class="ui-button" type="button" href="/compassionate.jsp?name="<%=name%> target="destination"> Compassionate </a> </buton></td>
                </tr>
                <%
            
        
    
    catch(SQLException e) 
        e.printStackTrace();
    
    con.close();
%>

【问题讨论】:

不要在 JSP 中嵌入 JDBC 代码。 Model 1 不可扩展,15 多年没有在工业中广泛使用。 但这只是用于测试小型应用程序... [最多 20 条记录] 好的,我会听从您的建议...但是您可以就问题提出任何建议... if-else 链之前定义ResultSet。另外,请意识到这段代码非常脆弱。 是的,我做了那一步..并且还编辑了..我可以看到编辑后的代码,就像你说的那样,兄弟 【参考方案1】:

您的ConnectionPreparedStatementResultSet 都在您的最后一个else 块中定义。将它们移到顶部。

else           
    String url = "jdbc:oracle:thin:@localhost:1521:XE";
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection con = DriverManager.getConnection(url,"hari","root"); 
    PreparedStatement stat;
    ResultSet rs;

定义变量如

String val_name = request.getParameter("name"); 
String val_number = request.getParameter("number"); 
String query; 
String url = "jdbc:oracle:thin:@localhost:1521:XE";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = null; 
PreparedStatement stat = null;
ResultSet rs = null;

然后设置if-else 链中的值。

【讨论】:

以上是关于如何为两个查询条件执行单个 Prepared Statement的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何为具有两个范围条件的查询建立索引?

如何为 Amazon redshift 数据库编写查询,使相关查询的 where 子句具有两个条件?

如何为 Firebase 实时数据库上的单个查询启用离线功能?

PDO Prepared在单个查询中插入多行

如何为单个列中存在的值添加多个条件并将结果显示在单独的列中?

如何为 3 个不同的事件(信号量、pthread 条件和阻塞套接字接收)阻塞单个线程?