我在从多个表中检索数据时遇到了困难。它将成为一个搜索表单及其关系数据库。
问题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);
答案 0 :(得分:2)
重申其他人在上面指出的内容,这是“危险”的代码。通过不使用PreparedStatements,您可以自己开始使用SQL注入攻击 - 恶意用户可以通过它创建一个SQL语句来删除表中的所有数据。正如@ craig-ringer指出的那样,从数据库中删除表格将是微不足道的提交数据。
指出了这一点后,多次强调它并用荧光黄色标记突出显示,让我们继续前进并尝试回答你的问题:
1)您可以使用SQL联接查询来自多个表的数据。 Here's a PostgreSQL tutorial on JOINS - 那里还有很多其他人,我刚刚选了我找到的第一个。
2)如果没有数据库中的确切数据,并且提供了确切的参数,则很难回答 - 但是,我想这个问题是区分大小写的。 PostgreSQL中的比较区分大小写 - 因此,如果数据库中的系列名称为“Smith”且参数为“smith”,则不会找到任何数据。因此,为简单起见,您需要将参数和数据转换为相同的情况,例如:降低。例如SELECT * FROM代理,其中LOWER(familyname)='smith'
我还要指出,您可能会遇到日期格式问题 - 再次,这将使用预准备语句解决。
看起来你对java,SQL和JDBC都很陌生;我建议你尝试按照一些教程阅读一些书籍。掌握了很多东西 - 祝你好运!