所以我有一个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语句对他们两个都很好。
2条答案
按热度按时间tkclm6bt1#
sql调试有一个公式:
在sql客户机中测试您的查询,以确保首先在那里进行调试
在代码中使用与在1中测试时完全相同的查询,以确保代码正常工作
用变量替换javasql调用中的硬编码值,并打印出所有java查询参数以确保它们是正确的。如果他们是,它应该工作!
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=?;";