반사 를 통 해 공용 데이터베이스 조작 방법 을 실현 하 다
이 사고방식 을 따라 생각 하기 시작한다. 조작 표를 조작 할 때 한 필드 만 조작 하 는 것 이 아니다. 테스트 의 편 의 를 위해 폼 데이터 가 데이터베이스 에 삽입 되 거나 업데이트 되 어야 할 때 표 와 대응 하 는 클래스 (bean) 로 봉 인 된 다음 에 이 클래스 에서 값 을 추출 하여 갱신한다.이 클래스 의 속성 은 데이터 시트 필드 와 일일이 대응 되 며 이름 을 포함 하여 모두 같 습 니 다.그러면 공공 save (Object obj) 방법 을 써 서 bean 을 전송 할 수 있 습 니 다. 이 bean 의 속성 이름과 값 에 따라 sql 문 구 를 연결 할 수 있 습 니 다. sql 문 구 를 사용 하면 jdbc 를 사용 하여 데이터 베 이 스 를 직접 조작 할 수 있 습 니 다.어떻게 bean 의 속성 이름과 값 을 얻 는 지 자바 의 반사 기술 을 사용 합 니 다.자바 의 반사 기술 을 통 해 프로그램 에서 대상 인 스 턴 스 의 클래스 정 보 를 얻 을 수 있 고 그 속성의 값 을 얻 고 수정 할 수 있 습 니 다.그래서 몇 시간 동안 공공 종 류 를 썼 는데 증가, 삭제, 수정, 검사 방법 을 포함 하지만 그 성능 과 안전성 은 검증 이 필요 하 다.
지금 은 허름 한 모습 만 쓰 고 있 지만 문제 가 있 는 지 없 는 지 는 아직 모 르 겠 습 니 다. 프로젝트 에서 사용 할 지 테스트 를 해 야 합 니 다. 그리고 주요 코드 는 다음 과 같 습 니 다.
// sql
StringBuffer sql = new StringBuffer("insert into");
sql.append(tableName).append("(");
// ,
StringBuffer params = new StringBuffer(" values(");
//
ArrayList values = new ArrayList();
//
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
// ,true
field.setAccessible(true);
//
String fieldName = field.getName();
Object value = field.get(obj);
sql.append(fieldName + ",");
params.append("?,");
values.add(value);
}
sql.append(sql.deleteCharAt(sql.length() -1) + ")");
params.append(params.deleteCharAt(params.length() -1) + ")");
sql.append(params);
PreparedStatement st = conn.prepareStatement(sql.toString());
for (int i = 0; i < values.size(); i++) {
st.setObject(i + 1,values.get(i));
}
//
st.executeUpdate();
이 중간 에 문제 가 발생 했 습 니 다. 속성 (Field) 을 사용 하여 대상 속성 정 보 를 직접 방문 할 때 최초의 bean 은 계승 되 었 습 니 다. 모든 표 의 공공 필드 는 하나의 기본 클래스 bean 에 쓰 여 있 고 모든 표 의 bean 은 이 기본 클래스 bean 을 계승 합 니 다.이렇게 하면 모든 표 의 bean 에 대해 속성 정 보 를 취 할 때 계승 하 는 속성 을 얻 을 수 없 지만 모든 종 류 는 기본 클래스 의 Class 유형 을 얻 을 수 있 습 니 다. 그러면 재 귀적 인 방법 으로 모든 계승 관계 의 모든 속성 정 보 를 얻 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다:
/**
*
* ( )
*
* @param obj
* @return ( )
* @see [ 、 # 、 # ]
*/
public Field[] getAllClassField(Object obj) {
Field[] allfield ;
// Object,
if (!obj.getClass().getSuperclass().equals(Object.class)) {
// ,
Field[] fields = getAllClassField(obj.getClass().getSuperclass());
//
Field[] myFields = obj.getClass().getDeclaredFields();
//
allfield = new Field[fields.length + myFields.length];
System.arraycopy(fields, 0, allfield, 0, fields.length);
System.arraycopy(myFields, 0, allfield, fields.length, myFields.length);
} else {
// ,
allfield = obj.getClass().getDeclaredFields();
}
return allfield;
}
또한, 접근 속성 데 이 터 는 Field 대상 의 set / get 방법 으로 직접 접근 할 수 있 으 며, 대상 의 set / get 방법 으로 접근 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.