遇到这么个问题,2个表:TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS)
TB_USER(COL_ID,COL_USERNAME,parentID)
TB_USER的 parentID 外键 到 TB_PARENT的COL_ID(主键)
先上代码:
Connection conn = ConnectionPool.getConnection();// 获得数据库连接
try {
conn.setAutoCommit(false);
} catch (SQLException e2) {
e2.printStackTrace();
}
String sql="INSERT INTO TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS) VALUES(?,?,?)";
String sql2="INSERT INTO TB_USER(COL_ID,COL_USERNAME,parentID) VALUES(?,?,?)";
PreparedStatement psmt=null,psmt2=null;
try {
psmt=conn.prepareStatement(sql);
psmt.setInt(1, 201);
psmt.setString(2, "parent1");
psmt.setString(3, "shanghai");
psmt.execute();
psmt2=conn.prepareStatement(sql2);
psmt2.setInt(1, 200);
psmt2.setString(2, "nihao");
psmt2.setInt(3, 201);
psmt2.execute();
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally{
try {
psmt.close();
psmt2.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
会报出 java.sql.SQLException: ORA-02291: 违反完整约束条件 (USERNAME.FK_T) - 未找到父项关键字
(USERNAME.FK_T)是这个外键名字
但是,我把 psmt 和 psmt2的执行的位置颠倒下 就可以插入了 没有任何报错
代码如下:
Connection conn = ConnectionPool.getConnection();// 获得数据库连接
try {
conn.setAutoCommit(false);
} catch (SQLException e2) {
e2.printStackTrace();
}
String sql="INSERT INTO TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS) VALUES(?,?,?)";
String sql2="INSERT INTO TB_USER(COL_ID,COL_USERNAME,parentID) VALUES(?,?,?)";
PreparedStatement psmt=null,psmt2=null;
try {
psmt2=conn.prepareStatement(sql2);
psmt2.setInt(1, 200);
psmt2.setString(2, "nihao");
psmt2.setInt(3, 201);
psmt2.execute();
psmt=conn.prepareStatement(sql);
psmt.setInt(1, 201);
psmt.setString(2, "parent1");
psmt.setString(3, "shanghai");
psmt.execute();
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally{
try {
psmt.close();
psmt2.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
想不通啊 为什么? 难道在一个connection 提交前越晚执行的语句越早被提交吗?一般不是先插入被外键关联的数据,再插入本数据么
后来我把那个constraint取消掉,2段代码 都不报错了 ,很想知道原因 能人来解答下吧
分享到:
相关推荐
2. **准备SQL语句**:接着,使用`Connection`对象的`prepareStatement(String sql)`方法创建一个`PreparedStatement`对象,其中`sql`参数是包含占位符的SQL语句。 ```java Connection con = DriverManager.get...
在IT领域,尤其是在Java编程中,SQL注入是一个重要的安全问题,而PreparedStatement是解决这一问题的有效手段之一。批量插入则是提高数据库操作效率的关键技术。今天我们将深入探讨这两个知识点。 首先,让我们来...
在PreparedStatement中,参数是通过它们的顺序引用的,第一个问号对应位置1,第二个对应位置2,以此类推。设置参数值的setXXX()方法与SQL中的预期数据类型相对应。 如同Statement,PreparedStatement也有执行SQL的...
2. **资源关闭顺序**:建议先关闭`ResultSet`,然后关闭`PreparedStatement`,最后关闭`Connection`。这是因为`PreparedStatement`和`Connection`的关闭操作可能会关闭它们所持有的资源。 3. **异常处理**:在关闭...
ResultSet是一个迭代器,可以按顺序访问数据库返回的行。我们可以遍历这个结果集,将每一行的数据转换为Java对象并存入List集合。 ```java List<MyObject> list = new ArrayList(); while (rs.next()) { MyObject ...
`java.sql.PreparedStatement`是一个预编译的SQL语句对象,它可以提高SQL执行效率,特别是当多次执行相同SQL时。`PreparedStatement`可以接受参数,允许我们在运行时动态插入值。`java.sql.ResultSet`则是用于存储...
每个问号对应一个参数,参数顺序与SQL语句中的问号位置一致。例如: ```java pstmt.setInt(1, id); pstmt.setString(2, name); ``` 4. **执行SQL语句** 设置完参数后,可以调用executeQuery()或executeUpdate...
在MySQL数据库操作过程中,`LIMIT`子句是非常实用的一个功能,尤其是在需要限制查询结果集大小的情况下。本文将详细介绍如何在MySQL中使用`LIMIT`结合参数化查询来实现灵活且安全的数据检索。 #### 一、基础知识...
ResultSet是一个迭代器,可以按行遍历数据。每行数据可以使用getter方法获取,如getString()、getInt()等。关闭资源时,要确保按照“资源打开顺序的反序”关闭,即先关闭ResultSet,再关闭Statement,最后关闭...
连接建立后,你可以创建一个`Statement`对象用于执行SQL查询,或者使用`PreparedStatement`对象预编译SQL语句,提高性能并防止SQL注入。 5. **执行SQL操作**: `Statement`或`PreparedStatement`对象提供了`...
- 首先,需要创建一个Environment对象,它是所有OCCI对象的基础。Environment::createEnvironment()方法用于创建环境对象,可以设置不同的运行模式,如互斥线程(THREADEC_MUTEXED)或并行线程(THREADEC_UMMUTEXED...
压缩包中的`DBParamManage`可能是一个工具类,用于管理或处理与数据库交互时的参数设置。这个类可能会包含一些静态方法,方便在项目中统一处理SQL语句的参数。例如,它可以提供一个通用的方法来设置参数,如下所示...
2. **创建数据库连接**:JDBC驱动程序管理数据库连接,程序员可以通过`DriverManager.getConnection()`方法创建一个到数据库的连接。连接字符串(URL)包含了数据库的类型、服务器地址、端口号、数据库名称等信息。 ...
在实际开发中,为了提高代码的可重用性和减少重复性工作,我们通常会创建一个JDBC工具类,将数据库连接、关闭资源等操作封装起来。以下是一个关于JDBC工具类的详细解释。 1. **JDBC工具类的作用** - 提高代码的可...
4. ResultSet处理:执行查询后,结果会返回一个ResultSet对象,它是一个游标,可以按顺序访问每一行数据。通过调用`next()`方法移动到下一行,然后可以使用`getString()`, `getInt()`, `getDouble()`等方法获取字段...
Struts 是一个基于MVC(Model-View-Controller)架构的开源Java框架,主要用于构建企业级Web应用程序。在Struts框架中,开发者可以利用JDBC(Java Database Connectivity)API来与数据库进行交互。本文主要讨论...
这个DEMO对于初学者来说是一个很好的实践,通过它,我们可以了解到JDBC操作的基本流程和最佳实践,如使用PreparedStatement防止SQL注入,以及正确关闭资源以避免内存泄漏。同时,封装工具类和回调函数的设计思路也有...
每个问号对应一个参数,按照它们在存储过程声明中的顺序进行设置。 4. 执行存储过程:调用CallableStatement的`execute()`方法执行存储过程。 5. 处理结果:根据存储过程的返回类型,可能需要获取输出参数或结果集...
本示例"JDBC查询代码以Student实体类.zip"提供了一个简单的JDBC查询应用,涉及到的关键知识点包括: 1. **JDBC驱动注册**:在Java程序中,我们需要通过`Class.forName()`方法加载并注册JDBC驱动。例如,对于MySQL,...
2. 关闭资源:操作完毕后,需按顺序关闭`ResultSet`、`Statement`和`Connection`,避免资源泄漏。 五、事务管理 1. 开启事务:`Connection.setAutoCommit(false)` 2. 提交事务:`Connection.commit()` 3. 回滚事务...