Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC从eclipse发出SQL命令_Java_Sql_Jdbc - Fatal编程技术网

Java 使用JDBC从eclipse发出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

我一直在搜索和尝试不同的东西有一段时间了,但没有找到答案。我正在尝试使用eclipse中的JDBC与sql建立连接。当我需要在数据库中选择字符串时遇到问题。如果我使用:

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