我正在建立一个基本的网络爬虫。我正在使用 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();
}
}
这看起来像是你在尝试使用不支持JDBC 4.0功能的驱动版本。
如果您想使用JDBC 4.0,您应该使用 ConnectorJ 5.1或更高版本的驱动程序。setCharacterStream
我怀疑你使用的是旧版本。
请参考 https:/dev.mysql.comdocconnector-j5.1enconnector-j-reference-implementation-notes.html。 更多信息。