无法从数据库中检索数据

时间:2013-12-12 04:05:05

标签: java mysql java-ee-6 java-ee-7

问题是: 无法从表中获取刚刚插入的数据。从错误消息看起来它看不到第一列。我知道列就在那里并插入了数据。我检查了数据库。我检查了列Number是否在名称中有一些隐藏空格。不,它没有。

尝试: 调试每一行,一切都很好,同时将数据插入数据库。 发现问题几乎就在代码的末尾:

        rs1.next();
        String s1 = rs1.getString(1);

我试着写

        rs1.first();
        String s1 = rs1.getString(1);

        rs1.first();
        String s1 = rs1.getString("Number");

下面我发布了正常工作的最终代码,我可以将数据插入表格并显示在浏览器上。

    package mypackage;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Collections;
    import java.util.LinkedList;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.QueryParam;
    import javax.ws.rs.core.Response;

    @Path("/query")
    public class CList {

        private LinkedList<SMember> contacts;

        public CList() {
        contacts = new LinkedList();
        }

        @GET
        @Path("/{CList}")
        public Response addCLocation(@QueryParam("employeeId") String eId) throws SQLException{

            String dataSourceName = "DBname";
            String dbURL = "jdbc:mysql://localhost:3306/" + dataSourceName;
            String result = "";
            Connection con = null;
            PreparedStatement ps0 = null, ps = null;
            ResultSet rs = null, rs1 = null;
            String id = eId;

            try {
                try{
                //Database Connector Driver
                Class.forName("com.mysql.jdbc.Driver");
                //Connection variables: dbPath, userName, password
                con = (Connection)    
                        DriverManager.getConnection(dbURL,"someusername","somepassword");
                    System.out.println("We are connected to database");
                    //SQL Statement to Execute
                    System.out.print(id);
                    s = con.prepareStatement("SELECT 1 FROM CList WHERE Number=?");
                                    s.setString(1, eId);
                    rs = s.executeQuery();
                    //Parse SQL Response
                    if(!rs.next()) { 
                        SMember sm = new SMember();
                        ps = (PreparedStatement) con.prepareStatement("INSERT 
                              INTO Contact_List (Number, First_Name, Last_Name, Phone_Number) " +
              "VALUES (?,?,?,?)");
                        ps.setString(1,sm.getEmployeeID());
                        ps.setString(2,sm.getFirstName());
                        ps.setString(3,sm.getLastName());
                        ps.setString(4,sm.getPhone());
                        ps.executeUpdate();
                                            ps = con.prepareStatement("SELECT Number, First_Name, 
                                                Last_Name, Phone_Number FROM CList 
                                                WHERE Number=" + eId);
                    rs1 = ps.executeQuery();
                    while(rs1.next()){
                        result = "[Added contact to contact list.  
                                                              Number: " + rs1.getString(1) + 
                            "][First_Name: " + rs1.getString(2) + 
                            "][Last_name: " + rs1.getString(3) +
                            "][Phone_Number: " + rs1.getString(4) +
                             "]\n";
                    }
                    }
                    else {
                        result = "[Contact is already on the list]";
                    }
                }
                catch(Exception e) {
                    System.out.println("Can not connect to database");
                    e.printStackTrace();
                }
                finally {
                    //Close Database Connection
                    ps0.close();
                    ps.close();
                    con.close();    
                }
            }
            catch(Exception e) {
                System.out.println(e);
            }
           //Return the Result to Browser
           return Response.status(1000).entity(result).build(); 
        } 

表格

enter image description here

1234号码是唯一的,这是我想要的号码。

您会看到号码应该是唯一的。到目前为止,我正在从SMember类中获取数据,并且它总是使相同数据不相关。我的问题的目的只是为了解决我几秒钟前插入的信息。

此外,还有SMember类,我没有在这里发布,在其构造函数中我初始化了数字,名字,姓氏和电话号码。测试目的。 我提出了所有建议的更改,但问题仍然存在。

4 个答案:

答案 0 :(得分:1)

您收到此错误是因为您的第一个查询错误,它返回一个空的结果集。

首先,

rs = s.executeQuery("SELECT 1 FROM CList WHERE Number='id'");

您的代码中的上述行不正确它应该是这样的:

**rs = s.executeQuery("SELECT 1 FROM CList WHERE Number="+id);**

然后将向数据库触发正确的查询。

其次,以下代码存在问题

if(rs.next() == false) { 
                     SMember sm = new SMember();
                     ps = (PreparedStatement) con.prepareStatement("INSERT  
                                         INTO CList (Number, First_Name, Last_Name,  
                                         Phone_Number) VALUES ('"+sm.getEmployeeID()+"', 
                                         '"+sm.getFirstName()+"', '"+sm.getLastName()+"', 
                                               '"+sm.getPhone()+"')",   
                                     Statement.RETURN_GENERATED_KEYS);
                     ps.executeUpdate(); 

在上面的代码中,您应该初始化SMember,当前在查询中的对象它们将变为null也是当您使用PreparedStatement时,您应该使用如下查询:

**ps = (PreparedStatement) con.prepareStatement("INSERT INTO CList (Number, First_Name, Last_Name,Phone_Number) VALUES (?,?,?,?)",Statement.RETURN_GENERATED_KEYS);
ps.setString(1,sm.getEmployeeID());
ps.setString(2,sm.getFirstName());
ps.setString(3,sm.getLastName());
ps.setString(4,sm.getPhoneNumber());**

答案 1 :(得分:1)

Query语句可能是一个问题“SELECT 1 FROM CList WHERE Number ='id'”,在select语句中,您的id被视为String.we需要替换为value。

- &gt;尝试这样{“SELECT 1 FROM CList WHERE Number =”+ id},

- &gt;还有一件事“从表名中选择1”将打印1,因为没有符合您条件的行。

所以我的建议是

{"SELECT * FROM CList WHERE Number="+id}

试试这个!!

答案 2 :(得分:1)

这里有几个问题。

您的问题的解决方案是您不让数据库生成密钥,这就是您以后无法请求生成密钥的原因。

查看代码的这一行:

ps = (PreparedStatement) con.prepareStatement("INSERT INTO CList (Number, First_Name, Last_Name, Phone_Number) VALUES ('"+sm.getEmployeeID()+"', '"+sm.getFirstName()+"', '"+sm.getLastName()+"', '"+sm.getPhone()+"')", Statement.RETURN_GENERATED_KEYS);

您稍后想要将Number列的值检索为生成的密钥。但是,您确实传递了该列的值,即sm.getEmployeeID()的返回值。如果传递一个值,它将不会生成(假设此列在数据库中定义为自动递增。

然而,修复此问题并不能解决所有问题,因为您的代码存在很多问题。让我列出我可以直接发现的那些:

  • 您可以通过创建新对象来初始化变量sm。但是,您仍然没有员工ID,名字,姓氏或电话号码的值,因为您没有将这些值设置为sm(或者您是否在默认构造函数中执行此操作?)。
  • 您正在尝试使用预处理语句,这很好,但实际上您并没有这样做,这非常糟糕,因为它为SQL注入打开了基础。您应该使用像INSERT INTO CList (Number, First_Name, Last_Name,Phone_Number) VALUES (?,?,?,?)之类的固定字符串,而不是像执行它一样创建查询字符串,然后在执行它之前在语句上设置值。这样一来,没有人可以通过该语句弄乱你的数据库(阅读SQL注入,只是google它以查看你将要介绍的问题)。
  • 您的员工ID似乎是您方法的eId参数。您也应该在select语句中使用它来查看它是否已经存在于您的数据库中(此处也使用预准备语句),以及稍后当id尚未存在于数据库中时的insert语句中。
  • 如果要检查特定的id,然后插入该特定的id,检索一些生成的id是没用的。您已经定义了唯一标识符。使用那个!

编辑:由于你的代码有点混乱,我已经清理了一下这个东西并修复了我可以直接找到的问题。检查这是否对您有所帮助:

public Response addCLocation(String eId) throws SQLException {

    String dataSourceName = "DBname";
    String dbURL = "jdbc:mysql://localhost:3306/" + dataSourceName;
    String result = "";
    Connection con = null;
    Statement s = null;
    PreparedStatement ps = null;
    ResultSet rs = null, rs1 = null;
    String id = eId;

    try {
      try {
        // Database Connector Driver
        Class.forName("com.mysql.jdbc.Driver");
        // Connection variables: dbPath, userName, password
        con = DriverManager.getConnection(dbURL, "someusername", "somepassword");
        System.out.println("We are connected to database");
        s = con.createStatement();
        // SQL Statement to Execute
        System.out.print(id);
        PreparedStatement alreadyThere = con.prepareStatement("SELECT 1 FROM CList WHERE Number = ?");
        alreadyThere.setString(1, eId);
        System.out.println("0");
        // Parse SQL Response
        int i = 0;
        if (rs.next() == false) {
          SMember sm = new SMember();
          ps = con
              .prepareStatement("INSERT INTO Contact_List (Number, First_Name, Last_Name, Phone_Number) VALUES (?,?,?,?)");
          ps.setString(1, sm.getEmployeeID());
          ps.setString(2, sm.getFirstName());
          ps.setString(3, sm.getLastName());
          ps.setString(4, sm.getPhone());
          ps.executeUpdate();
        }
        else {
          result = "[Contact is already on the list]";
        }
      }
      catch (Exception e) {
        System.out.println("Can not connect to database");
        e.printStackTrace();
      }
      finally {
        // Close Database Connection
        s.close();
        ps.close();
        con.close();
      }
    }
    catch (Exception e) {
      System.out.println(e);
    }
    // Return the Result to Browser
    return Response.status(200).entity(result).build();
  }

答案 3 :(得分:0)

“SELECT 1 FROM CList WHERE Number ='id'”

看起来您正在尝试实际选择Number值为'id'的记录。当您尝试对空结果集执行“rs.next()”命令时,这可能会导致错误。您是否正在尝试执行类似

的操作

“SELECT 1 FROM CList WHERE Number ='”。 ID 。 “'”? “id”是变量吗?