반사 를 통 해 공용 데이터베이스 조작 방법 을 실현 하 다

최근 프로젝트 에 서 는 웹 프로젝트 이기 때문에 struts 1. X 와 spring 의 프레임 워 크 를 사 용 했 습 니 다.프로젝트 자체 의 일부 구조, 역사 문제 등 으로 인해 전체 구 조 는 struts 와 spring 의 구 조 를 사 용 했 지만 가장 기본 적 인 기술 과 기능 을 사용 했다.그 중에서 데이터 베이스 와 의 상호작용 은 아무런 구조 도 사용 되 지 않 았 습 니 다. 원생 의 jbdc 를 사 용 했 습 니 다. 다행히 프로젝트 자체 의 규모 가 크 지 않 고 단순 한 jdbc 가 만족 하지만 모든 표를 조작 하 는 것 은 힘 든 쓰기 방법 이 라 고 생각 합 니 다. 조 심 스 러 운 전 삼, 맞 춤 법 sql 문 구 는 힘 들 었 습 니 다. 나중에 공공 유형 을 쓸 수 있 을 지 생각 했 습 니 다. 가장 원시 적 인 증가, 삭제, 수정, 검사 방법 을 포함 합 니 다.사용 할 때 직접 호출 하거나 단독으로 계승 할 때 모든 업무 모듈 이 자신의 증가, 삭제, 수정, 조사 방법 을 스스로 쓰 지 않 아 도 된다.
   이 사고방식 을 따라 생각 하기 시작한다. 조작 표를 조작 할 때 한 필드 만 조작 하 는 것 이 아니다. 테스트 의 편 의 를 위해 폼 데이터 가 데이터베이스 에 삽입 되 거나 업데이트 되 어야 할 때 표 와 대응 하 는 클래스 (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 방법 으로 접근 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기