0

我在从多个表中检索数据时遇到困难。它将是一个搜索表单及其关系数据库。

问题1:我现在如何从多个表中检索数据?

问题2:同时我面临的另一个问题是,如果我尝试仅按姓名或姓氏进行搜索,我将无法获得任何结果。只有当我使用出生日期时才能得到结果。为什么?

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        java.io.PrintWriter out = response.getWriter();
        Connection conn = null;{ // while there is no connections, proceed to the next step
        try {
            Class.forName("org.postgresql.Driver"); // importing the driver to use the getConnection method
            conn = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/caglar", "postgres", //?searchpath=cag
                    "abracadabra");
            System.out.println("Connected to the database"); // console message
            String  agent_name  = request.getParameter("givenname"); // variable - reads from user input
            String  agent_lastname  = request.getParameter("familyname"); // variable - reads from user input
            String  dob  = request.getParameter("birthyear"); // variable - reads from user input

            ArrayList al=null;
            ArrayList agent_list =new ArrayList();

            //Problem 1: If dob is not given, it is not searching by name or lastname.

            //String query = "select * from agent where givenname='"+agent_name+"' or familyname='"+agent_lastname+"' or birthyear='"+dob+"' order by givenname";

            String query = "select * from agent where givenname='"+agent_name+"' or familyname='"+agent_lastname+"' ";
            if(dob!=null && !"".equals(dob)) // if date of birth fiel is left blank, it will still proceed to the results page
              query = query + " or birthyear='"+dob+"'"; // if date of birth exists, it will take it into account as well

            query = query+  "order by givenname"; // ordering by first name


            System.out.println("query" + query); // console message
            Statement st = conn.createStatement(); // connection statement
            ResultSet  rs = st.executeQuery(query); // executing our query


            while(rs.next())
            {
                al  = new ArrayList();

              al.add(rs.getString(1));//id
              al.add(rs.getString(2));//dob
              al.add(rs.getString(3));//name
              al.add(rs.getString(4));//lastname
              System.out.println("al :: "+al);
              agent_list.add(al);
            }

            request.setAttribute("agentList",agent_list);
4

1 回答 1

2

重申其他人在上面指出的内容,这是“危险”代码。如果不使用 PreparedStatements,您就会向 SQL 注入攻击敞开心扉——恶意用户可以通过这种攻击制作 SQL 语句来删除表中的所有数据。正如上面@craig-ringer 指出的那样,提交数据会从数据库中删除表是微不足道的。

指出了这一点,在它下面划了几次下划线并用荧光黄色标记突出显示,让我们继续尝试回答你的问题:

1)您可以使用SQL Joins从多个表中查询数据。这是关于 JOINS 的 PostgreSQL 教程——还有很多其他的,我只是选择了我找到的第一个。

2)如果没有数据库中的确切数据,并且没有提供确切的参数,很难回答 - 但是,我认为问题是区分大小写。PostgreSQL 中的比较区分大小写 - 因此如果数据库中的姓氏是“Smith”且参数是“smith”,则不会找到任何数据。因此,为简单起见,您需要将参数和数据都转换为相同的情况,例如更低。例如 SELECT * FROM agent where LOWER(familyname)='smith'

我还要指出,您可能会遇到日期格式问题 - 再次,这将使用准备好的语句来解决。

看来您对 java、SQL 和 JDBC 还很陌生;我建议您尝试遵循一些教程并阅读一些书籍。有很多事情要处理 - 祝你好运!

于 2012-04-24T06:55:04.703 回答