整體的邏輯結(jié)構(gòu)
????導包
????加載數(shù)據(jù)庫驅(qū)動Driver
????獲得連接
????獲取Statement對象(直接對數(shù)據(jù)數(shù)據(jù)進行操作)
? ? ????增刪改
? ? ????查
????????????獲取結(jié)果集rs
????????????得到元數(shù)據(jù)
????????????獲取標簽的個數(shù)和名稱
????????????獲取屬性值
????????????創(chuàng)建對象數(shù)組芍锦,并使用反射存儲結(jié)果
????關(guān)閉re,statement,connection等對象
獲得連接對象connection的五種方法
? ? ? ? 1.使用jar包中的Driver類直接創(chuàng)建Driver對象
? ? ? ? 2.使用Class.forName(className)獲取Driver的Class對象
? ? ? ? 3.使用2.的方法獲取Driver對象后头遭,使用DriverManager來創(chuàng)建連接
? ? ? ? 4.省略3.中的中間步驟豹爹,兩句搞定:Class.forName(driverName);
? ????????????????Connection conn = DriverManager.getConnection(url, user, password);
? ? ? ? 5.在4.的基礎(chǔ)上,將配置信息封裝在文件中,實現(xiàn)數(shù)據(jù)和代碼的分離,使用Properties/load(inputstream)來讀取文件,并進行賦值
最終實現(xiàn)連接的方式
????????(方式5)數(shù)據(jù)庫配置+操作 封裝成類JDBCUtils,之后直接使用該類的靜態(tài)方法來獲取連接對象
Statement所帶來的注入問題
? ? ? ? 通過傳入特殊參數(shù)园匹,實現(xiàn)語句查詢永遠成功,例如:
????????SELECT user,password FROM user_table WHERE user = '1' or ' AND password = '=1 or '1' = '1'劫灶;
子類PrepareStatement解決注入(使用方法)
????使用子類PrepareStatement, 解決注入問題裸违,并實現(xiàn)高效的批量操作
????????1.使用connection對象,傳入sql語句本昏,來創(chuàng)建:? ?ps = conn.prepareStatement(sql);
????????2. 立馬填充值供汛,使用setObject() , 解釋了問什么傳入的參數(shù)args 是Object:? ps.setObject(i + 1, args[i]);
????????3. 執(zhí)行,返回值rs (結(jié)果集)
????????4.元數(shù)據(jù)
????????5.列數(shù)
????????6.re.next
????????????7.創(chuàng)建存儲對象
????????????8.給對象屬性賦值(根據(jù)列數(shù)來for循環(huán))
? ? ? ? ? ????? 9.? 獲取re所指行的屬性值
? ? ? ? ? ? ? ?10. 獲取該屬性對應的標簽名 (getcolumnLable())
? ? ? ? ? ? ? ?11. 利用反射給對象的該屬性賦值
????????????????????1.getDeclaredField(標簽名)
????????????????????2.設(shè)置可修改
? ? ? ? ? ? ? ? ? ? 3.field.set(p, 值)
? ? ? ? ? ? 12. 集合添加對象
? ? ? ? 13.返回集合? ? ? ? ? ??
反射存儲結(jié)果時,出現(xiàn)標簽名稱和類屬性名稱不一致的問題
????????———— 在sql語句給標簽重命名怔昨,并將getcolumnName() 換成 getcolumnLable()方法
通用sql增刪改查 對象的注意點
????????查的數(shù)據(jù)可能多條雀久,需要使用集合來存儲
????????每一條數(shù)據(jù)對應一個對象
????????傳入?yún)?shù): sql語句,查詢數(shù)據(jù)對應的對象趁舀,以及sql語句中“赖捌?” 的填充值
????????String sql, class.Class, Object ...args;?
使用泛型來存儲不同數(shù)據(jù)對應的類的對象
????????public <T>? List<T>? getForList(Class<T> clazz,String sql, Object... args){}