자바 실체 bean 대상 대량 데이터 전송 처리 방안 소결

javaBean 은 MVC 디자인 모델 에서 model 이 라 고도 부 르 고 모델 층 이 라 고도 부 릅 니 다.일반적인 프로그램 에서 우 리 는 이 를 데이터 층 이 라 고 부 릅 니 다.바로 데이터 의 속성 과 행 위 를 설정 하 는 것 입 니 다.그리고 저 는 속성 과 속성 을 설정 하 는 get/set 방법 을 제공 할 것 입 니 다.자바 빈 은 JAVA 언어 로 작 성 된 재 활용 가능 한 구성 요소 입 니 다.자바 빈 으로 쓰기 위해 서 는 클래스 가 구체 적 이 고 공공 적 이 며 매개 변수 가 없 는 구조 기 가 있어 야 합 니 다.
다음은 본 고 를 통 해 자바 실체 bean 대상 의 대량 데이터 전송 처 리 를 이용 한 솔 루 션 을 공유 합 니 다.
수요
현재 두 개의 데이터베이스 시트 구조 가 같 고 한 측 A,다른 한 측 B 가 있 는데 지금 은 A 에서 여러 개의 표 의 데 이 터 를 조회 하여 B 로 전송 하여 저장 하려 고 합 니 다.
해결 방안
가장 간단 하고 거 친 방법 은 A 곳 의 관련 표 의 데 이 터 를 실체 대상 에 밀봉 한 다음 에 List 집합 에 넣 고 B 곳 에 전달 하고 B 곳 을 다시 옮 겨 다 니 며 집합 하여 데 이 터 를 B 곳 에 저장 하 는 것 이다.그러나 이 문 제 는 표 의 데 이 터 를 하나 더 추가 하려 면 조회 코드 를 바 꾸 고 저 장 된 코드 를 바 꿔 야 하기 때문에 사용 하 는 것 을 권장 하지 않 습 니 다.
방안 2
어떤 데 이 터 를 준비 해 야 할 실체 클래스 를 새로 만 듭 니 다.
조 회 를 기다 리 는 고양이

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cat {

    private String id;

    private String food;

    private String weight;

    private String height;

}
조 회 를 기다 리 는 개

@Data
@AllArgsConstructor
public class Dog {

    private String id;

    private String food;

    private String weight;

    private String height;
}
조 회 를 기다 리 는 돼지

@Data
@AllArgsConstructor
public class Pig {

    private String id;

    private String food;

    private String weight;

    private String height;

    private String pid;
}
전송 실체 대상 을 사용자 정의 합 니 다.집합 대상 을 조회 해 야 한 다 는 것 을 정의 합 니 다.

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomDataTransferDTO{

    /**
     * ===============================================================
     *                               
     * ===============================================================
     */
    /**
     *        
     */
    private List<Cat> catList;

    /**
     *                    
     */
    @CustomAnnotation.connectTable(tablePath = "com.study.customdatatransfer.Pig")
    private List<Dog> dogList;

    /**
     *        
     */
    @Ignore
    private List<Pig> pigList;
2,새 매개 변수 관계 클래스
공통 매개 변수 관계 클래스

/**
 *            
 * @author jieya
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonParameterDTO {

    /**
     * ===============================================================
     *                                          
     * ===============================================================
     */
    /**
     *     
     */
    public String id;

}
사용자 정의 조회 매개 변수

/**
 *                    
 * @author Administrator
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableAndParamsDTO {

    /**
     *                   ,   table     CustomDataTransferDTO  List     
     */
    @CustomAnnotation.Table
    private String table;
    /**
     * ===============================================================
     *                               
     * ===============================================================
     */
    /**
     *          search           
     */
    @CustomAnnotation.search
    private String food;

    /**
     * connectSearchTerm(term = "id")                ,   id     pid
     */
    @CustomAnnotation.connectSearchTerm(term = "id")
    private String pid;
}
새 사용자 정의 처리 주 방법

/**
 *           
 *
 * @author Administrator
 */
public class CustomDataMain {

    private static final List<Cat> catList = new ArrayList<>();
    private static final List<Dog> dogList = new ArrayList<>();
    private static final List<Pig> pigList = new ArrayList<>();
    private static List<TableAndParamsDTO> tableAndParamsList = new ArrayList();
    private static CommonParameterDTO commonParameter = new CommonParameterDTO();

