//jdbc?下面是java通過(guò)jdbc從數(shù)據(jù)庫(kù)查詢(xún)表格,返回ResultSet 對(duì)象的代碼
創(chuàng)新互聯(lián)于2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元溆浦做網(wǎng)站,已為上家服務(wù),為溆浦各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):028-86922220
String sql = "select username,password from account";
String user = request.getParameter("user");
String pass = request.getParameter("password");
int j = 0;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCTools1.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
//ResultSet 對(duì)象可以使用rs.getString(序列號(hào)從一開(kāi)始);的方法獲得查詢(xún)結(jié)果并顯示出來(lái)
一)[DLS_DEAD_LOCAL_STORE]
描述: Dead store to 未使用的局部變量
解決方法:局部變量定義后未使用;實(shí)例化對(duì)象后又重新對(duì)該對(duì)象賦值
(二) [ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD]
描述:Write to static field 通過(guò)實(shí)例方法更新靜態(tài)屬性
常見(jiàn)于常量類(lèi),直接通過(guò)類(lèi)名.常量名獲取的方式違背了封裝的原則,findbugs不提倡使用,而如果將常量改成靜態(tài)成員變量,又因?yàn)閟pring不支持靜態(tài)注入導(dǎo)致不能實(shí)現(xiàn),解決方法是非靜態(tài)的setter調(diào)用靜態(tài)的setter方法給靜態(tài)成員變量賦值。
解決方法:
常量類(lèi)F:
class F{
public static String a = “123”;
}
常量a改為靜態(tài)成員變量,通過(guò)F.getA()獲取,且由于spring不支持靜態(tài)注入,改為:
class F{
private static String a;
public static Integer getA() {
return a;
}
public void setA(String a) {
setAValue(a);
}
public static void setAValue(String a) {
F.a = a;
}
}
(三) [BX_UNBOXING_IMMEDIATELY_REBOXED]
描述: Boxed value is unboxed and then immediately reboxed 裝箱的值被拆箱,然后立刻重新裝箱了
常見(jiàn)的是三目運(yùn)算時(shí),同時(shí)存在基本類(lèi)型和包裝類(lèi)型。
解決方法:
Integer a = null;
//...
a = (a == null)?0:a;
此問(wèn)題在于a不為null時(shí),會(huì)被拆箱,賦值時(shí)再裝箱。這是自動(dòng)裝箱拆箱的特性,只要運(yùn)算中有不同類(lèi)型,當(dāng)涉及到類(lèi)型轉(zhuǎn)換時(shí),編譯器就會(huì)向下轉(zhuǎn)型,再進(jìn)行運(yùn)算。修改方法,統(tǒng)一類(lèi)型:
Integer a = null;
//...
a = (a == null)?Integer.valueOf(0):a;
(四) [SE_BAD_FIELD]
描述: Non-transient non-serializable instance field in serializable class在可序列化的類(lèi)中存在不能序列化或者不能暫存的數(shù)據(jù)
解決方法:
方法1:序列化該對(duì)象
方法2:當(dāng)采用struts2框架開(kāi)發(fā),不可避免的此問(wèn)題會(huì)大量出現(xiàn),因?yàn)锳ctionSupport實(shí)現(xiàn)了序列化接口,action繼承了此類(lèi),而 service沒(méi)序列化,所以在action中引用service對(duì)象時(shí)提示此錯(cuò)誤,最簡(jiǎn)單的解決方法是將service對(duì)象聲明成transient, 即service不需要序列化
方法3(未驗(yàn)證):To avoid java serialization you need to implement writeObject() and readObject() method in your Class and need to throw NotSerializableExceptionfrom those method.(action中實(shí)現(xiàn)這兩個(gè)方法?)
private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
throw new java.io.NotSerializableException( getClass().getName() );
}
private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
throw new java.io.NotSerializableException( getClass().getName() );
}
(五) [NP_LOAD_OF_KNOWN_NULL_VALUE]
描述: Load of known null value加載已知是null的值
解決方法:已知方法參數(shù)為null是,直接傳遞null而不是參數(shù)名
(六) [REC_CATCH_EXCEPTION]
描述: Exception is caught when Exception is not thrown 過(guò)泛地捕獲異?;虿东@異常后未做任何處理
解決方法:異常分類(lèi)捕獲(至少要打印出此異常對(duì)象)
(七) [NP_NULL_PARAM_DEREF]
描述: Null passed for nonnull parameter 把空值傳給了非空的參數(shù)
解決方法:增加非空判斷
(八) [NP_IMMEDIATE_DEREFERENCE_OF_READLINE]
描述: Immediate dereference of the result of readLine() 立即引用了readLine()的結(jié)果
解決方法:判斷readLine的結(jié)果是否為空
(九) [EI_EXPOSE_REP] 惡意代碼漏洞
描述:may expose internal representation by returning getter方法返回引用類(lèi)型
eclipse自動(dòng)生成的引用類(lèi)型(Object、數(shù)組、Date等)的getter、setter方法會(huì)得到或通過(guò)對(duì)可變對(duì)象的引用操作而暴露代碼內(nèi)部實(shí)現(xiàn),解決方法很多,只要返回的或賦值的對(duì)象不是原引用對(duì)象即可。
解決方法:
以Date類(lèi)型為例:
public Date getHappenTime() {
if(happenTime != null){
return (Date) happenTime.clone();
}
return null;
}
(十) [ EI_EXPOSE_REP2] 惡意代碼漏洞
描述:may expose internal representation by storing an externally mutable object into setter方法返回引用類(lèi)型
eclipse自動(dòng)生成的引用類(lèi)型(Object、數(shù)組、Date等)的getter、setter方法會(huì)得到或通過(guò)對(duì)可變對(duì)象的引用操作而暴露代碼內(nèi)部實(shí)現(xiàn),解決方法很多,只要返回的或賦值的對(duì)象不是原引用對(duì)象即可。
解決方法:
以Date類(lèi)型為例:
public void setHappenTime(Date happenTime) {
if(happenTime != null){
this.happenTime = (Date) happenTime.clone();
}else{
this.happenTime = null;
}
}
try{Connection con;\x0d\x0a Statement stmt;\x0d\x0a ResultSet rs;\x0d\x0a int temp;\x0d\x0a Class.forName("com.mysql.jdbc.Driver");\x0d\x0a con=DriverManager.getConnection("jdbc:mysql://localhost:3306/java","root","");//以上是數(shù)據(jù)庫(kù)連接,不同的數(shù)據(jù)管理器有 //不同的驅(qū)動(dòng)和鏈接方式,以上是mysql的連接\x0d\x0astmt=con.createStatement();\x0d\x0a rs=stmt.executeQuery("select * from student");//執(zhí)行查詢(xún)語(yǔ)句,結(jié)果賦值給結(jié)果集rs\x0d\x0a //結(jié)果集是結(jié)果于字段編號(hào)的映射,每一個(gè)字\x0d\x0a //段都有一個(gè)編號(hào),最小為1,也就是第一個(gè)字段 \x0d\x0a while(rs.next()){\x0d\x0a String names=rs.getString("name");//查詢(xún)結(jié)果轉(zhuǎn)換成字符串。\x0d\x0a \x0d\x0a System.out.println(names);\x0d\x0a\x0d\x0a}rs.close();\x0d\x0a }catch(Exception e){\x0d\x0a e.printStackTrace();\x0d\x0a }