无法从数据库获取对象

v7pvogib  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(271)

所以我有一个mysql数据库,其中有更多的表,包括:

Product with idProduct,name,price and quantity (INT,Varchar,double,int) types.
 Client with idClient,name,address,email (INT,varchar,varchar,varchar) types.

下面是select*fromclient/product的代码,其中idclient/idproduct=x。客户机的代码有效,但产品的代码无效。

public Product findById(int id) {
    Connection con=null;
    PreparedStatement stmt=null;
    ResultSet rs=null;
    int idp=0;
    String nume="";
    double pret=0;
    int q=0;

    String query="Select * from Product Where idProduct="+id+";";
    int ok=0;
    try {
        con=ConnectionFactory.getConnection();
        stmt=con.prepareStatement(query);
        rs=stmt.executeQuery();

        while(rs.next()) {
            ok=1;
            idp=rs.getInt("idProduct");
            nume=rs.getString("name");
            pret=rs.getDouble("price");
            q=rs.getInt("quantity");
        }

    }
    catch(SQLException e) {
        e.printStackTrace();
    }
    finally {
        ConnectionFactory.close(con);
        ConnectionFactory.close(stmt);
        ConnectionFactory.close(rs);
    }
    if (ok==1)
    {
    Product nou=new Product(idp,nume,pret,q);
    return nou;
    }
    else return null;
}

}

public Client findById(int id) {
    Connection con=null;
    PreparedStatement stmt=null;
    ResultSet rs=null;
    int idc=0;
    String nume="";
    String adr="";
    String em="";
    String ph="";
    String query="Select * from Client Where idClient="+id+";";
    int ok=0;
    try {
        con=ConnectionFactory.getConnection();
        stmt=con.prepareStatement(query);
        rs=stmt.executeQuery();

        while(rs.next()) {
            ok=1;
            idc=rs.getInt("idClient");
            nume=rs.getString("name");
            adr=rs.getString("address");
            em=rs.getString("email");
            ph=rs.getString("phone");
        }

    }
    catch(SQLException e) {
        e.printStackTrace();
    }
    finally {
        ConnectionFactory.close(con);
        ConnectionFactory.close(stmt);
        ConnectionFactory.close(rs);
    }
    if (ok==1)
    {
    Client nou=new Client(idc,nume,adr,em,ph);
    return nou;
    }
    else return null;
  }'''

在我看来完全一样。结果是:“”

model.Product@32eff876
    [idClient: 1 George address: Cluj email: george@y.com phone: 0722]

'''
所以它对客户有效,但对产品无效。。你能帮我吗?我查了数据库,一切正常。
这是我从mysql服务器上复制的日期,所以名称和类型都很好。我不知道它可能是什么,我删除了表,并再次创建了好几次,我也重新创建了整个数据库,但它是相同的

Table: product
 Columns:
 idProduct int AI PK 
 name varchar(45) 
 price double 
 quantity int

 Table: client
 Columns:
 idClient int AI PK 
 name varchar(45) 
 address varchar(45) 
 email varchar(45) 
 phone varchar(45)

insert语句对他们两个都很好。

tkclm6bt

tkclm6bt1#

sql调试有一个公式:
在sql客户机中测试您的查询,以确保首先在那里进行调试
在代码中使用与在1中测试时完全相同的查询,以确保代码正常工作
用变量替换javasql调用中的硬编码值,并打印出所有java查询参数以确保它们是正确的。如果他们是,它应该工作!

kqlmhetl

kqlmhetl2#

如前所述,我提供的一个评论解决了这个问题。以下只是改进代码的一种方法。 Why do you think it doesn't work? Product is showing to be non-null model.Product@32eff876. Add a toString method to product class. 直接修改查询时,可以执行sql注入。相反,提供查询并对 PreparedStatement .
在try with resources中 Package 可自动关闭的对象,以确保对象一旦超出范围就关闭。您使用connectionfactory#close执行此操作,但我敢打赌该方法调用#close。
不设置 ok 如果找到结果,则返回1,如果存在,则快速失败并从while循环返回结果。
如果没有找到结果,不要返回null,抛出一个异常,如 IllegalStateException ```
public Product findById(int id) {
String query="SELECT * FROM Product WHERE idProduct=?;";

    try (Connection con = ConnectionFactory.getConnection();
        PreparedStatement stmt = con.prepareStatement(query)) {

        stmt.setInt(1, id);

        try (ResultSet rs = stmt.executeQuery()) {
            if (rs.next()) {
                int productId = rs.getInt("idProduct");

                String name = rs.getString("name");

                double price = rs.getDouble("price");

                int quantity = rs.getInt("quantity");

                return new Product(productId, name, price, quantity);
            }
        }
    } catch(SQLException e) {
        e.printStackTrace();
    }
    throw new IllegalArgumentException(String.format("No product can be found for this id: %s", id));
}

相关问题