mysql执行多条语句


最近因为删除信息的自增序列断裂问题,不得不重新排序,也就是需要在java代码中执行多条sql语句。

问题引出

最开始,是这样做的
在这里插入图片描述
在mysql中执行以上代码,发现序列重新排好了,详见:https://blog.csdn.net/xd15010130025/article/details/89319380
但是在java中运行却遇到了一下问题,将sql语句拼接在一起
在这里插入图片描述
报错为

在这里插入图片描述
可是语句明明和mysql中的语句一模一样呀?到底是什么原因呢?

解决

step1:

在查询使用sql语句的格式错误问题后,很确定自己并没有犯什么格式错误,于是查找:使用sql语句雨要注意什么问题?这篇文章映入眼帘:https://www.cnblogs.com/speedwade/p/3994476.html ,java中竟然不能在sql中加分号,也就是说我之前是用的字符串拼接方法是错的。那么多条语句要怎么执行呢?

step2:

思路理顺之后,解决起来就很简单了。

代码

这里给出示例代码:

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);
        }
    }
  
}

代码解读

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

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

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

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

参考

https://www.cnblogs.com/speedwade/p/3994476.html
http://www.cnblogs.com/kxdblog/p/4115326.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值