设为首页 加入收藏

TOP

实施ORM的两项要旨:泛型和反射
2015-11-21 01:34:29 来源: 作者: 【 】 浏览:0
Tags:实施 ORM 要旨 反射

鄙人认为,实施 ORM 的两项要旨乃泛型和反射。下面开始看看怎么为 DAO 层添砖加瓦。

首先,在 DBAccess 基础上扩展 DBAccessORM 接口,形成基于 ORM 的数据调用。

/**
 * 数据访问对象
 * 
 * @author Frank Cheung
 * 
 */
public interface DBAccessORM extends DBAccess {

	/**
	 * 查询单笔记录,返回实体
	 * 
	 * @param sql
	 *            原生 SQL 语句
	 * @param clazz
	 *            POJO 类
	 * @return 包含值的实体类
	 */
	
  
    T queryOne(String sql, Class
   
     clazz); /** * 查询单笔记录,返回实体 * * @param qr * 拼凑 sql * @param clazz * POJO 类 * @return 包含值的实体类 */ 
    
      T queryOne(QueryRunner qr, Class
     
       clazz); /** * 查询多行记录 * * @param sql * 原生 SQL 语句 * @return 如果没有找到记录返回 null */ 
      
        T[] queryList(String sql, Class
       
         clazz); /** * 查询多行记录 * * @param qr * 拼凑 sql * @return 如果没有找到记录返回 null */ 
        
          T[] queryList(QueryRunner qr, Class
         
           clazz); /** * 查询多行记录并分页 * * @param qr * 拼凑 sql * @param start * 起始行数 * @param limit * 读取的行数 * @return 如果没有找到记录返回 null */ 
          
            T[] queryList(QueryRunner qr, int start, int limit, Class
           
             clazz); /** * 插入记录 * * @param tablename * 表名 * @param data * Map 结构数据 * @return 结果信息对象 */ // Result
            
              insert(String tablename, IRecord data); /** * 更新记录 * * @param tablename * 表名 * @param data * Map 结构数据 * @param uid * UUID * @return 结果信息对象 */ // Result
             
               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 queryOne(String sql, Class
   
     clazz) { Result
    
      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 能够对上号。

至此,通过泛型和反射就可以简单的创建 ORM 方式调用数据。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇项目开发规范,数据库设计规范 下一篇使用操作系统命令来trace监听

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: