1. 程式人生 > >(JDBC)利用Java反射編寫一個萬能的資料庫表查詢方法

(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型的物件,對伺服器