(JDBC)利用Java反射編寫一個萬能的資料庫表查詢方法
在用JDBC的過程中,我們可能會根據實際需求來編寫N個查詢方法(特別是新手),這樣雖然簡單,但是會產生大量的重複程式碼。且不容易維護。那麼有沒有辦法,只編寫一個方法呢?
通過分析,不難發現,對於查詢,我們發現除了SQL語句的變動意外,就是實體類的變動。其它基本保持不變。
於是 我們就可以利用Java反射就可以做到這一點,但需要注意一個問題:就是實體類的屬性名一定要和資料庫查詢結果的欄位名名保持一致。(如果有別名,就和別名一致)
以下是我萌新的個人思路,大神看看就好。
比如我們資料庫中有以下一張表:
那麼我們就應該對應一個實體類:
查詢程式碼如下:public class User { private int id; private String username; private char sex; private String tell; //GET和SET方法......略 }
public class Test { public static void main(String[] args) throws Exception { //對於其它的查詢,我們只需要帶入一個SQL引數,和一個實體類的Class就可以了。不過用的時候記得強制轉換回來 List<Object> obj = query("select * from userinfo;",User.class); //列印查詢結果 for(User u : obj.toArray(new User[0])) { System.out.println(u.toString()); } } public static List<Object> query(String querySql,Class objClass) throws Exception { //查詢結果集 List<Object> queryResult = new ArrayList<Object>(); //資料庫連線,這段程式碼應該寫出去,這裡為了演示,寫裡面了 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "12345678"; Connection conn = DriverManager.getConnection(url, username, password); //執行查詢 PreparedStatement preparedStatement = conn.prepareStatement(querySql); ResultSet result = preparedStatement.executeQuery(); //獲取實體物件的方法和私有屬性 Map<String,Method> objMap = new HashMap<String,Method>(); Field [] fields = objClass.getDeclaredFields(); Method [] methods = objClass.getDeclaredMethods(); Field.setAccessible(fields, true); for(Method m:methods) { for(Field f:fields) { if(m.getName().toLowerCase().startsWith("set") && m.getName().toLowerCase().contains(f.getName().toLowerCase())) { objMap.put(f.getName(), m); } } } //獲取結果 while(result.next()) { //利用反射執行SET方法 Object obj = objClass.newInstance(); for(String fieldValue : objMap.keySet()) { Method setMethod = objMap.get(fieldValue); String paramenterType = setMethod.getParameterTypes()[0].getSimpleName(); if(paramenterType.toLowerCase().equals("string")) { setMethod.invoke(obj, result.getString(fieldValue)); } else if(paramenterType.toLowerCase().equals("int")) { setMethod.invoke(obj, result.getInt(fieldValue)); } else if(paramenterType.toLowerCase().equals("char")) { setMethod.invoke(obj, result.getString(fieldValue).toCharArray()[0]); } //。。。。。。。。這裡可以把剩餘的基本資料型別補充完整 } queryResult.add(obj); } preparedStatement.close(); conn.close(); return queryResult; } }
相關推薦
(JDBC)利用Java反射編寫一個萬能的資料庫表查詢方法
在用JDBC的過程中,我們可能會根據實際需求來編寫N個查詢方法(特別是新手),這樣雖然簡單,但是會產生大量的重複程式碼。且不容易維護。那麼有沒有辦法,只編寫一個方法呢? 通過分析,不難發現,對於查詢,我們發現除了SQL語句的變動意外,就是實體
利用java反射調用類的屬性和方法
strong lec 測試結果 正在 bject cte static err ucc 十一結束了,盼望著的十一要做的事情也沒有做成。有時候的預期和現實總是有些許的變故,Economic freedom--閑扯結束。今天,就簡單點。 一、定義 java反射:程序運行時,通過
利用Java反射機制呼叫含陣列引數的方法
–一個含有這種方法的Java類– public class Dao { public void Method2(String[] params){ //do something } } – 正確的方法– public class Test { public static void main
JDBC(六) 編寫通用的更新和查詢方法
對於C(建立),U(更新),D(刪除)都屬於更新操作,對於R(讀取查詢)屬於查詢操作。這裡編寫兩個通用的更新和查詢方法。 更新 更新簡單,只需要傳入對應的sql和sql的佔位符,然後執行更新就可以了。 /** * @return 返回影響
android中利用java反射原理將物件新增到sqlit資料庫的萬能方法
利用java的反射機制,我們可以得到物件裡的方法列表,引數列表以及對應的值,那麼我們就可以利用這些做一個萬能的插入資料庫的方法。 以下方法中表名要和資料庫名一致。 protected void insert(Object ob){ContentValues initia
利用java 反射原理寫了一個賦值和取值通用類
首先了解一下反射的原理,什麼是反射?所謂的反射就是指java 語言在執行時擁有一項自觀的能力,反射能使你得到裝載到 jvm 中的類的內部資訊,它不需要你在編碼的時候就知道所需類的內部資訊,允許程式執行時才得到所需類的內部資訊。反射能夠構建靈活的應用的程式。
利用JAVA反射機制實現調用私有方法
parse try ble cat 權限 利用 enabled tde mod 1.fragment是AccessibilityFragment的對象。須要被調用的方法的類。 setAccessible(true)並非將方法的訪問權限改成了public。而是取
利用java反射將結果集封裝成為對象和對象集合
one base try param tex csdn eject ack jlist java反射機制是什麽反射機制是在運行狀態中,可以知道任何一個類的屬性和方法,並且
利用java反射機制實現List<Map<String, Object>>轉化為List<JavaBean>
tis one row 註解 網上 span mybatis star mod 最近在用mybatis做項目,遇到將date格式化顯示到easyui的問題,需要將List<Map<String, Object>>轉化為List<JavaBean
利用java反射機制對方法進行呼叫
轉自:http://blog.csdn.net/coolcoffee168/article/details/5835143 基本步驟:首先獲取Class物件,然後用該物件獲取方法。具體的就看程式碼吧。對照本文最後的結果,會更好的理解反射機制。
SpringBoot利用java反射機制,實現靈活讀取Excel表格中的資料和匯出資料至Excel表格
如果直接把固定Excel表格模板中的資料匯入資料庫,直接將Excel中的資料讀取出來,再存入資料庫中即可,將資料匯出至固定的Excel模板方法類似。但是,有時候,開發製作的模板與客戶需要的往往有些許差別(欄位排版、欄位數量等)。為了實現匯入匯出的靈活性,將利用java的反射機
利用Java反射機制讀取註解
java程式碼: package ORM; @SxtTable("tb_student") public class SxtStudent { @SxtField(columnName="id", type="int", length=10) private i
利用Java反射機制實現物件相同欄位的複製
一、如何實現不同型別物件之間的複製問題? 1、為什麼會有這個問題? 近來在進行一個專案開發的時候,為了隱藏後端資料庫表結構、同時也為了配合給前端一個更友好的API介面文件(swagger API文件),我採用POJO來對應資料表結構,使用VO來給傳遞前端要展示的資料,同時使用DTO來進行請求
利用Java反射機制實現對象相同字段的復制
rop 對象復制 bject 不同的 turn 有一個 運算符 mes 不讓 一。如何實現不同類型對象之間的復制問題? 1、為什麽會有這個問題? 近來在進行一個項目開發的時候,為了隱藏後端數據庫表結構、同時也為了配合給前端一個更友好的API接口文檔(swagger API文
利用java反射機制實現讀取excel表格中的資料
如果直接把excel表格中的資料匯入資料庫,首先應該將excel中的資料讀取出來。 為了實現程式碼重用,所以使用了Object,而最終的結果是要獲取一個list如List<User>、List<Book>等,所以需要使用泛型機制去實現。下面會給出程式
Android系統原理與原始碼分析(1):利用Java反射技術阻止通過按鈕關閉對話方塊
本文為原創,如需轉載,請註明作者和出處,謝謝! 眾所周知,AlertDialog類用於顯示對話方塊。關於AlertDialog的基本用法在這裡就不詳細介紹了,網上有很多,讀者可以自己搜尋。那
學會利用java程式編寫“隨機輸入三角形的三邊,判斷是否能構成三角形“
package javas; import java.util.Scanner; public class TriAngle { public static void main(String[] args) { // TODO Auto-gener
利用java反射完成對比日誌功能——通用實體類
一 需求 通用實體類欄位的對比來生成日誌 /** * 物件編輯:生成欄位差異資訊 * @param oldObj 編輯前物件 * @param newObj 編輯後物件 * @param objMap 編輯物件所有欄位 * @param un
利用java反射完成對比日誌功能 一
一 需求 舉例:對商品進行編輯,並記錄差異日誌。相信這在javaWeb中是個很常見對功能,常見的做法就是一個個比較,很麻煩,實體類可能有十幾二十幾個欄位,還要排除NullPointException的情況(非必填項),用反射的方法可以避免這些零碎的判斷!直接上程式碼!
【Java】編寫一個方法,實現基本的字串壓縮功能
利用重複字元出現的次數,編寫一個方法,實現基本的字串壓縮功能。 例如,字串aabcccccaaa會變為a2b1c5a3。若壓縮後的字串沒有變短,則返回原先的字串。 StringBuffer: 如果頻繁地對字串進行拼接,直接用“+”的話會建立很多String型的物件,對伺服器