返回首页
当前位置: 主页 > 网络编程 > Jsp实例教程 >

excuteBatch为毛delete不好用呢?insert可以

时间:2012-06-21 21:02来源:知行网www.zhixing123.cn 编辑:麦田守望者

近几天在研究如何高效对数据库完成增删改操作;最后决定使用addBatch完成;
在操作的过程中,遇到了以下情况:
insert的批量处理没有问题;
delete的批量处理执行也没有问题,但是没有真正删除,也不报错,单独拿出SQL语句在数据库中运行也可以删除,那么问题到底出在哪里?
异常头疼的问题,开始猜吧,难道是索引造成的?序列造成的?触发器造成的?经过验证,皆不是;上网查也没有发现类似案例。
在CW同学的细心发现下;我们的字段有问题哦~
下面我就把场景还原一下:
首先,我们创建了一个很简单的表格,姓名和年龄;
create table basil(name char(10),age number(3));
第二,我们编写JAVA代码;
String sql_del = "delete from basil where name=?";
String sql_ins = "insert into basil values(?,?)";
LinkDataBase linker_del = new LinkDataBase();
Connection conn_del = linker_del.getConnection();
PreparedStatement ps_del = conn_del.prepareStatement(sql_del);
PreparedStatement ps_ins = conn_del.prepareStatement(sql_ins);
ps_ins.setString(1, "hope");
ps_ins.setInt(2, 22);
ps_ins.addBatch();
ps_ins.setString(1, "basil");
ps_ins.setInt(2, 22);
ps_ins.addBatch();
ps_ins.executeBatch();
ps_del.setString(1, "hope");
ps_del.addBatch();
int[] result = ps_del.executeBatch();
linker_del.close();
代码,没有任何问题,也能正常执行,正常执行完毕后,应该只剩下一条记录,即(basil,22);
但是,通过select * from basil;可以发现;记录还是两条(hope,22;basil,22);也即,只完成了插入操作,未成功执行删除操作。
这是为什么呢?
后来发现,是因为我们的字段有问题,我们设置的字段为name char(10),这种情况下,无论如何,该字段也要占用10个大小的空间;并不会因为未存储满而缩减空间,这也正是char和varchar的区别;
当executeBatch指令的时候,我们删除的是hope,但是实际存储的是“hope ”,所以,导致我们删除失败;
此时,我们的解决办法如下:
alter table basil modify name varchar(10); 修改char类型为varchar

 


备注:
有一点我还是没太明白,为什么用单独的delete语句可以正常删除;为什么在batch中就不允许了呢?为什么delete能自动处理;而写入batch后就不会自动处理了呢?

------分隔线----------------------------
标签(Tag):Java JAVA实例教程 JAVA基础教程 Java源代码 Java技巧
------分隔线----------------------------
推荐内容
猜你感兴趣