    static {
        catList.add(new Cat("1", "  1", "10", "12"));
        catList.add(new Cat("2", "  2", "10", "12"));
        catList.add(new Cat("3", "  3", "10", "12"));
        catList.add(new Cat("4", "  4", "10", "12"));

        dogList.add(new Dog("1", "  1", "10", "12"));
        dogList.add(new Dog("2", "  2", "10", "12"));
        dogList.add(new Dog("3", "  3", "10", "12"));
        dogList.add(new Dog("4", "  4", "10", "12"));

        pigList.add(new Pig("1", "   1", "10", "12", "1"));
        pigList.add(new Pig("2", "   2", "10", "12", "2"));
        pigList.add(new Pig("3", "   3", "10", "12", "3"));
        pigList.add(new Pig("4", "   4", "10", "12", "4"));
    }

    public static void main(String[] args) throws Exception {
        //     
        commonParameter.setId("1");
        //
        TableAndParamsDTO tableAndParamsDTO = new TableAndParamsDTO();
        tableAndParamsDTO.setTable("Pig");
        tableAndParamsDTO.setFood("   1");
        tableAndParamsDTO.setPid("id");
        tableAndParamsList.add(tableAndParamsDTO);
        findCustomData(CustomDataTransferDTO.class);
    }

    public static Object findCustomData(Class<?> clazz) throws Exception {

        //         
        Object obj = clazz.newInstance();


        //     pojo      
        Field[] fields = clazz.getDeclaredFields();
        for (Field curField : fields) {
            //        (  ,    )
            curField.setAccessible(true);
            //   
            if (!curField.isAnnotationPresent(Ignore.class)) {
                CustomAnnotation.connectTable annotation = curField.getAnnotation(CustomAnnotation.connectTable.class);
                String sideTablePath = null;
                if (annotation != null) {
                    sideTablePath = annotation.tablePath();
                }

                Class<?> curFieldType = curField.getType();
                //   List  
                if (curFieldType.equals(List.class)) {
                    //          
                    Type genericType = curField.getGenericType();
                    if (null == genericType) {
                        continue;
                    }
                    if (genericType instanceof ParameterizedType) {
                        ParameterizedType pt = (ParameterizedType) genericType;
                        //       class    
                        Class<?> actualTypeArgument = (Class<?>) pt.getActualTypeArguments()[0];
                        //         
                        String tablePath = actualTypeArgument.getName();
                        //         
                        String tableName = actualTypeArgument.getSimpleName();
                        //                
                        TableAndParamsDTO tableAndParams = tableAndParamsList.stream().filter(o -> o.getTable().equals(tableName)).findAny().orElse(null);
                        //   hql       
                        obj = connectSqlAndExexute(obj, clazz, tablePath, tableAndParams, sideTablePath);
                    }
                } else {
                    System.out.println(curField.getName() + "--       --" + curFieldType.getSimpleName());
                }
            } else {
                System.out.println("Ignore----");
            }
        }
        return null;
    }

