ORM 구현의 두 가지 요지: 범주 및 반사

3157 단어
나는 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);
}

현재 읽기 작업을 완료하고 쓰기 작업은 나중에 완료합니다.
사용 방법:
4
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입니다.빈칸만 있으면 소용없고, 안에 데이터를 넣어야 한다.우리는 반사 패키지의 Reflect를 사용합니다.setProperty()에서 setter 플러그 데이터를 호출합니다.물론 맵의 키는 빈의 setXXX 중의 XXX와 맞출 수 있다는 전제 조건이 있다.
자바 반사 활용에 관해서는 저의 이전 글인'반사(Reflection) 메모'를 보실 수 있습니다.
이로써 범용과 반사로 ORM 방식으로 데이터를 간단하게 만들 수 있습니다.

좋은 웹페이지 즐겨찾기