我正在建立一个基本的网络爬虫。我正在使用 mysql-connector
连接到我计划存储数据的数据库。我无法插入 TEXT
来自普通java的数据类型 String
.
当我试图插入 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)
...
我可以将文本文件(.txt)插入到 TEXT
数据类型使用 FileReader
以及之前的方法.setcharacterstream()。但是我不能用一个 String
. 我试过把它转换成 StringReader
后来到 BufferedReader
,但我还是犯了同样的错误。 data.head
是一个 String
包含html页的页眉和 data.body
包含html页的正文。 head
以及 body
属性(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();
}
}
1条答案
按热度按时间jyztefdp1#
这看起来像是您试图使用JDBC4.0特性,而使用的驱动程序版本不支持此功能。
如果您想使用连接器/j 5.1或更高版本
setCharacterStream
,我怀疑你用的是旧版本。参考https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-implementation-notes.html 更多信息。