标签:
鄙人认为,实施 ORM 的两项要旨乃泛型和反射。下面开始看看怎么为 DAO 层添砖加瓦。
首先,在 DBAccess 基础上扩展 DBAccessORM 接口,形成基于 ORM 的数据调用。
/**
* 数据访问对象
*
* @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 方式调用数据。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zhangxin09/article/details/48209239