【问题标题】:return a array from a class java从类 java 返回一个数组
【发布时间】:2018-04-17 09:08:15
【问题描述】:

我来自 UFT 背景。话虽如此,我对JAVA了解不多。 我有以下代码,我在其中连接到 sql server 并检索一些值并遍历它们,然后将它们打印出来以记录。有一个字符串数组 varialbe "String[] sqlArr" 保存从 sql server 检索到的所有值。如何将该“String [] sqlArr”变量返回到不同的类?在这种情况下到主类。

我不完全确定如何返回数组,但我尝试将返回类型更改为字符串,并在方法关闭花括号之前放置一个返回语句。我收到编译错误。

我想知道的是我怎么能, 1. 不是在方法中循环它,而是将数组返回到 Main,这样我就可以根据需要使用数组的每个值。 2. 在这种情况下,如果不是 void,返回类型应该是什么? 3. 或许有人可以推荐我或修改我的脚本,让我看起来更专业。

任何关于这方面的建议都将受到高度赞赏。

package com.mmia;

import java.sql.*;

public class Connect2SQLServer {

    //Current Username
    private String currentUser = System.getProperty("user.name");

    public void connect2SQLServer() throws SQLException, ClassNotFoundException {

        //Loading the required JDBC Driver class
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

        //Creating a connection to the database
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://XXXXXXXXXXX;databaseName=Data_Table_Name;integratedSecurity=true");

        //Executing SQL query and fetching the result
        Statement st = conn.createStatement();

        //Sql query
        String sqlStr = "Select * From PropertiesTable where Username =" + "'" + currentUser + "'";

        //Execute the query
        ResultSet rs = st.executeQuery(sqlStr);

        while (rs.next()) {

            String Username = rs.getString("Username");
            String Environment = rs.getString("Environment");
            String WebDealer = rs.getString("WebDealer");
            String WebAgent = rs.getString("WebAgent");
            String WebPassword = rs.getString("WebPassword");
            String InternalUser = rs.getString("InternalUser");
            String InternalPassword = rs.getString("InternalPassword");
            String Browser = rs.getString("Browser");

            //String[] sqlArr;
            String[] sqlArr = {Username, Environment, WebDealer, WebAgent, WebPassword, InternalUser, InternalPassword, Browser};

            for (int i = 0; i < sqlArr.length; i++) {
                System.out.println(sqlArr[i]);
            }
        }
    }
}

【问题讨论】:

  • "How to return that "String[] sqlArr" variable" 只需在方法的最后一行写:return sqlArr;(您必须将方法签名从 void 更改为 @ 987654325@ 也一样)。
  • 我的 main 方法如下所示: public class Main { public static void main(String[] args) throws ClassNotFoundException, SQLException { Connect2SQLServer con = new Connect2SQLServer(); con.connect2SQLServer(); } }
  • @alfasin,我尝试将返回类型更改为 String[] 并将 return sqlArr 写入方法的最后一行。我收到一些建议错误,例如将变量引入范围、创建局部变量、创建字段 sqlArr、重命名 regerence。
  • @Aomine,也许一个符合这种情况的二维数组的例子会更好。
  • 您应该对代码进行另外两项改进:1) 明确命名您要选择的列,而不是只选择*。这样,如果稍后将更多列添加到数据库中的表中,或者如果您需要在查询中加入其他表,您就不会失去性能。 2) 您的代码容易受到 SQL 注入的攻击。如果用户名是' or '1' = '1,它将选择该表中的所有行。改用准备好的语句:docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

标签: java arrays function arraylist methods


【解决方案1】:

如果你想使用数组,那么你需要在 while 循环之前声明一个多维数组,指定查询将返回的行数(考虑到可以从源表中插入和删除记录,这很困难)以及表的列数。

因此,我建议您使用嵌套的ArrayList 来存储记录。外部ArrayList 的每个ArrayList 将包含每条记录的每个字段的值。

