鱼C论坛

 找回密码
 立即注册
查看: 187|回复: 3

[已解决]在学习PreparedStatement 打出代码后运行老是出错 请问代码哪里出问题了

[复制链接]
发表于 2024-1-3 18:51:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

代码如下

package mybatisTry3.mts_soft.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test2a {
        public static void main(String[] args) throws ClassNotFoundException {
                try {
                        Class.forName("com.mysql.cj.jdbc.Driver");
                        String url = "jdbc:mysql:///mybatis2";
                        String user = "root";
                        String pwd = "root";
                       
                        Connection conn = DriverManager.getConnection(url, user, pwd);
                       
                        Test2a test = new Test2a();
                        String name = "张三";
                        String password = "123";
                        boolean flag = test.login(name, password, conn);
                        if(flag) {
                                System.out.println("登录成功");
                        }else {
                                System.out.println("登录失败");
                        }

                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
       
        public boolean login(String name, String password, Connection conn) throws SQLException {
                String sql = "select * from student where name = ? and password = ?";
                PreparedStatement pstmt;
                ResultSet rs;
                boolean flag = false;
               
                try {
                       
                        pstmt = conn.prepareStatement(sql);
                        pstmt.setString(1, name);
                        pstmt.setString(2, password);
                        rs = pstmt.executeQuery(sql);
                        while(rs.next()) {
                                flag = true;
                        }
                        rs.close();
                        pstmt.close();
                        conn.close();
                       
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return flag;
        }

}


报错信息如下
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 password = ?' at line 1
        at mysql.connector.j@8.2.0/com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
        at mysql.connector.j@8.2.0/com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
        at mysql.connector.j@8.2.0/com.mysql.cj.jdbc.StatementImpl.executeQuery(StatementImpl.java:1201)
        at mybatisTry3/mybatisTry3.mts_soft.test.Test2a.login(Test2a.java:46)
        at mybatisTry3/mybatisTry3.mts_soft.test.Test2a.main(Test2a.java:22)
登录失败

最佳答案
2024-1-3 18:52:06
问题出在你在执行PreparedStatement的executeQuery方法时传入了sql字符串。这个方法不需要传入参数,因为预编译的sql已经在prepareStatement方法中指定了。所以在这里你应该把executeQuery(sql)改成executeQuery()就可以了。

修改后的代码如下:

  1. public boolean login(String name, String password, Connection conn) throws SQLException {
  2.     String sql = "select * from student where name = ? and password = ?";
  3.     PreparedStatement pstmt;
  4.     ResultSet rs;
  5.     boolean flag = false;

  6.     try {
  7.         pstmt = conn.prepareStatement(sql);
  8.         pstmt.setString(1, name);
  9.         pstmt.setString(2, password);
  10.         rs = pstmt.executeQuery();
  11.         while (rs.next()) {
  12.             flag = true;
  13.         }
  14.         rs.close();
  15.         pstmt.close();
  16.         conn.close();

  17.     } catch (SQLException e) {
  18.         e.printStackTrace();
  19.     }
  20.     return flag;
  21. }
复制代码


希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-3 18:52:06 | 显示全部楼层    本楼为最佳答案   
问题出在你在执行PreparedStatement的executeQuery方法时传入了sql字符串。这个方法不需要传入参数,因为预编译的sql已经在prepareStatement方法中指定了。所以在这里你应该把executeQuery(sql)改成executeQuery()就可以了。

修改后的代码如下:

  1. public boolean login(String name, String password, Connection conn) throws SQLException {
  2.     String sql = "select * from student where name = ? and password = ?";
  3.     PreparedStatement pstmt;
  4.     ResultSet rs;
  5.     boolean flag = false;

  6.     try {
  7.         pstmt = conn.prepareStatement(sql);
  8.         pstmt.setString(1, name);
  9.         pstmt.setString(2, password);
  10.         rs = pstmt.executeQuery();
  11.         while (rs.next()) {
  12.             flag = true;
  13.         }
  14.         rs.close();
  15.         pstmt.close();
  16.         conn.close();

  17.     } catch (SQLException e) {
  18.         e.printStackTrace();
  19.     }
  20.     return flag;
  21. }
复制代码


希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-3 18:53:07 | 显示全部楼层
FishC 发表于 2024-1-3 18:52
问题出在你在执行PreparedStatement的executeQuery方法时传入了sql字符串。这个方法不需要传入参数,因为预 ...

谢谢小助理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 18:53:14 | 显示全部楼层


不客气,如果你还有其他问题,随时来问我哦!祝你编程学习顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 20:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表