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

Java JDBC 执行 sql 语句时报错

  •  
  •   Ygmxy · 93 天前 · 2651 次点击
    这是一个创建于 93 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码:
    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   93 天前 via Android
    这是道英语题
    lukaz
        2
    lukaz   93 天前 via Android
    SQL 语法错误,先确保 SQL 语句在数据库中正常执行
    MaiKuraki
        3
    MaiKuraki   93 天前
    这是道英语题
    lyusantu
        4
    lyusantu   93 天前
    localhost:3306
    shuAS
        5
    shuAS   93 天前
    You have an error in your SQL syntax
    mineqiqi
        6
    mineqiqi   93 天前
    没选 database
    ZredoC
        7
    ZredoC   93 天前
    同意 2L
    还有 finally 回收资源的时候,个人习惯
    if (rs != null) rs.close();
    if (state != null) state.close();
    if (conn != null) conn.close();
    dif
        8
    dif   93 天前
    @ZredoC 回收资源不都是先开的后关么?
    sevenstone
        9
    sevenstone   93 天前 via Android
    网上搜一下比这问麻烦?
    smilzman
        10
    smilzman   93 天前
    看着没什么问题啊,mysql 版本和 jar 版本的问题?
    ZredoC
        11
    ZredoC   93 天前
    @dif 没错啊,不是 connection 连接然后 statment 发 sql 和返回,再 resultset 接收返回吗,先关 rs 再关 state 再关 conn。。
    iiicarus
        12
    iiicarus   93 天前
    String url = "jdbc:mysql://localhost/jdbc?user=root&password=123456&serverTimezone=UTC";

    端口没有
    taogen
        13
    taogen   93 天前 via iPhone
    表名和字段名和数据库一样了吗?把你的 sql 到数据库客户端执行通过,再复制到代码中。
    chendy
        14
    chendy   93 天前
    2019 年了,关资源用 try with resource 吧(至少 statement 和 resultSet 可以)
    dog82
        15
    dog82   93 天前
    连接串有问题
    bjking2014
        16
    bjking2014   93 天前
    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   93 天前
    现在还有这样操作 db 的?
    heraldic
        18
    heraldic   93 天前
    database 没选呢
    Marstin
        19
    Marstin   93 天前
    百度 1 分钟解决 ×
    论坛 1 小时水贴 √
    wysnylc
        20
    wysnylc   93 天前
    @ZredoC #7 try/close
    try(Resource res = xxx)//可指定多个资源
    {

    work with res

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