批量执行 DDL 和 DML 

本文介绍了一个使用Java进行批量SQL操作的例子,通过关闭自动提交来提高执行效率,并展示了如何加载配置文件来获取数据库连接参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package com.enhance.jdbc;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Properties;

public class BatchTest {
	private String driver;
	private String url;
	private String user;
	private String pass;
	private Connection conn;
	private Statement stmt;
	public void initParam(String paramFile) throws Exception{
		Properties prop=new Properties();
		prop.load(new FileInputStream(paramFile));
		driver=prop.getProperty("driver");
		url=prop.getProperty("url");
		user=prop.getProperty("user");
		pass=prop.getProperty("pass");
	}
	
	//只能执行 DDL 和 DML  不能执行 select 
	public void executeBatch(String[] sqls)throws Exception{
		try{
			Class.forName(driver);
			conn=DriverManager.getConnection(url,user,pass);
			
			//关闭自动提交 ,并开启事务	
			conn.setAutoCommit(false);
			System.out.println("开启了事务!");
			stmt=conn.createStatement();
			for (String sql : sqls) {
				stmt.addBatch(sql);
			}
			int[] nums=stmt.executeBatch();  //只能执行 DDL 和 DML  不能执行 select 
			for (int i = 0; i < nums.length; i++) {
				System.out.println((i+1)+"行sql执行的结果:"+nums[i]);
			}
			conn.commit();
			System.out.println("提交了事务!");
			conn.setAutoCommit(true); //回复自动提交模式 ,主要在 线程池的时候 ,一定要复原后再放回去了,供其他 程序能正常使用 conn
		}finally{
			if(stmt!=null)
				stmt.close();
			if(conn!=null)
				conn.close();
		}
		
	}
	
	
	public static void main(String[] args) throws Exception {
		BatchTest bt=new BatchTest();
		bt.initParam("src/mysql.ini");
		String[]sqls={
				"insert into my_test values(null,'提交事务')"
				,"insert into my_test values(null,'加油')"
				,"update my_test set test_name='comme on!!' where test_id=4"
				,"{call add_proc(4,5,null)}"};// 批量更新 不能执行 PreparedStatement 和 CallableStatement
		bt.executeBatch(sqls);
	}

}

<think>好的,用户之前问过如何在Oracle中给DDL语句加回滚,现在他们的问题转向了DDLDML的区别。我需要先确认他们的背景。可能用户是数据库新手,或者刚开始接触SQL,需要基础概念的澄清。 之前的回答中,用户了解到DDL无法直接回滚,现在可能想深入理解为什么会有这样的差异,所以区分DDLDML的结构用途很重要。用户可能是在实际工作中遇到了事务管理的问题,或者在学习数据库时遇到了困惑。 需要明确DDLDML的基本定义,各自的作用,以及它们在事务处理、回滚、执行方式上的不同。还要考虑用户可能的后续问题,比如为何DDL会自动提交,或者DML如何利用事务控制。 同时,用户可能需要具体的例子来帮助理解,所以举出常见的语句例子会很有效。比如,CREATE、ALTER属于DDL,而SELECT、INSERT属于DML。此外,补充它们对数据库对象数据的不同影响,比如DDL改变结构,DML操作数据。 还要注意用户可能的误解,比如是否所有SQL语句都支持回滚,或者为什么某些操作不能撤销。需要强调自动提交的特性,以及不同数据库系统之间可能的差异,但这里用户提到的是Oracle,所以专注Oracle的特性。 最后,总结对比表格能帮助用户一目了然地看到区别,同时提供使用场景的建议,帮助他们更好地应用这些知识。需要确保语言简洁,避免技术术语过多,用用户能理解的中文表达。</think>以下是 **DDL(数据定义语言)** 与 **DML(数据操作语言)** 的核心区别解析: --- ### 一、本质区别 | | **DDL (Data Definition Language)** | **DML (Data Manipulation Language)** | |----------|--------------------------------------------------|--------------------------------------------------| | **目标** | 定义/修改 **数据库结构**(如表、索引、约束等) | 操作 **数据库中的数据**(增删改查) | | **特性** | 自动提交(无法回滚) | 需显式提交或回滚(支持事务控制) | | **资源** | 直接修改数据字典(元数据) | 仅操作用户数据 | --- ### 二、常见语句示例 | **DDL** | **DML** | |-------------------|-------------------| | `CREATE TABLE` | `SELECT` | | `ALTER TABLE` | `INSERT` | | `DROP INDEX` | `UPDATE` | | `TRUNCATE TABLE` | `DELETE` | | `RENAME COLUMN` | `MERGE` | --- ### 三、关键差异详解 #### 1. **事务与回滚** - **DDL** - 执行后 **自动提交**(隐式提交事务),无法通过 `ROLLBACK` 撤销 - 例:执行 `ALTER TABLE` 后,即使后续报错,表结构修改仍生效 - **DML** - 需通过 `COMMIT` 显式提交或 `ROLLBACK` 回滚 - 例:批量 `UPDATE` 后可回滚到修改前状态 #### 2. **执行效率** - **DDL** - 直接修改元数据,**锁表风险高**(如 `ALTER TABLE` 可能阻塞其他操作) - 例:给大表添加字段可能导致长时间锁表 - **DML** - 通常仅锁定受影响的行(取决于隔离级别) - 例:`UPDATE` 单行数据时,其他行仍可被访问 #### 3. **数据影响** - **DDL** - 修改结构时 **可能清除数据**(如 `TRUNCATE` 清空表数据) - 例:`DROP COLUMN` 会永久删除字段及其数据 - **DML** - **仅操作数据**,不改变结构 - 例:`DELETE` 可删除数据但保留表结构 --- ### 四、使用场景建议 1. **优先选择 DML** - 若只需操作数据(如更新订单状态),使用 `UPDATE` 而非重建表 - 需要事务控制时(如转账操作),必须使用 DML 2. **谨慎使用 DDL** - 生产环境避免频繁修改表结构(建议在维护窗口操作) - 执行前 **务必备份**(如 `CREATE TABLE ... AS SELECT`) --- ### 五、特殊边界案例 - **`TRUNCATE` 的争议性** 语法属于 DDL(自动提交、快速清空表),但功能接近 DML 的 `DELETE` ```sql TRUNCATE TABLE orders; -- DDL,不可回滚,重置高水位线 DELETE FROM orders; -- DML,可回滚,逐行删除 ``` - **Oracle 闪回技术** 通过 `FLASHBACK TABLE` 可部分恢复 DDL 操作(依赖undo保留时间) ```sql FLASHBACK TABLE employees TO BEFORE DROP; -- 恢复被删除的表 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值