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

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

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

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

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

1.java处理事务的程序

在与数据库操作时,如果执行多条更新的SQL语句(如:update或insert语句),在执行第一条后如果出现异常或电脑断电, 则后面的SQL语句执行不了,这时候设定我们自己提交SQL语句,不让JDBC自动提交,格式为:

  1. conn.setAutoCommit(false);
  2.  
  3. stmt.addBatch("insert into people values(078,'ding','duo')");
  4. stmt.addBatch("insert into people values(30,'nokia','ddd')");
  5. stmt.executeBatch();
  6.  
  7. 执行多条SQL语句;
  8.  
  9. conn.commit(); //事务提交
  10.  
  11. //恢复自动提交模式
  12.  
  13. conn.setAutoCommit(true);
  14.  
  15. ....
  16.  
  17. if (con != null) {
  18. con.rollback();
  19. con.setAutoCommit(true);
  20. } //如果发现异常,则采取回滚

  

如果多条语句重复,只是参数不变的话可以这样

特殊情况:如果是只是参数不变,如下也是一样的

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

程序解读:

  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()方法,根据字段名将数据取出,并打印在控制台上。

2.写成存储过程

 

java执行多条SQL语句的更多相关文章

  1. Jmeter的JDBC请求执行多条SQL语句

    注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1.     下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...

  2. C#实现执行多条SQl语句,实现数据库事务

    C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...

  3. c#中执行多条sql语句【ORA-00911: 无效字符】

    问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...

  4. Spring 中jdbcTemplate 实现执行多条sql语句

    说一下Spring框架中使用jdbcTemplate实现多条sql语句的执行: 很多情况下我们需要处理一件事情的时候需要对多个表执行多个sql语句,比如淘宝下单时,我们确认付款时要对自己银行账户的表里 ...

  5. MyBatis一次执行多条SQL语句

    MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...

  6. 执行多条SQL语句,实现数据库事务(不可传入Sql参数)

    执行多条SQL语句,实现数据库事务(不可传入Sql参数) http://blog.csdn.net/hanxuemin12345/article/details/9980371

  7. 如何在Oracle中一次执行多条sql语句 (.net C#)

    关键是不能换行,要加上begin ...sql... end;     每个SQL用:隔开,end后面必须加: 以下是拷贝于:http://www.cnblogs.com/teamleader/arc ...

  8. jmert jdbc request支持执行多条sql语句并设置jdbc字符集

    1.jdbc request支持执行多条sql语句 在JDBC Connection Configuration中的sql连接字串中添加如下内容 allowMultiQueries=true 如下图: ...

  9. (学)如何在Oracle中一次执行多条sql语句

    队长同学原来的地址:https://www.cnblogs.com/teamleader/archive/2007/05/31/765943.html队长同学原来的描述: 有时我们需要一次性执行多条s ...

随机推荐

  1. Android4.0新控件

    谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常用的新控件有下面5种.  1. Switch的使用 Switch顾名思义,就是开关的意思,有开和关两种状态. 当Swit ...

  2. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  3. 用Markdown格式写一份前端简历

    1. 基本信息 姓名:xxx 手机号码:1380000xxxx 学校:南昌大学 学历:大学本科/硕士/博士 工作经验:3年以上Web前端 电子邮件:xxx@outlook.com 2. 求职意向 工作 ...

  4. 【转】awk用法介绍

    1. 介绍 Awk是由Aho.Weinberger和Kernighan三位科学家开发的,特别擅长文本处理的linux 工具,该工具是 linux 下最常用的工具之一.Awk不是普通的工具,其实,也是一 ...

  5. SQL语句-UPDATE语句

    Update语句 update语句用于修改表中已经存在的数据 单表修改语句结构 多表修改语句结构 update语句的常规用法 update students set sname='abcd',gend ...

  6. Trusted Execution Technology (TXT) --- 度量(Measurement)篇

    版权声明:本文为博主原创文章,未经博主允许不得转载.http://www.cnblogs.com/tsec/p/8413537.html 0. 导读 TXT基本原理篇介绍了TXT安全度量的基本概念,包 ...

  7. linux下网卡相关查看设置

    查整机硬件信息命令dmesg 查看网卡设备相关dmesg | grep eth 查看网卡eth0信息dmesg | grep eth0 使用ethtool命令查看指定网卡信息ethtool eth0 ...

  8. js调DLL类库中的方法实现(非com组件形式)

    1.首先,创建一个Web空项目 2.添加一个html或aspx页面 3.页面代码如所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  9. 解决AspNet Zero Core 5.0.1无法运行的问题

    最近在研究AspNet Zero Core 5.0.1时发现VS点击调试后就自动退出了,从ABP QQ群里得知作者加入了licensecode校验.经过一个周左右断断续续的折腾,算是破解了吧.原本想把 ...

  10. appium+python环境搭建

    一.环境 1.安装python. 2.安装appium. 3.安装pip 4.安装selenium 5.安装Appium-Python-Client       #cmd->cd setupto ...