实施 ORM 的两项要旨:泛型和反射

简介: 鄙人认为,实施 ORM 的两项要旨乃泛型和反射。开始的时候 DAO 并没有实现 ORM,下面就看看怎么为 DAO 层添砖加瓦。首先,在 DBAccess 基础上扩展 DBAccessORM 接口,形成基于 ORM 的数据调用。

鄙人认为,实施 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 方式调用数据。

目录
相关文章
|
Java 数据库连接 Spring
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(下)
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(下)
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(下)
|
API C#
C#反射与特性(三):反射类型的成员
C#反射与特性(三):反射类型的成员
257 0
|
11天前
|
安全 API C#
C#.Net筑基-类型系统②常见类型--枚举Enum
枚举(enum)是C#中的一种值类型,用于创建一组命名的整数常量。它们基于整数类型(如int、byte等),默认为int。枚举成员可指定值,未指定则从0开始自动递增。默认值为0。枚举可以与整数类型互相转换,并可通过`[Flags]`特性表示位域,支持位操作,用于多选场景。`System.Enum`类提供了如`HasFlag`、`GetName`等方法进行枚举操作。
|
22天前
|
C++
C++:类的补充知识
C++:类的补充知识
20 0
|
22天前
|
Arthas SQL Java
不规范的枚举类代码引发的一场事故
作者参与了一个问题排查,最后得到的结论和枚举类的规范有关系,本文将过程总结在这里提供大家一起学习交流。
460 0
jira学习案例15-用泛型增强useDebounce类型灵活性
jira学习案例15-用泛型增强useDebounce类型灵活性
46 0
jira学习案例15-用泛型增强useDebounce类型灵活性
C++ 继承与派生中的赋值兼容规则问题探究
C++ 继承与派生中的赋值兼容规则问题探究
142 0
C++ 继承与派生中的赋值兼容规则问题探究
|
XML 前端开发 Java
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(上)
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(上)
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(上)
|
前端开发 Java Spring
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(中)
深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】(中)
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )
122 0