2014-10-01 72 views
-3

這裏我正在從文件中讀取學生數據並將其存儲在db.For正在使用ArrayList。 例如,將最長的變量名存儲在另一個臨時變量中

Student(){ 
private int rollNo; 
private String name,department,branch; 
private String cgpa; 

. 
. 
. 
public int getRollNo(){ 
    return rollNo; 
} 
public String getName(){ 
    return name; 
} 
public String getDepartment(){ 
    return department; 
} 
public String getBranch(){ 
    return branch; 
} 
public String getCgpa(){ 
    return cgpa; 
} 

}

和我的ArrayList的變量是

ArrayList<Student> stu; 

中序從ArrayList中獲取任何領域,我必須使用stu.get(i).getRollNo()stu.get(i).getName()stu.get(i).getDepartment()等。這裏我多次使用了stu.get(i)。爲了避免我將stu.get(i)存儲在臨時變量中。例如

String temp="stu.get(i)." 

sql="INSERT INTO STUDENT VALUES('"+temp+"getRollNo()"+"','"+temp+"getName()"+"','"+temp+"getDepartment()"+"','"+temp+"getBranch()"+"',"+Float.parseFloat(temp+"getCgpa()")+")"; 

但是當我使用temp+"getRollNO()"時,不調用該方法。請解釋這個問題。如果它不可能,請給我另一種方法來實現。

回答

2

嘗試以下操作:

Student s = stu.get(i); 
sql = "INSERT INTO STUDENT VALUES('"+s.getRollNo()+"','"+s.getName()+"','"+s.getDepartment()+"','"+s.getBranch()+"',"+Float.parseFloat(s.getCgpa())+")"; 

列表中包含的學生,因此,你應該從列表中的學生對象,並直接訪問干將。

+0

易發生sql注入,因此不推薦。 – Manu 2014-10-01 11:07:52

+0

謝謝...我明白我的錯誤.. – 2014-10-01 11:12:37

+0

確實,它很容易出現sql注入。但代碼中的錯誤與此部分有關。我同意PreparedStatement解決方案是將數據安全插入數據庫的更好解決方案。 – 2014-10-01 11:45:13

0

你想使用

Student temp=stu.get(i) 
temp.getRollNo() , temp.getName() 

stu.get(i)返回類型學生的一個實例。然後,您可以使用此參考來訪問學生中的字段。你以前在做的是從字面上將值「stu.get(i).getRollNo()」寫入數據庫。

0

在這裏,當您調用stu.get(i)時,它返回一個Student對象而不是String。因此您必須將參考類型更改爲學生。做以下變化,

學生temp = stu.get(i);

祝你好運!!!

4

糟糕的方法來做到這一點是從你的列表中的值嵌入到SQL字符串:

sql="INSERT INTO STUDENT VALUES('"+ stu.get(i).getRollNo()+"','"+stu.get(i).getName()+"','"+...+")"); 

做到這一點是使用PreparedStatement正確的(安全)的方式:

sql="INSERT INTO STUDENT VALUES(?,?,?,?,...,?)"; 

然後創建一個PreparedStatement,並像電話添加參數:

PreparedStatement ps = conn.prepareStatement (sql); 
ps.setString(1,stu.get(i).getRollNo()); 
ps.setString(2,stu.get(i).getName()); 
... 
ps.executeUpdate(); 

如果您關心的是不得不從列表中取多個學生,你可以將其更改爲:

PreparedStatement ps = conn.prepareStatement (sql); 
Student s = stu.get(i); 
ps.setString(1,s.getRollNo()); 
ps.setString(2,s.getName()); 
... 
ps.executeUpdate(); 
+0

其實這不是我的問題。 stu.get(i)被多次使用,如何避免使用像我上面提到的臨時變量.. – 2014-10-01 11:09:54

+0

@GaneshkumarSR這是你的問題,因爲把「stu.get(i).getRollNo()」作爲字符串在sql字符串中將不起作用,除非你使用了一些我不知道的數據庫。 – Eran 2014-10-01 11:11:35

+0

@GaneshkumarSR如果你的擔心是不得不多次鍵入'stu.get(i)',你需要一個類型爲Student的臨時變量,但是將它與PreparedStatement一起使用。 – Eran 2014-10-01 11:13:20