写JDBC遇到的问题

文章讲述了在Java程序中使用MySQL时遇到的SQLSyntaxErrorException,原因在于两次尝试设置SQL(一次在`prepareStatement`时,另一次在`executeQuery`时)。解决方案是确保在预编译语句后只执行一次查询。

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

执行会出现以下错误信息

java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? and loginPwd = ?' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeQuery(StatementImpl.java:1200)
    at JDBCTest07.login(JDBCTest07.java:45)
    at JDBCTest07.main(JDBCTest07.java:22)

错误的原因是:在执行prepareStatement的时候已经传入sql了,执行excuteQuary时又传入一遍

修改后正常执行

### 如何使用 MyEclipse 编 JDBC 连接 Navicat 数据库 #### 准备工作 为了实现通过 MyEclipse 使用 JDBC 驱动程序连接到 Navicat 中配置的 MySQL 数据库,需完成以下准备工作: 1. **安装并配置环境工具** - 安装 MyEclipse 2017 版本作为开发 IDE[^1]。 - 安装 MySQL 数据库服务以及 Navicat Premium 12 工具用于管理数据库。 2. **创建数据库连接** 在 Navicat 中设置好目标数据库实例及其用户名密码等参数。这一步骤确保后续可以通过 JDBC 正确访问该数据库资源。 3. **获取 JDBC 驱动文件** 访问官方下载页面 `https://dev.mysql.com/downloads/connector/j/` 获取最新版 MySQL Connector/J (即 JDBC driver)[^2] 并将其解压后放置于项目 lib 文件夹下或者全局 classpath 路径之中以便加载所需类定义。 --- #### 实现步骤详解 以下是具体代码示例展示如何利用 JavaJDBC 技术来建立与远程 MySQL 数据库之间的通信桥梁: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JDBCTest { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 注册 JDBC 驱动器 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接字符串 URL, 添加字符集编码选项防止乱码问题发生 String url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8"; String user = "root"; // 替换为实际使用的账户名 String password = "password";// 替换为对应用户的登录口令 // 创建物理链接对象 conn = DriverManager.getConnection(url, user, password); // 构造 SQL 查询语句执行计划 String sqlQuery = "SELECT * FROM test_table"; // 初始化 statement 对象准备发送请求给服务器端处理逻辑单元 stmt = conn.createStatement(); // 发送查询命令得到返回结果集合形式表示的数据记录列表 rs = stmt.executeQuery(sqlQuery); System.out.println("ID\tName"); while(rs.next()){ int id = rs.getInt("id"); // 提取字段值 String name = rs.getString("name"); System.out.printf("%d\t%s%n", id,name ); } } catch(Exception e){ e.printStackTrace(); } finally{ // 关闭所有打开的对象释放占用系统资源 try{if(conn!=null){conn.close();}}catch(Exception ex){} try{if(stmt!=null){stmt.close();}}catch(Exception ex){} try{if(rs!=null){rs.close();}}catch(Exception ex){} } } } ``` 上述代码片段展示了完整的流程包括但不限于以下几个方面: - 加载指定类型的驱动程序支持特定协议栈操作模式. - 设置正确的连接属性避免可能出现中文显示异常的情况[^3]. - 动态构建标准 SELECT 请求语法结构从而读取存储表内的基础信息. --- #### 注意事项 当遇到无法正常运行时可参照如下建议排查原因所在之处: - 确认本地主机 IP 地址是否匹配目标机器监听地址,默认情况下应设为 localhost 或者 127.0.0.1 表明仅允许来自同一台计算机内部发起调用尝试[^4]. - 如果仍然存在兼容性障碍,则考虑升级各自组件版本号直至满足最低依赖关系要求为止.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值