实施 ORM 的两项要旨:泛型和反射
来源:互联网 发布:余弦相似度公式 python 编辑:程序博客网 时间:2024/06/12 01:18
鄙人认为,实施 ORM 的两项要旨乃泛型和反射。开始的时候 DAO 并没有实现 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 方式调用数据。
1 1
- 实施 ORM 的两项要旨:泛型和反射
- C# ORM中反射与泛型的交叉应用
- C# ORM 反射与泛型的交叉应用
- C# ORM 泛型与反射的交叉应用
- 实施反射型xss攻击的途径
- 使用ORM、反射、泛型书写通用的增删改查方法
- dbutils和反射实现ORM问题整理
- 【Go】Beego Orm中反射的应用
- ORM:django的ORM和SQLalchemy
- C#发现之旅第十二讲 基于反射和动态编译的快速ORM框架
- 基于注解和反射的Java ORM框架(1)-通过注解描述映射关系
- 基于注解和反射的Java ORM框架(2)-设计理念
- 基于注解和反射的Java ORM框架(3)-极速CRUD操作
- 基于注解和反射的Java ORM框架(4)-数据库自动生成Java实体类
- 基于注解和反射的Java ORM框架(5)-CRUD操作源码
- 基于注解和反射的Java ORM框架(6)-数据库自动生成Java实体类源码
- Android Binder驱动的工作机制之要旨
- 反射(五)ORM
- HDU——2104 hide handkerchief
- 嵌入式linux之DMA驱动
- 多对多的关系操作
- 关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)
- 步骤条的实现原理及AliceUI中步骤条Step的应用
- 实施 ORM 的两项要旨:泛型和反射
- 18.策略模式
- RVO和NRVO
- PHP循环遍历倒金字塔
- 数字在排序数组中出现的次数
- iOS 文本与图片表情混排的实现
- Win7/8/10 U盘安装方法汇总
- SharePoint 2013 IT Professional —— Permissions
- Java Web 国际化