Java JDBCMySQL查询语法
我正在与JDBC合作,试图从这个表中选择:Java JDBCMySQL查询语法,java,mysql,jdbc,Java,Mysql,Jdbc,我正在与JDBC合作,试图从这个表中选择: 创建表包( COGNOM1 VARCHAR(30)不为空, COGNOM2 VARCHAR(30)不为空, DATANAIX日期不为空, NOM VARCHAR(30)不为空, 如果VARCHAR(10)不为空, 登录VARCHAR(50)不为空, PASSWORDMD5 VARCHAR(50)不为空, 数字整数(3)非空自动增量, 主键(数字) ); 我想检查是否存在具有特定登录名和密码MD5值的行,如下所示: public int Login(S
创建表包(
COGNOM1 VARCHAR(30)不为空,
COGNOM2 VARCHAR(30)不为空,
DATANAIX日期不为空,
NOM VARCHAR(30)不为空,
如果VARCHAR(10)不为空,
登录VARCHAR(50)不为空,
PASSWORDMD5 VARCHAR(50)不为空,
数字整数(3)非空自动增量,
主键(数字)
);
我想检查是否存在具有特定登录名和密码MD5值的行,如下所示:
public int Login(String Login, String pass) {
Statement st = null;
ResultSet rs = null;
int count =0;
try {
st = con.createStatement();
String consulta = "Select count(*) from Perit p where p.LOGIN =";
consulta += Login;
consulta +=" and p.PASSWORDMD5 = MD5(";
consulta +=pass;
consulta+=")";
rs = st.executeQuery(consulta);
while (rs.next()) {
count = rs.getInt(1);
}
st.close();
rs.close();
} catch (SQLException ex) {
Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
}
return count;
}
但是当我调用Login(“LOGINPERIT1”,“PASSWORDMDPERIT”)
时,我得到了以下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知
位于“where子句”中的“LOGINPERIT1”列
sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
在
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
com.mysql.jdbc.Util.getInstance(Util.java:408)位于
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)位于
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)位于
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)位于
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)位于
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)位于
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497)位于
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455)位于
com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1369)位于
info.infomila.info.JDBCMySQL.Login(JDBCMySQL.java:139)位于
info.infomila.info.ThreadHandler.run(ThreadHandler.java:56)
正如评论中提到的,您遇到的问题是,您为登录和密码提供的字符串没有用单引号括起来 解决此问题的快速方法是在注释中包含@DevilsHnd提到的登录和密码传入值之前和之后,在定义的sql字符串中包含单引号:
String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = '" + Login +
"' AND PASSWORDMD5 = MD5('" + pass + "');"
然而,这是一种危险的方法,我强烈建议您不要使用这种方法,因为它使您的登录sql不易被sql注入攻击
为了避免这种情况,您可以使用一种可以为您的输入进行消毒的方法
要做到这一点,请使用?
替换语句参数,然后使用PreparedStatement类的方法设置它们
以下是如何实现这一目标的示例:
String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = ? AND PASSWORDMD5 = MD5(?);"
try(PreparedStatement pstmt = con.prepareStatement(consulta))
{
pstmt.setString(1, login);
pstmt.setString(2, pass);
try(ResultSet rs = pstmt.executeQuery())
{
count = rs.getInt(1);
}
}
catch (SQLException ex)
{
Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
}
方法中另一个值得关注的方面是,语句
和结果集
未在finally块中关闭-这可能导致代码内存泄漏
请注意,我使用了try with resources块,它将关闭PreparedStatement
和ResultSet
,就像它们在finally块中关闭一样
我就把这张xkcd漫画留在这里
使用PreparedStatement,使用起来更安全。但是,出现错误的原因是
字符串
需要单引号,否则它会将其视为列名检查此列是否存在“LOGINPERIT1”您的字符串,即登录名和密码没有引号。请引用它们并检查。或许可以尝试以下操作:String consulta=“从Perit中选择COUNT(*),其中LOGIN='“+LOGIN+”,PASSWORDMD5='MD5(“+pass+”);”代码>。注意登录和密码使用单引号?在双引号之前,您需要添加单引号