java的preparedstatemen的setString(),setObject()匹配问题

关键代码如下:
String id =request.getParameter("id");
String password = request.getParameter("password");
Connection connection=null; PreparedStatement pStatement=null;

ResultSet rs = null;

try {

Class.forName("com.mysql.jdbc.Driver");
System.out.println("load Driver successfully");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","58546494"); String url="select * from users where id=? and passwd=?"; // jdbc:mysql://localhost:端口号/数据库名称","用户名","密码" pStatement=connection.prepareStatement(url); pStatement.setObject(1, id); pStatement.setString(2, password); rs=pStatement.executeQuery(); if(rs.next()){ request.getRequestDispatcher("/MainFrame").forward(request, response); System.out.println(id);数据库中的ID为整型,我传入其他类型服务器端不报错,重要的是ID只要前边的匹配了密码正确,就可以登陆成功,比如ID=1,密码=123,在界面输入ID 1SAFHj 这也可以登陆成功
图片说明
图片说明

/**

The JDBC specification specifies a standard mapping from
* Java Object types to SQL types. The given argument
* will be converted to the corresponding SQL type before being
* sent to the database.
*/
这是javadoc文档中对于void setObject(int parameterIndex, Object x) throws SQLException;的部分注释

JDBC规格指定了一个从Java Object类型到SQL类型的标准映射。指定的协议在发送给数据库之前可能被更改去响应SQL中的类型。
所以你的用户名最后是传到的不一定就是你写的值。至于其他的更详细的内容你可以把setObject方法的注释都看完,我在这只说重要的部分

放着void setInt(int parameterIndex, int x) throws SQLException;方法不用何必要为难自己呢

博主解决了吗,我也想知道是什么原因。

setObject通用,传值得时候,可以声明Object[] 数组
for(int i=0;i<params.length;i++){
pstmt.setObject(i+1, params[i]);
}
对于你的这个问题, 你可以试着把String id ,
使用Integer.parseInt(id)或者Integer.valueOf(id)转化为整数型然后对占位符进行赋值

我也想知道是怎么解决的

setObject 方法,只是把你传入的值进行了匹配你看看源码就知道了,至于你为什么直接能跳过肯定不是这个方法的问题,你可以调试,你看看你的代码执行完查询后倒地给你返回了什么集合。

public void setObject(int parameterIndex, Object parameterObj)
/*      */     throws SQLException
/*      */   {
/* 3521 */     if (parameterObj == null) {
/* 3522 */       setNull(parameterIndex, 1111);
/*      */     }
/* 3524 */     else if ((parameterObj instanceof Byte)) {
/* 3525 */       setInt(parameterIndex, ((Byte)parameterObj).intValue());
/* 3526 */     } else if ((parameterObj instanceof String)) {
/* 3527 */       setString(parameterIndex, (String)parameterObj);
/* 3528 */     } else if ((parameterObj instanceof BigDecimal)) {
/* 3529 */       setBigDecimal(parameterIndex, (BigDecimal)parameterObj);
/* 3530 */     } else if ((parameterObj instanceof Short)) {
/* 3531 */       setShort(parameterIndex, ((Short)parameterObj).shortValue());
/* 3532 */     } else if ((parameterObj instanceof Integer)) {
/* 3533 */       setInt(parameterIndex, ((Integer)parameterObj).intValue());
/* 3534 */     } else if ((parameterObj instanceof Long)) {
/* 3535 */       setLong(parameterIndex, ((Long)parameterObj).longValue());
/* 3536 */     } else if ((parameterObj instanceof Float)) {
/* 3537 */       setFloat(parameterIndex, ((Float)parameterObj).floatValue());
/* 3538 */     } else if ((parameterObj instanceof Double)) {
/* 3539 */       setDouble(parameterIndex, ((Double)parameterObj).doubleValue());
/* 3540 */     } else if ((parameterObj instanceof byte[])) {
/* 3541 */       setBytes(parameterIndex, (byte[])parameterObj);
/* 3542 */     } else if ((parameterObj instanceof java.sql.Date)) {
/* 3543 */       setDate(parameterIndex, (java.sql.Date)parameterObj);
/* 3544 */     } else if ((parameterObj instanceof Time)) {
/* 3545 */       setTime(parameterIndex, (Time)parameterObj);
/* 3546 */     } else if ((parameterObj instanceof Timestamp)) {
/* 3547 */       setTimestamp(parameterIndex, (Timestamp)parameterObj);
/* 3548 */     } else if ((parameterObj instanceof Boolean)) {
/* 3549 */       setBoolean(parameterIndex, ((Boolean)parameterObj).booleanValue());
/*      */     }
/* 3551 */     else if ((parameterObj instanceof InputStream)) {
/* 3552 */       setBinaryStream(parameterIndex, (InputStream)parameterObj, -1);
/* 3553 */     } else if ((parameterObj instanceof Blob)) {
/* 3554 */       setBlob(parameterIndex, (Blob)parameterObj);
/* 3555 */     } else if ((parameterObj instanceof Clob)) {
/* 3556 */       setClob(parameterIndex, (Clob)parameterObj);
/* 3557 */     } else if ((connection.getTreatUtilDateAsTimestamp()) && ((parameterObj instanceof java.util.Date)))
/*      */     {
/* 3559 */       setTimestamp(parameterIndex, new Timestamp(((java.util.Date)parameterObj).getTime()));
/*      */     }
/* 3561 */     else if ((parameterObj instanceof BigInteger)) {
/* 3562 */       setString(parameterIndex, parameterObj.toString());
/*      */     } else {
/* 3564 */       setSerializableObject(parameterIndex, parameterObj);
/*      */     }
/*      */   }

一般这种登录不是这样写的,一般是先在前端把密码直接加密掉,然后再去查,再严谨的是把查到的结果和页面传来的再去比对一次