首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JDBC MySQL查询语法

JDBC MySQL查询语法
EN

Stack Overflow用户
提问于 2017-05-23 01:36:21
回答 1查看 602关注 0票数 2

我正在使用JDBC尝试从这个表中选择:

代码语言:javascript
运行
复制
CREATE TABLE PERIT (
    COGNOM1 VARCHAR(30) NOT NULL,
    COGNOM2 VARCHAR(30) NOT NULL,
    DATANAIX DATE NOT NULL,
    NOM VARCHAR(30) NOT NULL,
    NIF VARCHAR(10) NOT NULL,
    LOGIN VARCHAR(50) NOT NULL,
    PASSWORDMD5  VARCHAR(50) NOT NULL,
    NUMERO INT(3) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (NUMERO)
);

我想检查是否存在具有特定登录名和PASSWORDMD5值的行,如下所示:

代码语言:javascript
运行
复制
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:未知列'LOGINPERIT1‘在'where子句’在sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法中)在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) at com.mysql。com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455) at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1369) at info.infomila.info.JDBCMySQL.Login(JDBCMySQL.java:139) at info.infomila.info.ThreadHandler.run(ThreadHandler.java:56)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-23 04:09:11

正如注释中提到的,您所得到的问题是,您为登录和密码提供的字符串没有包含在单引号中。

解决这一问题的快速方法是在定义的sql字符串中包含单引号,包括输入和密码的传入值,如@DevilsHnd在注释中提到的:

代码语言:javascript
运行
复制
String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = '" + Login + 
"' AND PASSWORDMD5 = MD5('" + pass + "');"

但是,这是一种危险的方法,我强烈建议您不要使用这种方法,因为它使登录sql无法接受SQL注入。

为了避免这种情况,您可以使用一个PreparedStatement,它将负责清理您的输入。

为此,您可以使用?替换语句参数,然后使用PreparedStatement类的方法设置它们。

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

代码语言:javascript
运行
复制
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);
}

在您的方法中,另一个值得关注的地方是,您的StatementResultSet没有在一个最终块中关闭--这可能会导致代码中的内存泄漏。

注意,我使用了一个try with资源块--它将关闭PreparedStatementResultSet,就好像它们是在一个finally块中关闭的一样。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44124440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档