当前位置: 首页 > 知识库问答 >
问题:

JDBC MySQL查询语法

狄溪叠
2023-03-14

我正在使用JDBC尝试从以下表中选择:

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)
);

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

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:sun.reflect.nativeConstructorAccessorImpl.newInstance(nativeConstructorAccessorImpl.newInstance(nativeConstructorAccessorImpl.newInstance(nativeConstructorAccessorImpl.newInstance:62)sun.reflect.delegatingConstructorAccessorImpl.newInstance(ysql.jdbc.statementimpl.executeQuery(statementimpl.java:1369)在info.info.info.jdbcmysql.login(jdbcmysql.java:139)在info.info.info.threadhandler.run(threadhandler.java:56)

共有1个答案

柳墨一
2023-03-14

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

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

String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = '" + Login + 
"' AND PASSWORDMD5 = MD5('" + pass + "');"

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

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

为此,您可以使用替换语句参数,然后使用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);
}

方法中的另一个问题是语句resultset没有在finally块中关闭-这可能导致代码中的内存泄漏

注意我使用了try with resources块--这将关闭PreparedStatementResultSet,就像它们在finally块中关闭一样。

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

 类似资料:
  • Hyperledger Composer中的查询以定制的查询语言编写。查询在业务网络定义中的一个叫(queries.qry)的查询文件中定义。 查询语法 所有查询都必须包含description和statement属性。 描述 该description属性是描述查询功能的字符串。它必须包含但可以包含任何东西。 声明 该statement属性包含查询的定义规则,可以具有以下运算符: SELECT 是

  • Lucene查询语言 ElasticSearch提供的一些查询方式(query types)能够被Lucene的查询解析器(query parser)语法所支持。由于这个原因,我们来深入学习Lucene查询语言,了解其庐山真面目吧。 基础语法 用户使用Lucene进行查询操作时,输入的查询语句会被分解成一个或者多个Term以及逻辑运算符号。一个Term,在Lucene中可以是一个词,也可以是一个短

  • 问题内容: 我希望能够使用“替换为”语句更新相同架构的表。最后,我需要能够使用可能已更改的值更新大型表。 这是我用来开始的查询: 我不明白的是,数据库引擎如何知道什么是重复行,什么不是?这些数据非常重要,我不能冒险破坏数据。是否简单如“如果列出的所有列都具有相同的值,它就是重复的行”? 我只是想找出一种有效的方法来执行此操作,因此我可以在一分钟内更新> 45,000行。 问题答案: 如文档所述:

  • 问题内容: 我正在尝试按日期对我的讨论区中的帖子进行排序。这是我的代码: 这在语法上有什么问题吗?如果没有,还有什么可能是错误的?基本上发生的是结果没有显示出来。我删除了Order,它可以工作(但当然没有排序…) 问题答案: 订购应超出限制:

  • 问题内容: 当我运行查询时: 我得到错误: 如何正确制定此查询? 我在使用SQL Server 2000 问题答案: 在最后一个括号后添加一个别名。

  • 在扩展查询模式中可以使用如下特殊操作符:  或(OR)操作符: hello | world  非(NOT)操作符: hello -world hello !world  字段(field)搜索符: @title hello @body world  字段限位修饰符(版本Coreseek 3/Sphinx 0.9.9-rc1中引入): @body[50] hello  多字段搜索符: @(