东西总是不完美的,最近想完善一下之前做的考试系统,想在录入试题的时候能一批批地录入,而不是一道道地录入,想节省时间吧,就想用jdbc中的批处理进行录入,从而提高效率吧。
一、数据库设计代码
代码
--建一个测试表
CREATE TABLE summer(
id int primary key ,
name varchar(20) not null ,
sex varchar(20) not null
)
--存储过程
CREATE PROCEDURE p_test
@id int,
@name varchar(20),
@sex varchar(20),
@out_message nvarchar(2) output
AS
BEGIN TRAN
SET @out_message=''
BEGIN TRY
insert into summer (id,name,sex) values(@id,@name,@sex)
IF @@rowcount=0
SET @out_message='0'
END TRY
BEGIN CATCH
SET @out_message='0'
END CATCH
IF @@ERROR<>0
ROLLBACK TRAN A
ELSE
IF @out_message=''
SET @out_message='1'
COMMIT TRAN A
GO
二、程序端代码
代码
1 //声明
2 Collection c=new Vector();
3 Object[] str;
4 int count;
5 String sex=null;
6
7 //button(增加)的功能
8 if("".equals(text1.getText()) || text1.getText()==null){
9 JOptionPane.showMessageDialog(null,"输入不能为空!");
10 }else{
11 c.add(text1.getText());
12 text1.setText("");
13 str=c.toArray();
14 }
15
16 //button(提交)的功能
17 System.out.println(new Date()); //数据插入前系统的时间
18 String sql="{call p_test(?,?,?,?)}";
19 String sql1="select count(*) from summer";
20 try {
21 rs=stmt.executeQuery(sql1);
22 if(rs.next()){
23 count=rs.getInt(1);
24 }
25 PreparedStatement cs=conn.prepareStatement(sql);
26 if(c.size()==0){
27 JOptionPane.showMessageDialog(null,"没有数据录入!");
28 }else{
29 for(Object s:str){
30 cs.setInt(1,++count);
31 cs.setString(2,s.toString());
32 if(count%2==0){
33 sex="male";
34 }else{
35 sex="female";
36 }
37 cs.setString(3,sex);
38 cs.setString(4,"");
39 cs.addBatch();
40 }
41 cs.executeBatch();
42 conn.commit();
43 }
44 System.out.println(new Date()); //数据插入提交系统的时间
45 } catch (SQLException e) {
46 e.printStackTrace();
47 }
三、程序运行截图
四、程序执行后截图
五、个人收获
收获:批处理+存储过程实现起来感觉还是比较方便,感觉sql语句不用写那么多吧,也可以防止当系统中途崩溃而造成数据库出现数据不一致等问题吧。
六、一些问题
问题:1、其实我还不太懂存储过程的作用,我感觉他在效率方面也并不怎么高,也许是没有经过大量的数据测试,所以感觉不到吧。
2、其实我觉得这个也不太好,因为他也是先一道道的录入容器里的,然后提交的时候能保证数据不会出现因为系统问题造成一些数据不一致等问题吧。其实我在第一次做批处理的时候,曾经拿了三个textField进行测试,最后感觉控件多了很烦人,就想用一个textField代替,结果就用了一个button去代替了另人的两个textField,但感觉还是不太好吧。还是想能不能通过其它的途径去实现。