【问题标题】:How to insert java String value into MySQL TEXT data type?如何将 java String 值插入 MySQL TEXT 数据类型?
【发布时间】:2025-11-27 17:15:01
【问题描述】:

我正在构建一个基本的网络爬虫。我正在使用mysql-connector 连接到我计划存储数据的数据库。我无法从普通的 java String 插入 TEXT 数据类型。

当我尝试插入 String 时,我得到了这个异常:

Exception in thread "main" java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.setCharacterStream(ILjava/io/Reader;)V is abstract
    at com.mysql.jdbc.PreparedStatement.setCharacterStream(PreparedStatement.java)
    at WebCrawler.insertIntoChecked(WebCrawler.java:179)
    ...

我之前可以使用 FileReader 和方法 .setCharacterStream() 将文本文件 (.txt) 插入到 TEXT 数据类型中。但是我不能用String 做到这一点。我尝试将其转换为StringReader,然后再转换为BufferedReader,但仍然出现同样的错误。

data.head 是一个 String 包含 html 页面的头部,data.body 包含 html 页面的正文。

headbody 属性(mysql 表)为MEDIUMTEXT,其他所有属性为varchar(x)

将数据插入数据库的方法:

private void insertIntoChecked(SiteData data){
        try {
            String sql =
                    "INSERT INTO checked " +
                            "(URL,title,language, charset, content, head, body)" +
                            "VALUES " +
                            "(?, ?, ?, ?, ?, ?, ?);";
            PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, data.url);
            preparedStatement.setString(2, data.title);
            preparedStatement.setString(3, data.language);
            preparedStatement.setString(4, data.charset);
            preparedStatement.setString(5, data.content);
            BufferedReader sr1 = new BufferedReader(new StringReader(data.head));
            BufferedReader sr2 = new BufferedReader(new StringReader(data.body));
            preparedStatement.setCharacterStream(6, sr1); // the part that is causing the problem
            preparedStatement.setCharacterStream(7, sr2); // ^
            sr1.close();
            sr2.close();
            preparedStatement.execute();
            preparedStatement.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

【问题讨论】:

  • 我从未尝试将 clob 插入 MySQL 数据库。我可以告诉你,在 Oracle 中你插入了一个EMPTY_CLOB()。插入行后,您将获得对此 CLOB 的引用;从参考你得到一个Writer;那么这只是使用作家的问题。它可能是相似的。有趣的部分是插入首先发生,LOB 数据稍后流式传输(在同一事务期间)。

标签: java mysql sql jdbc


【解决方案1】:

您似乎正在尝试使用不支持此功能的驱动程序版本来使用 JDBC 4.0 功能。

如果您想使用 setCharacterStream,您应该使用 Connector/J 5.1 或更高版本,我怀疑您使用的是旧版本。

请参阅https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-implementation-notes.html 了解更多信息。

【讨论】: