mysql—在java(jdbc)中使用sql语句时占位符不起作用

e1xvtsh3  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(392)

这个问题在这里已经有答案了

使用准备好的语句的变量列名(7个答案)
使用准备好的语句设置表名(7个答案)
两年前关门了。
这是第一个问题,所以我为任何错误和不完美道歉。
基本上有三个文件,我的main method tech\u supportv1,login\u controller包含一个用来存储一堆方法的类,还有login.java,一个javabean。重点是检查技术支持数据库中是否存在某一行。为此,我尝试使用下面的代码(db_util和type是包含连接数据的类,它们经过测试并工作)。
问题:main方法中的数据似乎没有粘贴到相应占位符中的字符串中,并且返回了一个错误(当然,如果我手动输入字符串而不是使用占位符,一切都会正常工作。)
com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:您的sql语法有错误;检查与您的mariadb服务器版本相对应的手册,以了解在第1行“technicals”附近使用的正确语法,其中“techid”类似于16
我很想看看mariadb文档,但是提供的所有其他语法都会产生相同的结果。
所以这是主要的方法。

public class Tech_support_v1 {

public static void main(String[] args) {

    System.out.println("Start.");

    login bean = new login();

    bean.setTable("technicians");
    bean.setColumn("techID");
    bean.setID(16);

    login_controller.select(bean);

}

}
这是select方法(以bean作为参数,login是javabean类)。

public static boolean select(login bean) {

    String sql = "SELECT * FROM ? WHERE ? LIKE ?";

    ResultSet rs;

    try (
            Connection conn = db_util.getConn(db_type.MYSQL);
            PreparedStatement stmt = conn.prepareStatement(sql);
            ) {

        stmt.setString(1, bean.getTable());
        stmt.setString(2, bean.getColumn());
        stmt.setInt(3, bean.getID());

        rs = stmt.executeQuery();

        if (rs.next()) {
            System.out.println("Y");
            return true;
        } else {
            System.err.println("N");
            return false;
        }

    } catch (Exception e) {
        System.err.println(e);
        return false;
    }

}

我不会包含bean类,因为它实际上只有三个变量和相对的set/get方法。数据库也运行mariadb,并且是mysql。
提前感谢大家。

kognpnkq

kognpnkq1#

您的代码有多个问题:-)首先,不能在准备好的语句中用“setstring”设置表名或列名!看看这个问题:如何为java准备的insert语句使用tablename变量,正如danielpereira指出的:您正在尝试使用带有“setint”的“like”语句!请参见:https://dev.mysql.com/doc/refman/8.0/en/pattern-matching.html

jobtbby3

jobtbby32#

尝试这样做:

String sql="SELECT * FROM :table ";

try (
            Connection conn = db_util.getConn(db_type.MYSQL);
            PreparedStatement stmt = conn.prepareStatement(sql);
            )
{
   String query = StringUtils.replace(sql, ":table", bean.getTable());
   stmt.executeQuery(query);
}
llmtgqce

llmtgqce3#

你在和我比较 LIKE 但你正在设定一个 Int . 更改 LIKE= 看看能不能用。

相关问题