Java JDBCMySQL查询语法

Java JDBCMySQL查询语法,java,mysql,jdbc,Java,Mysql,Jdbc,我正在与JDBC合作,试图从这个表中选择: 创建表包( COGNOM1 VARCHAR(30)不为空, COGNOM2 VARCHAR(30)不为空, DATANAIX日期不为空, NOM VARCHAR(30)不为空, 如果VARCHAR(10)不为空, 登录VARCHAR(50)不为空, PASSWORDMD5 VARCHAR(50)不为空, 数字整数(3)非空自动增量, 主键(数字) ); 我想检查是否存在具有特定登录名和密码MD5值的行,如下所示: public int Login(S

我正在与JDBC合作,试图从这个表中选择:

创建表包(
COGNOM1 VARCHAR(30)不为空,
COGNOM2 VARCHAR(30)不为空,
DATANAIX日期不为空,
NOM VARCHAR(30)不为空,
如果VARCHAR(10)不为空,
登录VARCHAR(50)不为空,
PASSWORDMD5 VARCHAR(50)不为空,
数字整数(3)非空自动增量,
主键(数字)
);
我想检查是否存在具有特定登录名和密码MD5值的行,如下所示:

public int Login(String Login, String pass) {
    Statement st = null;
    ResultSet rs = null;
    int count =0;
    try {
        st = con.createStatement();
        String consulta = "Select count(*) from Perit p where p.LOGIN =";
        consulta += Login;
        consulta +=" and p.PASSWORDMD5 = MD5(";
        consulta +=pass;
        consulta+=")";
        rs =  st.executeQuery(consulta);
        while (rs.next()) {
            count = rs.getInt(1);
        }
        st.close();
        rs.close();
    } catch (SQLException ex) {
       Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
    }

    return count;
}
但是当我调用
Login(“LOGINPERIT1”,“PASSWORDMDPERIT”)
时,我得到了以下错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知 位于“where子句”中的“LOGINPERIT1”列 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:423) 位于com.mysql.jdbc.Util.handleNewInstance(Util.java:425) com.mysql.jdbc.Util.getInstance(Util.java:408)位于 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)位于 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)位于 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)位于 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)位于 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)位于 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497)位于 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455)位于 com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1369)位于 info.infomila.info.JDBCMySQL.Login(JDBCMySQL.java:139)位于 info.infomila.info.ThreadHandler.run(ThreadHandler.java:56)


正如评论中提到的,您遇到的问题是,您为登录和密码提供的字符串没有用单引号括起来

解决此问题的快速方法是在注释中包含@DevilsHnd提到的登录和密码传入值之前和之后,在定义的sql字符串中包含单引号:

String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = '" + Login + 
"' AND PASSWORDMD5 = MD5('" + pass + "');"
然而,这是一种危险的方法,我强烈建议您不要使用这种方法,因为它使您的登录sql不易被sql注入攻击

为了避免这种情况,您可以使用一种可以为您的输入进行消毒的方法

要做到这一点,请使用
替换语句参数,然后使用PreparedStatement类的方法设置它们

以下是如何实现这一目标的示例:

String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = ? AND PASSWORDMD5 = MD5(?);"
try(PreparedStatement pstmt = con.prepareStatement(consulta))
{
    pstmt.setString(1, login); 
    pstmt.setString(2, pass); 
    try(ResultSet rs = pstmt.executeQuery())
    {
        count = rs.getInt(1);
    }
} 
catch (SQLException ex) 
{
    Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
}
方法中另一个值得关注的方面是,
语句
结果集
未在finally块中关闭-这可能导致代码内存泄漏

请注意,我使用了try with resources块,它将关闭
PreparedStatement
ResultSet
,就像它们在finally块中关闭一样

我就把这张xkcd漫画留在这里


使用PreparedStatement,使用起来更安全。但是,出现错误的原因是
字符串
需要单引号,否则它会将其视为列名检查此列是否存在“LOGINPERIT1”您的字符串,即登录名和密码没有引号。请引用它们并检查。或许可以尝试以下操作:
String consulta=“从Perit中选择COUNT(*),其中LOGIN='“+LOGIN+”,PASSWORDMD5='MD5(“+pass+”);”。注意登录和密码使用单引号?在双引号之前,您需要添加单引号