V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Ygmxy
V2EX  ›  Java

Java JDBC 执行 sql 语句时报错

  •  
  •   Ygmxy · 2019-10-22 08:50:11 +08:00 · 5594 次点击
    这是一个创建于 1890 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码:
    import java.sql.*;

    public class PreparedStatement {
    public static void main(String[] args) {
    try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    } catch (ClassNotFoundException e){
    e.printStackTrace();
    };
    String url = "jdbc:mysql://localhost/jdbc?user=root&password=123456&serverTimezone=UTC";
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    try {

    conn = DriverManager.getConnection(url);

    stmt = conn.createStatement();

    rs = stmt.executeQuery("select id from emp where deptno > 1"); //执行这行代码时报错

    while (rs.next()) {
    System.out.println(rs.getObject("id"));
    }
    } catch (SQLException e){
    e.printStackTrace();
    } finally {
    try {
    rs.close();
    stmt.close();
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }


    报错信息:
    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 '?' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeQuery(StatementImpl.java:1200)
    at PreparedStatement.main(PreparedStatement.java:21)
    Exception in thread "main" java.lang.NullPointerException
    at PreparedStatement.main(PreparedStatement.java:30)

    Process finished with exit code 1


    求助各位大佬
    33 条回复    2019-10-23 15:40:57 +08:00
    nvkou
        1
    nvkou  
       2019-10-22 08:56:56 +08:00 via Android
    这是道英语题
    lukaz
        2
    lukaz  
       2019-10-22 08:59:48 +08:00 via Android
    SQL 语法错误,先确保 SQL 语句在数据库中正常执行
    MaiKuraki
        3
    MaiKuraki  
       2019-10-22 09:01:08 +08:00
    这是道英语题
    lyusantu
        4
    lyusantu  
       2019-10-22 09:15:54 +08:00
    localhost:3306
    shuAS
        5
    shuAS  
       2019-10-22 09:17:02 +08:00
    You have an error in your SQL syntax
    mineqiqi
        6
    mineqiqi  
       2019-10-22 09:18:36 +08:00
    没选 database
    ZredoC
        7
    ZredoC  
       2019-10-22 09:22:32 +08:00
    同意 2L
    还有 finally 回收资源的时候,个人习惯
    if (rs != null) rs.close();
    if (state != null) state.close();
    if (conn != null) conn.close();
    dif
        8
    dif  
       2019-10-22 09:26:12 +08:00
    @ZredoC 回收资源不都是先开的后关么?
    sevenstone
        9
    sevenstone  
       2019-10-22 09:30:15 +08:00 via Android
    网上搜一下比这问麻烦?
    smilzman
        10
    smilzman  
       2019-10-22 09:31:38 +08:00
    看着没什么问题啊,mysql 版本和 jar 版本的问题?
    ZredoC
        11
    ZredoC  
       2019-10-22 09:38:03 +08:00
    @dif 没错啊,不是 connection 连接然后 statment 发 sql 和返回,再 resultset 接收返回吗,先关 rs 再关 state 再关 conn。。
    iiicarus
        12
    iiicarus  
       2019-10-22 09:41:29 +08:00
    String url = "jdbc:mysql://localhost/jdbc?user=root&password=123456&serverTimezone=UTC";

    端口没有
    taogen
        13
    taogen  
       2019-10-22 09:46:26 +08:00 via iPhone
    表名和字段名和数据库一样了吗?把你的 sql 到数据库客户端执行通过,再复制到代码中。
    chendy
        14
    chendy  
       2019-10-22 09:53:50 +08:00
    2019 年了,关资源用 try with resource 吧(至少 statement 和 resultSet 可以)
    dog82
        15
    dog82  
       2019-10-22 09:59:07 +08:00
    连接串有问题
    bjking2014
        16
    bjking2014  
       2019-10-22 10:00:56 +08:00
    String url = "jdbc:mysql://localhost/jdbc?user=root&password=123456&serverTimezone=UTC";

    String url = "jdbc:mysql://localhost [:3306] /jdbc?user=root&password=123456&serverTimezone=UTC";
    weo0
        17
    weo0  
       2019-10-22 10:10:15 +08:00
    现在还有这样操作 db 的?
    heraldic
        18
    heraldic  
       2019-10-22 10:15:54 +08:00
    database 没选呢
    Marstin
        19
    Marstin  
       2019-10-22 10:37:23 +08:00
    百度 1 分钟解决 ×
    论坛 1 小时水贴 √
    wysnylc
        20
    wysnylc  
       2019-10-22 10:59:32 +08:00
    @ZredoC #7 try/close
    try(Resource res = xxx)//可指定多个资源
    {

    work with res

    }
    HolmLoh
        21
    HolmLoh  
       2019-10-22 11:05:10 +08:00
    @ZredoC #7
    如果是 java8 的话我倾向于用 try with resources
    jay0726
        22
    jay0726  
       2019-10-22 11:24:01 +08:00
    try with resources +1
    aborigine
        23
    aborigine  
       2019-10-22 11:29:04 +08:00
    不需要端口,默认自动 3306,你没选 db
    Jrue0011
        24
    Jrue0011  
       2019-10-22 14:26:11 +08:00   ❤️ 1
    如果你的数据库在本地,端口是默认的 3306,连接的 database 叫 jdbc、table 叫 emp,emp 里存在 id 和 deptno 字段,且 deptno 字段类型是数字的话,看起来都没什么问题。那还是确认外部环境吧,比如你的 mysql 是什么版本,jdbc 驱动是什么版本,有没有多个 jdbc 的 jar 包导致冲突。。。
    Ygmxy
        25
    Ygmxy  
    OP
       2019-10-22 15:02:41 +08:00
    @Jrue0011 感谢
    saberlove
        26
    saberlove  
       2019-10-22 16:15:09 +08:00
    这是道英语题
    Ygmxy
        27
    Ygmxy  
    OP
       2019-10-22 17:07:56 +08:00
    @Jrue0011 请问有没有是 jar 包的版本不同是不是造成我这个报错的呢?我看是跟视频学的视频里的 jar 包是 11,我是 13
    Ygmxy
        28
    Ygmxy  
    OP
       2019-10-22 17:08:10 +08:00
    JieS
        29
    JieS  
       2019-10-22 17:15:01 +08:00
    神 tm 英语题
    Jrue0011
        30
    Jrue0011  
       2019-10-22 17:38:14 +08:00   ❤️ 1
    @Ygmxy 11、13 是指 JDK 版本吧?我说的版本是 mysql 数据库的版本和你用来连接 mysql 的 jdbc 驱动 mysql-connector-java 的版本
    hantsy
        31
    hantsy  
       2019-10-23 08:43:12 +08:00
    url 连接字符格式问题,好多年没调用 Jdbc API 了,尝试将 ?& 全部 URL Encoded 转译一下。
    saltedFish666
        32
    saltedFish666  
       2019-10-23 10:04:41 +08:00
    那什么这个是英语,你看下这个 sql 能不能直接执行
    Ygmxy
        33
    Ygmxy  
    OP
       2019-10-23 15:40:57 +08:00
    @saltedFish666 问题解决了,谢啦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2236 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:11 · PVG 00:11 · LAX 08:11 · JFK 11:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.