我来自UFT背景。话虽如此,我对JAVA了解不多。 我有以下代码,我连接到SQL服务器并检索一些值并循环它们然后打印出来进行记录。有一个字符串数组varialbe" String [] sqlArr"包含从sql server检索的所有值。如何返回" String [] sqlArr"变量到不同的类?在这种情况下,主要类。
我不确定如何返回数组,但我尝试将返回类型更改为String并在方法close花括号之前放置一个return语句。我收到编译错误。
我想知道的是我怎样才能 1.而不是在方法中循环它,将数组返回到Main,这样我就可以根据需要使用数组的每个值。 2.如果在这种情况下无效,那么返回类型应该是什么? 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]);
}
}
}
}
答案 0 :(得分:1)
你可以为每条记录使用数组,但更好的方法是为每条记录创建一个对象,并将所有这些记录收集到一个列表中。
示例:
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;
}
评论:我冒昧地将变量的名称修改为。 not 以大写字母开头,以符合Java代码约定
答案 1 :(得分:0)
如果你想使用数组,那么你需要在while循环之前声明一个多维数组,指定查询将返回的行数(考虑到可以从源表中插入和删除记录,这很困难)以及表格的列数。
因此,我建议您使用嵌套的library(ggplot2)
df <- data.frame(
x = rep(seq(2, 15, 6.5), 2),
y = c(rep(2,3), rep(6.5, 3)),
h = rep(4, 6),
w = rep(6, 6),
info = c("78%\nmeaningless plots",
"+10K\nhours wasted",
"8/10\nzombies prefer brains",
"ALL\ndogs go to heaven",
"6\ninfoboxes",
"< 0.5\ntarget pvalue"),
color = factor(1:6)
)
ggplot(df, aes(x, y, height = h, width = w, label = info, fill = color)) +
geom_tile() +
geom_text(color = "white", fontface = "bold") +
coord_fixed() +
scale_fill_brewer(type = "qual",palette = "Dark2") +
theme_void() +
guides(fill = F)
来存储记录。外ArrayList
的每个ArrayList
将由每条记录的每个字段的值组成。
如何完成前面提到的?
ArrayList
以累积其他ArrayList
。ArrayList
来存储每条记录的字段,然后将ArrayList
添加到循环外的ArrayList
。ArrayList
的返回类型为connect2SQLServer
ArrayList<ArrayList<String>>
。您可以通过创建表示源表的每个记录的具体类型来轻松扩展它,然后您不需要嵌套的ArrayList
,而只需要ArrayList<ArrayList<String>>
。
根据经验,您不应在ArrayList<TheType>
中包含所有逻辑,因为此方法的唯一目的应该是连接到connect2SQLServer
。相反,你应该有4个方法代表DBMS
CRUD
命令(如果你需要它们),每个方法都可以完成它的工作。但是,在这种情况下,由于您只执行读取命令,因此可以将该逻辑与SQL
方法分开,使代码更容易维护,并且在代码变大时更不容易出错。
答案 2 :(得分:0)
我认为这就是你要做的事情:
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();
}
}