【java】jdbc的使用从0开始(三)prepareStatement

本文通过一个具体的例子展示了如何使用PreparedStatement来提高数据库操作的效率。重点介绍了预编译SQL语句的方法及参数赋值的过程。

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

PreparedStatement是预编译的,对于批量处理可以大大提高效率

package com.xmut.zeng.lesson02;

import com.xmut.zeng.lesson01.utils.JdbcUtils;

import java.sql.*;

public class Insert {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;

        try {
            conn = JdbcUtils.getConnection();//获取数据库连接

            //使用???? 占位符代替参数
            String sql = "INSERT INTO users (`id`,`NAME`,`PASSWORD`,`email`,`birthday`)" +
                    "VALUES (?,?,?,?,?)";
            st =  conn.prepareStatement(sql);  //预编译sql,先写sql 然后不执行
            //手动给参数赋值
            st.setInt(1,101);
            st.setString(2,"优快云");
            st.setString(3,"123456");
            st.setString(4,"优快云@edu.cn");
            st.setDate(5,new java.sql.Date(new java.util.Date().getTime()));

            int i  = st.executeUpdate();
            if (i>0){
                System.out.println("插入成功 "+i+" 条数据");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
        }
    }
}

执行结果:
在这里插入图片描述
在这里插入图片描述

