Java 一次执行多条SQL

8 篇文章 0 订阅
概要:

本实例将演示如何一次执行多条SQL语句,这些SQL语句可以是插入语句、更新语句和删除语句。本实例以myuser数据库中的staff表为例。

| |

目录 


  • 1技术要点
  • 2代码实现
  • 3程序解读

1技术要点

一次执行多条SQL的技术要点如下:

  • DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能使用new来创建DatabaseMetaData对象,但是可以通过Connection的getMetaData()方法创建。例如:DatabaseMetaData md=con.getMetaData()。

  • DatabaseMetaData类的supportsBatchUpdates方法用于判断此数据库是否支持批量更新。其返回值类型为boolean,如果此数据库支持批量更新,则返回true;否则返回false。

  • Statement的addBatch(String sql)方法将给定的SQL命令添加到此Statement对象的当前命令列表中,此方法可多次调用。

  • Statement的executeBatch()方法的作用是将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

2代码实现


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package  net.xsoftlab.baike;
import  java.sql.Connection;
import  java.sql.DatabaseMetaData;
import  java.sql.DriverManager;
import  java.sql.ResultSet;
import  java.sql.SQLException;
import  java.sql.Statement;
public  class  Batch {
     /** 判断数据库是否支持批处理 */
     public  static  boolean  supportBatch(Connection con) {
         try  {
             // 得到数据库的元数据
             DatabaseMetaData md = con.getMetaData();
             return  md.supportsBatchUpdates();
         catch  (SQLException e) {
             e.printStackTrace();
         }
         return  false ;
     }
     /** 执行一批SQL语句 */
     public  static  int [] goBatch(Connection con, String[] sqls)  throws  Exception {
         if  (sqls ==  null ) {
             return  null ;
         }
         Statement sm =  null ;
         try  {
             sm = con.createStatement();
             for  ( int  i =  0 ; i < sqls.length; i++) {
                 sm.addBatch(sqls[i]); // 将所有的SQL语句添加到Statement中
             }
             // 一次执行多条SQL语句
             return  sm.executeBatch();
         catch  (SQLException e) {
             e.printStackTrace();
         finally  {
             sm.close();
         }
         return  null ;
     }
     public  static  void  main(String[] args)  throws  Exception {
         System.out.println( "没有执行批处理时的数据为:" );
         query();
         String[] sqls =  new  String[ 3 ];
         sqls[ 0 ] =  "UPDATE staff SET depart='Personnel' where name='mali'" ;
         sqls[ 1 ] =  "INSERT INTO staff (name, age, sex,address, depart, worklen,wage) VALUES ('mali  ', 27, 'w', 'china','Technology','2','2300')" ;
         sqls[ 2 ] =  "DELETE FROM staff where name='marry'" ;
         Connection con =  null ;
         try  {
             con = getConnection(); // 获得数据库连接
             boolean  supportBatch = supportBatch(con);  // 判断是否支持批处理
             System.out.println( "支持批处理? "  + supportBatch);
             if  (supportBatch) {
                 int [] results = goBatch(con, sqls); // 执行一批SQL语句
                 // 分析执行的结果
                 for  ( int  i =  0 ; i < sqls.length; i++) {
                     if  (results[i] >=  0 ) {
                         System.out.println( "语句: "  + sqls[i] +  " 执行成功,影响了"
                                 + results[i] +  "行数据" );
                     else  if  (results[i] == Statement.SUCCESS_NO_INFO) {
                         System.out.println( "语句: "  + sqls[i] +  " 执行成功,影响的行数未知" );
                     else  if  (results[i] == Statement.EXECUTE_FAILED) {
                         System.out.println( "语句: "  + sqls[i] +  " 执行失败" );
                     }
                 }
             }
         catch  (ClassNotFoundException e1) {
             throw  e1;
         catch  (SQLException e2) {
             throw  e2;
         finally  {
             con.close(); // 关闭数据库连接
         }
         System.out.println( "执行批处理后的数据为:" );
         query();
     }
     public  static  Connection getConnection() { // 数据库连接
         Connection con =  null ;
         try  {
             Class.forName( "com.mysql.jdbc.Driver" ); // 加载Mysql数据驱动
             con = DriverManager.getConnection(
                     "jdbc:mysql://localhost:3306/myuser" "root" "123456" );// 创建数据连接
         catch  (Exception e) {
             System.out.println( "数据库连接失败" );
         }
         return  con;
     }
     public  static  void  query()  throws  Exception { // 查询所有的数据
         Connection con = getConnection();
         Statement st = con.createStatement();
         ResultSet rs = st.executeQuery( "select * from staff" );
         while  (rs.next()) {
             String name = rs.getString( "name" );
             int  age = rs.getInt( "age" );
             String sex = rs.getString( "sex" );
             String address = rs.getString( "address" );
             String depart = rs.getString( "depart" );
             String worklen = rs.getString( "worklen" );
             String wage = rs.getString( "wage" );
             System.out.println(name +  " "  + age +  " "  + sex +  " "  + address
                     " "  + depart +  " "  + worklen +  " "  + wage);
         }
     }
}

3

程序解读

  1. support_Batch()方法判断数据库是否支持SQL语句的批处理。通过Connection的getMetaData方法获得数据库的元数据对象DatabaseMetaData,再调用DatabaseMetaData supportsBatchUpdates方法判断数据库是否支持批处理。

  2. startBatch()方法执行一组SQL语句。首先创建执行SQL语句的Statement对象,通过Statement类的addBatch方法将待执行SQL语句添加到执行缓冲区中,再调用executeBatch方法将执行缓冲区中的SQL语句全部执行,返回一个整型数组,如果数组元素的值大于等于0,则表示该语句执行成功,该值表示了执行该SQL语句修改的记录的行数;如果数组元素的值等于Statement.SUCCESS_NO_INFO常量,表示该语句也执行成功,但不知道具体修改了多少条记录;如果数组元素的值等于Statement.EXECUTE_FAILED常量,表示该语句执行失败。

  3. getConnection()方法封装了数据库的连接方式。如果在程序中需要使用数据库,直接调用此方法即可。

  4. query()方法的作用是查询数据库,传入执行查询语句的Statement对象和待执行的SQL语句,通过Statement的executeQuery方法执行SQL语句,返回一个ResultSet对象。再调用ResultSet的next()方法,根据字段名将数据取出,并打印在控制台上。

转自:
编程百科: https://baike.xsoftlab.net/view/138.html


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值