    /**
     *   sql     
     *
     * @param obj
     * @param clazz
     * @param tablePath
     * @param tableAndParams
     * @param sideTablePath
     * @return
     * @throws Exception
     */
    private static Object connectSqlAndExexute(Object obj, Class<?> clazz, String tablePath,
                                               TableAndParamsDTO tableAndParams, String sideTablePath) throws Exception {
        int lastIndex = tablePath.lastIndexOf(".");
        String tableName = tablePath.substring(lastIndex + 1);
        List<Object> param = new ArrayList<>();
        //     
        StringBuilder selectBuilder = new StringBuilder(" select * from " + tableName + " where 1=1");
        //     
        StringBuilder whereBuilder = new StringBuilder();

        //       
        if (commonParameter != null) {
            //       
            Field[] fields = commonParameter.getClass().getDeclaredFields();
            for (Field curField : fields) {
                //        (  ,    )
                curField.setAccessible(true);
                String name = curField.getName();
                whereBuilder.append(" and " + name + "=?");
                Object vlaue = ReflectionUtil.getVlaue(commonParameter, name, "");
                param.add(vlaue);
            }
        }
        //                     ,            
        if (tableAndParams != null) {
            //                
            //     
            String table = tableAndParams.getTable();

            //          
            Field[] fields = tableAndParams.getClass().getDeclaredFields();
            for (Field field : fields) {
                //          
                if (field.isAnnotationPresent(CustomAnnotation.search.class)) {
                    whereBuilder.append(" and " + field.getName() + "=?");
                    Object vlaue = ReflectionUtil.getVlaue(tableAndParams, field.getName(), "");
                    param.add(vlaue);
                }

                //     
                if (field.isAnnotationPresent(CustomAnnotation.connectSearchTerm.class)) {
                    String name = field.getName();
                    String values = GsUtils.blankNull(ReflectionUtil.getVlaue(tableAndParams, name, ""));
                    String[] split = values.split(",");
                    String sideWhere = "";
                    for (int i = 0; i < split.length; i++) {

                        sideWhere += " and " + name + " in(";
                        sideWhere += "'" + split[i] + "'" + ",";
                    }
                    ;
                    sideWhere = sideWhere.substring(0, sideWhere.length() - 1);
                    sideWhere += " )";

                    whereBuilder.append(sideWhere);
                }
            }

        }
        //        class  
        Class tableClazz = Class.forName(tablePath);
        // hql    hql    and   ,    sql,      
        if (StringUtils.isEmpty(whereBuilder.toString())) {
            throw new Exception("hql  ,    and    ,       " + selectBuilder.toString());
        }
        // TODO   sql          list<bean>   
        // List list = baseDao.findByHql(selectBuilder.toString()+whereBuilder.toString(),tableClazz,param);
        // TODO                 
        List list = findDataInfo(tableName,whereBuilder,param);
        //                    
        if (list != null && list.size() > 0) {
            obj = ReflectionUtil.setValue(obj, clazz, tableName, list);
        }

        //     
        if (sideTablePath != null) {
            String sideTableName = Class.forName(sideTablePath).getSimpleName();
            //                
            TableAndParamsDTO sideTableAndParams = tableAndParamsList.stream().filter(o -> o.getTable().equals(sideTableName)).findAny().orElse(null);
            //          
            Field[] sideFields = sideTableAndParams.getClass().getDeclaredFields();
            for (Field field : sideFields) {
                //     
                if (field.isAnnotationPresent(CustomAnnotation.connectSearchTerm.class)) {
                    String term = field.getAnnotation(CustomAnnotation.connectSearchTerm.class).term();
                    String sideParam = "";
                    for (Object obj1 : list) {
                        Object value = ReflectionUtil.getVlaue(obj1, (String) term, "");
                        if (value != null) {
                            sideParam += value + ",";
                        }
                    }
                    if (StringUtils.isEmpty(sideParam)) {
                        throw new Exception("              " + selectBuilder.toString());
                    }
                    //         
                    field.setAccessible(true);
                    field.set(sideTableAndParams, sideParam);
                }
            }
            //   hql       
            obj = connectSqlAndExexute(obj, clazz, sideTablePath, sideTableAndParams, null);
        }
        System.out.println("tableAndParams:" + tableAndParams + "commonParams:" + commonParameter + "  sql  :" + selectBuilder.toString() + whereBuilder.toString() + "    :" + param + "    :" + list);
        return obj;
    }

    private static List findDataInfo(String tableName, StringBuilder whereBuilder, List<Object> param) {
        List<Object> list = new ArrayList<Object>();
        if("Cat".equals(tableName)){
            list.add(catList.get(0));
            return list;
        }
        if("Dog".equals(tableName)){
            list.add(dogList.get(0));
            return list;
        }
        return list;
    }
}
실행 이 끝 난 후에 우리 가 필요 로 하 는 데 이 터 를 얻 을 수 있 을 것 이다.
4.데 이 터 를 가 져 온 후 다른 쪽 에 보 내 어 분석 저장

/**
     *        
     *
     * @param obj
     */
    @Override
    public void saveOtherInfo(Object obj) throws Exception {
        //     pojo      
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field curField : fields) {
            //        (  ,    )
            curField.setAccessible(true);

            Class<?> curFieldType = curField.getType();
            //   List  
            if (curFieldType.equals(List.class)) {
                //          
                Type genericType = curField.getGenericType();
                if (null == genericType) {
                    continue;
                }
                if (genericType instanceof ParameterizedType) {
                    Object object = ReflectionUtil.getVlaue(obj,(String) curField.getName(),"");
                    if(object!=null){
                        List list = (List)object;
                        for (int i=0;i<list.size();i++){
                            Object o = list.get(i);
//                            baseDao.saveOrUpdate(o);
                        }
                    }
                }
            }else{
                System.out.println((curField.getName() + "--       --" + curFieldType.getSimpleName()));
            }
        }
    }
이렇게 양쪽 에서 데이터 전송 을 하면 완성 되 거나 중간 에 메시지 중간 부품 을 사용 하여 전송 해도 된다.
이상 은 자바 실체 bean 대상 의 대량 데이터 전송 처리 에 대한 상세 한 내용 입 니 다.자바 bean 대상 데이터 전송 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기