實施 ORM 的兩項要旨:泛型和反射,orm要旨
鄙人認為,實施 ORM 的兩項要旨乃泛型和反射。下面開始看看怎麼為 DAO 層添磚加瓦。
首先,在 DBAccess 基礎上擴充 DBAccessORM 介面,形成基於 ORM 的資料調用。
/** * Data Access Objects * * @author Frank Cheung * */public interface DBAccessORM extends DBAccess {/** * 查詢單筆記錄,返回實體 * * @param sql * 原生 SQL 陳述式 * @param clazz * POJO 類 * @return 包含值的實體類 */<T> T queryOne(String sql, Class<T> clazz);/** * 查詢單筆記錄,返回實體 * * @param qr * 拼湊 sql * @param clazz * POJO 類 * @return 包含值的實體類 */<T> T queryOne(QueryRunner qr, Class<T> clazz);/** * 查詢多行記錄 * * @param sql * 原生 SQL 陳述式 * @return 如果沒有找到記錄返回 null */<T> T[] queryList(String sql, Class<T> clazz);/** * 查詢多行記錄 * * @param qr * 拼湊 sql * @return 如果沒有找到記錄返回 null */<T> T[] queryList(QueryRunner qr, Class<T> clazz);/** * 查詢多行記錄並分頁 * * @param qr * 拼湊 sql * @param start * 起始行數 * @param limit * 讀取的行數 * @return 如果沒有找到記錄返回 null */<T> T[] queryList(QueryRunner qr, int start, int limit, Class<T> clazz);/** * 插入記錄 * * @param tablename * 表名 * @param data * Map 結構資料 * @return 結果資訊對象 */// Result<CreateAction> insert(String tablename, IRecord data);/** * 更新記錄 * * @param tablename * 表名 * @param data * Map 結構資料 * @param uid * UUID * @return 結果資訊對象 */// Result<UpdateAction> update(String tablename, IRecord data, String uid);/** * 指定表名和 id,刪除一條記錄 * * @param tablename * 表名 * @param uid * UUID * @return 結果資訊對象 */// boolean delete(String tablename, String uid);}
當前先完成讀操作,寫操作留待有時間再完成。
使用方法:
public static class News{private String name;public String getName(){return name;}public void setName(String name){this.name = name;}}// 查詢一條記錄DBAccessORM dao = new DBAccessImpl_ORM(conn);News news = dao.queryOne("SELECT * FROM news WHERE uid = '2ccccd21-b89c-416b-a511-59103fd0b1cc'", News.class);
可見,實體類只需要傳入目標 Class.class 即可定義泛型的具體類型,無須強型別轉換。
能理解了泛型,使用起來就比較方便了。下面接著說說反射的運用。
試舉一個例子,查詢單行資料返回實體。
public <T> T queryOne(String sql, Class<T> clazz) {Result<Record> result = queryOne(sql); // 查詢結果if(result != null) {T obj = Reflect.newInstance(clazz); // 通過反射建立 POJO 執行個體for (String name : result.result.keySet()) Reflect.setProperty(obj, name, result.result.get(name));return obj;} else return null;}
Reflect.newInstance(clazz); 是通過反射建立 POJO 的執行個體,即 Bean。光有 Bean 空執行個體沒用,還要往裡面塞資料。我們使用反射包的 Reflect.setProperty() 調用 setter 塞資料。當然,前提要求是 Map 的 key 是與 Bean 的 setXXX 中的 XXX 能夠對上號。
關於 Java 反射的運用,可以看看我之前的文章《反射(Reflection)備忘 》。
至此,通過泛型和反射就可以簡單的建立 ORM 方式調用資料。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。