자바 실체 bean 대상 대량 데이터 전송 처리 방안 소결
다음은 본 고 를 통 해 자바 실체 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 대상 데이터 전송 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.