【问题标题】:MySQL Connector/J - Mapping Java String to MySQL INTMySQL 连接器/J - 将 Java 字符串映射到 MySQL INT
【发布时间】:2013-04-12 00:24:44
【问题描述】:

Connector/J 的documentation 表示它可以轻松地将 MySQL INT 转换为 Java String 类型。 (即从结果集映射到 Java 类型。)

但这是否反过来起作用?换句话说,您可以在 MySQL 期望 INT 的准备好的语句中使用 Java String 吗?这被认为是好的/坏的做法吗?

# pseudo-code
table EMPLOYEES 
(
    NAME VARCHAR(50)
    EMPLOYEE_NO INT(11)
)

// Java code
PreparedStatement prepStmt = 
    con.prepareStatement("SELECT * from EMPLOYEES where EMPLOYEE_NO=?");
prepStmt.setString(1, str);
ResultSet rs = prepStmt.execute(); // ...

【问题讨论】:

    标签: java mysql sql jdbc mysql-connector


    【解决方案1】:

    根据javadoc of setString()(我的重点):

    将指定参数设置为给定的 Java 字符串值。这 驱动程序将其转换为 SQL VARCHAR 或 LONGVARCHAR 值(取决于 关于参数的大小相对于驱动程序对 VARCHAR 的限制 values) 当它发送到数据库时。

    这意味着 可能 不起作用,尽管它可能会起作用(我想一个 int 在发送时就像一个字符串一样表示),但如果事情发生变化,情况可能并非如此。无论哪种方式,我都不认为这是一种好的做法,因为字符串中可能存在非整数值。

    改为:

    prepStmt.setInt(1, Integer.parseInt(str));
    

    并按您认为合适的方式处理NumberFormatException


    此外,以下行无效,因为 execute() 返回 boolean 值。:

    ResultSet rs = prepStmt.execute();
    

    相反,您可以使用:

    if (prepStmt.execute()) {
        ResultSet rs = prepStmt.getResultSet();
    }  
    

    ResultSet rs = prepStmt.executeQuery();
    

    【讨论】:

    • 谢谢,这是一个很好的观点。我猜 JavaDoc 说明了一切。出于某种原因,我正在寻找 Connector/J JavaDoc(我更容易找到它的源代码),但应该只查看规范接口。
    • 是的,代码只是为了演示,我应该写executeQuery。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多