자바 의 반사 메커니즘 을 이용 하여 이 루어 진 ORM 데이터베이스 조회

우 리 는 자바 개발 을 할 때 SQL 문 구 를 쓰 는 것 을 원 하지 않 습 니 다. Eclipse 에 SQL 을 검사 하 는 메커니즘 이 없 기 때문에 실수 로 잘못 썼 습 니 다. 우 리 는 지루 한 SQL 문 구 를 통 해 SQL 문 구 를 찾 는 데 어려움 을 겪 었 습 니 다.그래서 우 리 는 ORM 방식 으로 데이터 베 이 스 를 조작 하 는 것 을 좋아한다.
 
여기 서 저 는 ORM 의 조작 을 간단하게 실현 하 는 방법 을 썼 습 니 다. 여러분 의 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.
 
 
1. 우선 우 리 는 자바 주석 류 를 Id 라 고 정의 해 야 한다. 자바 1.5 이후 우 리 는 예전 에 XML 로 정 의 했 던 이런 방법 을 주석 으로 대체 할 수 있다.
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
	public String name = "id";
}

 이 주석 클래스 가 있 으 면 우 리 는 실체의 ID 가 어떤 속성 인지 정의 할 수 있 습 니 다.
2. 그 다음 에 우 리 는 실체 류 를 정의 할 수 있다.내 가 사용 하 는 데 이 터 는 SQLServer 2005 이지 만 사실은 데이터 베 이 스 를 적용 할 수 있 을 것 이다.
데이터베이스 의 표 구 조 는 다음 과 같다.
 
CREATE TABLE [dbo].[newsclass](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [varchar](45) COLLATE Chinese_PRC_CI_AS NOT NULL,
 CONSTRAINT [PK__newsclass__7F60ED59] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

 
우 리 는 이 표 에 대응 하기 위해 뉴스 클래스 를 정의 합 니 다.
public class NewsClass {
	@Id 
	private String id;
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 
다음 에 우 리 는 Dao 의 종 류 를 ORMDao 라 고 정의 할 수 있다.
public class ORMDao {
	
	/**
	 *      ID 
	 * 
	 * @param entity
	 * @return
	 */
	public String getIdField(Object entity) {

		String idField = null;
		try {
			Field[] fields = Class.forName("com.trip.info.entity.News")

			.getDeclaredFields();

			System.out.println(fields.length);

			Annotation[] annotations;

			for (Field field : fields) {

				annotations = field.getDeclaredAnnotations();

				for (Annotation a : annotations) {
					if (a.annotationType().getSimpleName().equals("Id")) {
						idField = field.getName();
					}
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return idField;
	}

	/**
	 *     
	 * 
	 * @param entity
	 * @param pageNo
	 * @param pageSize
	 * @param orderType
	 * @return
	 * @throws Exception
	 */
	public void query(Object entity){

		Field[] fields = entity.getClass().getDeclaredFields();

		String sqlSelect = "";

		String sqlWhere = "";

		String sql = "";

		Class cl = entity.getClass();

		boolean firstFlag = true;

		ArrayList<String> cols = new ArrayList<String>();
		
		String id = this.getIdField(entity);
		
		String className = entity.getClass().getSimpleName();

		for (int i = 0; i < fields.length; i++) {

			String fieldName = fields[i].getName();
			if (i != fields.length - 1) {
				sqlSelect += fieldName + ",";
			} else {
				sqlSelect += fieldName;
			}

			cols.add(fieldName);

			String methodName = "get" + fieldName.substring(0, 1).toUpperCase()
					+ fieldName.substring(1, fieldName.length());
			

			

			try{
				if (cl.getMethod(methodName).invoke(entity) != null) {
					if (firstFlag) {
						sqlWhere += " where " + fieldName + "='"
								+ cl.getMethod(methodName).invoke(entity) + "'";
						firstFlag = false;
					} else {
						sqlWhere += " and " + fieldName + "='"
								+ cl.getMethod(methodName).invoke(entity) + "'";
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
			
		}

		
		sql = "select " + sqlSelect + " from "
					+ className + sqlWhere;

		System.out.println("the final sql :" + sql);

	}

	public static void main(String[] args) {
		ORMDao dao = new ORMDao();
		NewsClass newsclass = new NewsClass();
		newsclass.setId("1");
		newsclass.setName("    ");
		dao.query(newsclass);

	}

}

 
4. 이런 방법 으로 우 리 는 단일 표 에 대한 조 회 는 스스로 SQL 코드 를 쓰 지 않 고 자바 대상 으로 대응 하여 SQL 코드 를 자동 으로 생 성하 여 개발 의 난이도 와 개 발 량 을 크게 줄 였 다.

좋은 웹페이지 즐겨찾기