Java 使用JDBC从eclipse发出SQL命令
我一直在搜索和尝试不同的东西有一段时间了,但没有找到答案。我正在尝试使用eclipse中的JDBC与sql建立连接。当我需要在数据库中选择字符串时遇到问题。如果我使用:Java 使用JDBC从eclipse发出SQL命令,java,sql,jdbc,Java,Sql,Jdbc,我一直在搜索和尝试不同的东西有一段时间了,但没有找到答案。我正在尝试使用eclipse中的JDBC与sql建立连接。当我需要在数据库中选择字符串时遇到问题。如果我使用: Select name from data where title = 'mr'; 这适用于终端/命令行,但当我尝试使用eclipse时 statement sp = connection.createstatement(); resultset rs = sp.executequery("select name from
Select name from data where title = 'mr';
这适用于终端/命令行,但当我尝试使用eclipse时
statement sp = connection.createstatement();
resultset rs = sp.executequery("select name from data where title = '" + "mr" + "'");
当终端输入时,它不会给我任何东西。我在日食中做错了什么?谢谢
这是代码的一部分。对不起,有点乱,我一直在尝试不同的东西
private boolean loginChecker(String cid, String password) throws SQLException{
boolean check = false;
PreparedStatement pstatment = null;
Statement stmt = null;
//String query = "SELECT 'cat' FROM customer";
String query = "select '"+cid+"' from customer where password = '"+password+"'";
try {
System.out.println("in try......");
//stmt = con.createStatement();
//ResultSet rs = stmt.executeQuery(query);
PreparedStatement prepStmt = con.prepareStatement(query);
ResultSet rs = prepStmt.executeQuery();
//System.out.print(rs.getString("cid"));
while(rs.next()){
check = true;
System.out.print(rs.getString("cid"));
}
} catch (SQLException e ) {
e.printStackTrace();
} finally {
if (stmt != null) {
//stmt.close();
}
}
return check;
}
第二次尝试更简单的查询:
public List<Object> showTable() {
List<Object> result = new ArrayList<Object>();
String name = "bob";
try
{
PreparedStatement preStatement = con.prepareStatement("select total from test where name = ?");
preStatement.setString(1, name);
ResultSet rs1 = preStatement.executeQuery();
while(rs1.next()){
System.out.println("there");
System.out.println(rs1.getInt("total"));
}
}
catch (SQLException ex)
{
System.out.print("Message: " + ex.getMessage());
}
return result;
}
public List showTable(){
列表结果=新建ArrayList();
String name=“bob”;
尝试
{
PreparedStatement preStatement=con.prepareStatement(“从测试中选择总计,其中名称=?”);
预声明。设置字符串(1,名称);
ResultSet rs1=preStatement.executeQuery();
while(rs1.next()){
System.out.println(“那里”);
System.out.println(rs1.getInt(“总计”);
}
}
catch(SQLException-ex)
{
System.out.print(“消息:+ex.getMessage());
}
返回结果;
}
在尝试使用结果集之前,请确保未关闭该结果集。当您返回ResultSet
并尝试在其他地方使用它时,可能会发生这种情况。如果要像这样返回数据,请使用CachedRowSet
:
CachedRowSet crs = new CachedRowSetImpl();
crs.populate(ResultSet);
CachedRowSet的特殊之处在于它可以在不连接到数据源的情况下运行,也就是说,它是一个断开连接的行集对象
编辑:看到你发布了代码,所以我想我添加了一些想法。如果这是您的实际代码,那么您没有得到任何东西的原因是因为查询可能没有返回任何东西
String query = "select '"+cid+"' from customer where password = '"+password+"'";
这是错误的,原因有两个。1) 如果使用预处理语句,则应将所有输入替换为“?”,因此应如下所示:
String query = "select name from customer where password = ?";
然后:
(二)
下面我们尝试获取名为“cid”的列,而它应该是存储在cid中的名称。实际上,您不应该让用户决定要获取哪些列,这应该是硬编码的。删除列名周围的引号
String query = "select "+cid+" from customer where password = '"+password+"'";
您没有提到正在使用哪个数据库,但许多数据库(如Oracle)会将列大小写改为大写,除非它们被引用。所以,只有在创建表列时才引用表列。例如,如果您创建了一个表,如
CREATE TABLE some_table ( 'DoNotChangeToUpperCase' VARCHAR2 );
然后还必须选择带引号的列
SELECT 'DoNotChangeToUpperCase' FROM some_table
但是,如果您没有使用引号创建表,那么您也不应该在选择时使用引号。对于值将发生变化的参数,使用硬编码文字是不好的做法。在谷歌上搜索JDBC参数化查询。这个问题可能与Eclipse无关。这只是编译/调试应用程序的IDE。可能会有很多问题。你有什么例外吗?问题中的“先生”就是一个例子。它实际上是一个输入法。没有例外,当我调用rs.next()时,它只是显示为false;如果你给我们看你的实际代码会更好。我添加了部分代码。谢谢你,我明白了。我改变了密码。实际上,我不必使用预先准备好的语句,因为我没有更新任何内容。相反,我正在进行查询,但仍然不起作用。您不能将?
占位符与列名一起使用。这不起作用。我做了这个测试,但它仍然不起作用,如果我从测试中选择了名称,其中total=。。。它可以工作,但当我用total切换name时,它不能工作。我在数据库名称varchar(20)和total(int)中有这个。请参见上面的编辑。@user2185801“我实际上不必使用准备好的语句,因为我没有更新任何内容”错误!要进行SQL注入,您不必更新任何内容。任何有用户出于任何原因输入的地方都有注入的机会。(在有用户输入的情况下,始终使用准备好的语句。)回到回答,可能是因为有一些行等于您传递给total的行。但是,selecttotal fromtest where name=?
不起作用,因为您正在变得更具体,所以不存在任何内容。
CREATE TABLE some_table ( 'DoNotChangeToUpperCase' VARCHAR2 );
SELECT 'DoNotChangeToUpperCase' FROM some_table