如何完成上述的?

  1. 在 while 循环之前创建嵌套的 ArrayList 以累积其他 ArrayList。
  2. 为循环的每次迭代创建一个本地ArrayList 来存储每条记录的字段,然后将ArrayList 添加到循环外的ArrayList。
  3. 确保方法connect2SQLServer 的返回类型为ArrayList&lt;ArrayList&lt;String&gt;&gt;
  4. 返回嵌套的ArrayList。

您可以通过创建一个代表源表的每条记录的具体类型来轻松扩展它,然后您不需要嵌套的ArrayList&lt;ArrayList&lt;String&gt;&gt;,而只需一个ArrayList&lt;TheType&gt;。


根据经验,您不应在connect2SQLServer 中包含所有逻辑,因为此方法的唯一目的应该是连接到DBMS。相反,您应该有 4 个方法来表示 CRUD SQL 命令(如果您需要所有这些命令),每个方法都在发挥作用。但是,在这种情况下,由于您只执行读取命令,因此您可以将该逻辑与 connect2SQLServer 方法分开,从而使您的代码更易于维护,并且在代码变大时更不容易出错。

【讨论】:

    【解决方案2】:

    我认为这就是你想要做的:

    public String[][] connect2SQLServer() throws SQLException, ClassNotFoundException {
        // code..
        List<String[]> data = new LinkedList<>();
        while (rs.next()) {
            // more code..
            String[] sqlArr = {Username, Environment, WebDealer, WebAgent, WebPassword, InternalUser, InternalPassword, Browser};
            data.add(sqlArr);
        }
        return data.toArray(new String[data.size()][]);
    }
    

    还有你的Main:

    public class Main {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            Connect2SQLServer con = new Connect2SQLServer();
            String[][] data = con.connect2SQLServer();
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以为每条记录使用一个数组但更好的方法是为每条记录创建一个对象并将所有这些记录收集到一个列表中。

      例子:

      class Record {
      
          private String username;
          private String environment;
          private String webDealer;
          private String webAgent;
          private String webPassword;
          private String internalUser;
          private String internalPassword;
          private String browser;
      
          public Record(String username, String environment, String webDealer, String webAgent, String webPassword,
                        String internalUser, String internalPassword, String browser) {
              this.username = username;
              this.environment = environment;
              this.webDealer = webDealer;
              this.webAgent = webAgent;
              this.webPassword = webPassword;
              this.internalUser = internalUser;
              this.internalPassword = internalPassword;
              this.browser = browser;
          }
      
          public String getUsername() {
              return username;
          }
      
          public String getEnvironment() {
              return environment;
          }
      
          public String getWebDealer() {
              return webDealer;
          }
      
          public String getWebAgent() {
              return webAgent;
          }
      
          public String getWebPassword() {
              return webPassword;
          }
      
          public String getInternalUser() {
              return internalUser;
          }
      
          public String getInternalPassword() {
              return internalPassword;
          }
      
          public String getBrowser() {
              return browser;
          }
      }
      

      然后你就可以使用它了:

      // the method signature has changed and now it returns a list of records
      public List<Record> connect2SQLServer() throws SQLException, ClassNotFoundException {
          // ...
      
      
          // create the list that will hold the results (records)
          List<Record> results = new LinkedList<>();
          while (rs.next()) {
      
              String username = rs.getString("username");
              String environment = rs.getString("environment");
              String webDealer = rs.getString("webDealer");
              String webAgent = rs.getString("webAgent");
              String webPassword = rs.getString("webPassword");
              String internalUser = rs.getString("internalUser");
              String internalPassword = rs.getString("internalPassword");
              String browser = rs.getString("browser");
      
              // create a new record
              Record record = new Record(username, environment, webDealer, webAgent,
                                         webPassword, internalUser, internalPassword, browser);
      
              // add the record to results
              results.add(record);
          }
      
          return results;
      }
      

      评论:我冒昧地将您的变量名称修改为 . 不以大写开头,以符合 Java 代码约定

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-10
        • 1970-01-01
        • 2014-06-10
        • 2013-03-04
        • 2023-02-26
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        相关资源
        最近更新 更多