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; //不能是一个字符流
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.