實施 ORM 的兩項要旨:泛型和反射,orm要旨

來源:互聯網
上載者:User

實施 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 方式調用資料。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.