<think>我们正在处理一个关于达梦数据库JDBC驱动使用中`prepareStatement`方法抛出Java异常的问题。根据用户提供的信息和引用内容,我们将分析可能的原因并提供解决方案。 首先,回顾引用内容: - 引用[1]展示了加载达梦JDBC驱动并建立连接的基本代码结构。 - 引用[2]提到达梦JDBC驱动版本(DM8使用DmJdbcDriver18.jar,DM7使用DmJdbcDriver17.jar)以及JDBCJava连接数据库的规范。 - 引用[3]展示了一个运行Java程序时指定classpath的例子,其中包括达梦的JDBC驱动jar包和其他jar包。 - 引用[4]展示了两种建立连接的方式,其中一种是在URL中直接提供用户名密码,另一种是作为参数传递。 用户问题:使用`DmdbConnection`的`prepareStatement`方法时抛出Java异常。 可能的原因: 1. **驱动版本不匹配**:使用的驱动版本与数据库版本不兼容(如DM8数据库使用DmJdbcDriver17.jar)。 2. **连接未正确建立**:在调用`prepareStatement`之前,连接可能已经关闭或无效。 3. **SQL语法问题**:在准备语句时,SQL语句可能存在语法错误,导致驱动无法解析。 4. **参数设置问题**:在设置预编译语句的参数时可能出现问题。 5. **驱动类未正确加载**:虽然引用了加载驱动的代码,但实际运行时可能因为类路径等问题未加载成功。 6. **网络或权限问题**:连接数据库时可能由于网络问题或权限不足导致连接不稳定,进而影响后续操作。 解决方案步骤: 1. **确认驱动版本**: - 确保使用JDBC驱动版本与达梦数据库版本匹配。DM8应使用`DmJdbcDriver18.jar`,DM7应使用`DmJdbcDriver17.jar`。 - 检查项目中引入的jar包是否正确,避免版本冲突。 2. **检查数据库连接**: - 在调用`prepareStatement`之前,确保连接是打开且有效的。可以通过`conn.isClosed()`和`conn.isValid(int timeout)`方法检查。 - 捕获并打印异常堆栈,以便获取更详细的错误信息。 3. **检查SQL语句**: - 确保传递给`prepareStatement`的SQL语句是有效的。可以在达梦数据库的其他客户端(如管理工具)中测试该SQL语句。 - 注意达梦数据库SQL语法可能与MySQL或Oracle有所不同,需遵循达梦的语法规则。 4. **参数设置**: - 使用`PreparedStatement`设置参数时,注意参数索引从1开始,并且数据类型需要匹配。 - 检查是否有未设置的参数,或者设置参数的数量与SQL中的占位符数量不一致。 5. **异常堆栈分析**: - 捕获`java.sql.SQLException`并打印其错误信息(使用`e.getMessage()`)和堆栈跟踪,这将有助于定位问题。 6. **类路径和依赖**: - 确保运行时类路径中包含达梦JDBC驱动的jar包(如引用[3]所示)。 - 如果使用构建工具(如Maven),确保依赖配置正确。 7. **网络和权限**: - 检查数据库服务器是否可达,端口是否开放(默认端口5236)。 - 确认连接使用的用户名和密码具有执行相应SQL语句的权限。 示例代码修改建议: 以下是一个修改后的示例,增加了异常处理和连接有效性检查: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class DMDBExample { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; try { // 1. 加载驱动 Class.forName("dm.jdbc.driver.DmDriver"); // 2. 建立连接 String url = "jdbc:dm://localhost:5236/DBName"; String user = "username"; String password = "password"; conn = DriverManager.getConnection(url, user, password); // 检查连接是否有效 if (conn != null && !conn.isClosed()) { System.out.println("连接成功"); // 3. 创建预编译语句 String sql = "SELECT * FROM table_name WHERE id = ?"; // 替换为实际SQL pstmt = conn.prepareStatement(sql); // 4. 设置参数 pstmt.setInt(1, 1); // 示例:设置第一个参数为整数1 // 5. 执行查询 pstmt.executeQuery(); // ... 处理结果集 } } catch (ClassNotFoundException e) { System.err.println("找不到驱动类: " + e.getMessage()); } catch (SQLException e) { // 打印详细的SQL异常信息 System.err.println("SQL异常: " + e.getMessage()); e.printStackTrace(); } finally { // 关闭资源 try { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 如果以上步骤仍不能解决问题,请提供具体的异常信息,以便进一步分析。 §§相关问题§§ 1. 达梦数据库JDBC驱动中`prepareStatement`方法支持哪些类型的参数? 2. 如何诊断达梦数据库JDBC连接问题? 3. 达梦数据库的预编译语句与MySQL有何不同?</think>### 达梦数据库 JDBC prepareStatement 异常解决方案 在使用达梦数据库 JDBC 驱动时遇到 `prepareStatement` 方法抛出 Java 异常,通常由以下原因导致。以下是系统排查步骤和解决方案: #### 常见原因及解决方案 1. **驱动未正确加载** - ✅ **检查驱动类名**: ```java // 正确驱动类名(注意大小写) Class.forName("dm.jdbc.driver.DmDriver"); // DM8 驱动[^2] ``` - ❌ 错误示例:`dm.jdbc.DmDriver` 或 `com.dm.jdbc.Driver` - 🔧 解决方案:确认使用的 JAR 包版本: - DM8 数据库 → `DmJdbcDriver18.jar` - DM7 数据库 → `DmJdbcDriver17.jar`[^2] 2. **连接未建立或已关闭** - ✅ **验证连接状态**: ```java if (conn == null || conn.isClosed()) { throw new SQLException("连接无效或已关闭"); } PreparedStatement pstmt = conn.prepareStatement(sql); // [^1] ``` - 🔧 解决方案:确保在调用 `prepareStatement` 前连接已成功建立。 3. **SQL 语法错误** - ✅ **检查 SQL 合法性**: ```java // 达梦特有语法需注意(如 TOP 替代 LIMIT) String sql = "SELECT TOP 10 * FROM table WHERE id = ?"; // 正确 // String sql = "SELECT * FROM table LIMIT ?"; // 错误语法[^4] ``` - 🔧 解决方案:在达梦管理工具中直接测试 SQL 语句。 4. **参数类型不匹配** - ✅ **正确设置参数**: ```java PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (name,age) VALUES (?,?)"); pstmt.setString(1, "张"); // 索引从1开始 pstmt.setInt(2, 30); // 类型必须匹配列定义[^4] ``` 5. **JAR 包冲突** - ✅ **检查依赖**: ```bash # 运行命令检查冲突 java -cp DmJdbcDriver18.jar:your_app.jar MainClass # [^3] ``` - 🔧 解决方案:排除冲突依赖(如多版本 JDBC 驱动共存)。 #### 完整异常处理示例 ```java try { // 1. 加载驱动 Class.forName("dm.jdbc.driver.DmDriver"); // 2. 建立连接 Connection conn = DriverManager.getConnection( "jdbc:dm://localhost:5236/DBName?param=value", "user", "pass" // [^4] ); // 3. 预编译SQL使用标准SQL语法) String sql = "UPDATE orders SET status = ? WHERE id = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, "COMPLETED"); pstmt.setInt(2, 1001); pstmt.executeUpdate(); } } catch (ClassNotFoundException e) { System.err.println("驱动加载失败: " + e.getMessage()); } catch (SQLException e) { System.err.println("数据库错误: " + e.getErrorCode() + " - " + e.getMessage()); e.printStackTrace(); // 关键!打印完整堆栈 } ``` #### 高频错误码速查 | 错误码 | 原因 | 解决方案 | |--------|-----------------------|-------------------------| | -7005 | SQL 语法错误 | 使用达梦管理工具验证 SQL | | -6002 | 连接已关闭 | 检查连接超时设置 | | -4016 | 参数类型不匹配 | 检查 `setXxx()` 数据类型| | -10008 | 驱动未注册 | 确认 `Class.forName()` 已执行 | > ⚠️ **关键提示**:务必通过 `e.printStackTrace()` 获取完整异常链,达梦 JDBC 的错误信息通常包含具体的错误码和定位信息[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值