这个问题在这里已经有答案了:
使用准备好的语句的变量列名(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。
提前感谢大家。
3条答案
按热度按时间kognpnkq1#
您的代码有多个问题:-)首先,不能在准备好的语句中用“setstring”设置表名或列名!看看这个问题:如何为java准备的insert语句使用tablename变量,正如danielpereira指出的:您正在尝试使用带有“setint”的“like”语句!请参见:https://dev.mysql.com/doc/refman/8.0/en/pattern-matching.html
jobtbby32#
尝试这样做:
llmtgqce3#
你在和我比较
LIKE
但你正在设定一个Int
. 更改LIKE
至=
看看能不能用。