dbutils可以简化对数据库的CRUD操作,但是使用dbutils向数据库中插入大数据时,不能像普通的JDBC那样进行通过字符流进行(可以节省内存)。而是需要将大数据(文本)全部读到内存中,在将其写入到数据库中。
  即如下操作是错误的:

@Test
public void add() throws  Exception{
String sql = "insert into resume(resume) values(?)";
String path = UserDaoImpl.class.getClassLoader().getResource("resume.txt").getPath();
File file = new File(path);
FileReader read = new FileReader(file);
Object param = read; //<span style="color:#cc33cc;">不能是一个字符流</span>
QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());
qr.update(sql, param);
}
  此处resume在数据库中对应的是一个clob类型,因此?代表的哪个参数也必须是clob类型,Clob是个接口类,其中实现这个接口的类有SerialClob,其提供了两个构造方法
SerialClob(char[])和SerialClob(Clob),因此正确的写法如下:
@Test
public void addClobTest() throws  Exception{
String sql = "insert into resume(resume) values(?)";
String path = UserDaoImpl.class.getClassLoader().getResource("resume.txt").getPath();
File file = new File(path);
FileReader read = new FileReader(file);
char[] buf = new char[(int) file.length()];
read.read(buf);
Object param = new SerialClob(buf);
QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());
qr.update(sql, param);
}
  //查询结果如下:
mysql> select * from resume;
+----+---------------------------------------------------------------+
| id | resume                                                        |
+----+---------------------------------------------------------------+
|  1 | aaaaaaaaaaaaaaaaaddddddddddddddddddd
xsdssssssssssssssssssss |
+----+---------------------------------------------------------------+
  写入成功!!!
  因为操作大文本数据,dbutils工具必须将这个大文本读到内存中,当文本很大时,这种做法不可取,所以要是需要操作大文本或二进制数据时,好不要使用dbutils.