最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Java實體bean對象批量數(shù)據(jù)傳輸處理方案小結(jié)

 更新時間:2021年05月20日 08:26:43   作者:jieya  
javabean是對面向?qū)ο笏枷氲囊环N具體實施的表現(xiàn),本文重點給大家介紹利用Java實體bean對象批量數(shù)據(jù)傳輸處理方案小結(jié),本文通過兩種方案給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

javaBean在MVC設(shè)計模型中是model,又稱模型層,在一般的程序中,我們稱它為數(shù)據(jù)層,就是用來設(shè)置數(shù)據(jù)的屬性和一些行為,然后我會提供獲取屬性和設(shè)置屬性的get/set方法JavaBean是一種JAVA語言寫成的可重用組件。為寫成JavaBean,類必須是具體的和公共的,并且具有無參數(shù)的構(gòu)造器。

下面通過本文給大家分享利用Java實體bean對象批量數(shù)據(jù)傳輸處理的解決方案。

需求

現(xiàn)在有兩方數(shù)據(jù)庫表結(jié)構(gòu)相同,一方A、另一個方B,現(xiàn)想從A處查詢出多個表的數(shù)據(jù),傳輸?shù)紹地保存起來。

解決方案1

最簡單粗暴的方法就是,查詢出A處相關(guān)表的數(shù)據(jù)封裝到實體對象中,之后放到List集合中,再傳遞給B處,B處再遍歷集合,將數(shù)據(jù)保存到B處。但是此處的問題是想要再添加一個表的數(shù)據(jù)時,需要改查詢的代碼還需要改保存的代碼,非常麻煩,所以不建議使用。

方案2

新建一個需要準(zhǔn)備哪些數(shù)據(jù)的實體類對象

待查詢的貓

@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{

    /**
     * ===============================================================
     *                         數(shù)據(jù)查詢結(jié)果
     * ===============================================================
     */
    /**
     * 待查詢的貓信息
     */
    private List<Cat> catList;

    /**
     * 待查詢的狗信息 通過注解來明確關(guān)聯(lián)關(guān)系
     */
    @CustomAnnotation.connectTable(tablePath = "com.study.customdatatransfer.Pig")
    private List<Dog> dogList;

    /**
     * 待查詢的豬信息
     */
    @Ignore
    private List<Pig> pigList;

2,新建參數(shù)關(guān)系類

公共參數(shù)關(guān)系類

/**
 * 這里為共通參數(shù)信息設(shè)置
 * @author jieya
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonParameterDTO {

    /**
     * ===============================================================
     *                         這里配置所有集合查詢的公共查詢條件
     * ===============================================================
     */
    /**
     * 主鍵信息
     */
    public String id;

}

自定義查詢參數(shù)

/**
 * 自定義查詢條件及關(guān)聯(lián)表信息查詢實體對象
 * @author Administrator
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableAndParamsDTO {

    /**
     * 主表名 這里是查詢那個實體對象的數(shù)據(jù),這里的table值一定要和CustomDataTransferDTO中的List的泛型對上
     */
    @CustomAnnotation.Table
    private String table;
    /**
     * ===============================================================
     *                          自定義參數(shù)
     * ===============================================================
     */
    /**
     * 自定義查詢參數(shù)  search 標(biāo)記這是一個查詢參數(shù)
     */
    @CustomAnnotation.search
    private String food;

    /**
     * connectSearchTerm(term = "id")  這個標(biāo)記為這是連表查詢的副表,主表的id等于副表的pid
     */
    @CustomAnnotation.connectSearchTerm(term = "id")
    private String pid;
}

新建自定義處理主方法

/**
 * 自定義數(shù)據(jù)處理主方法
 *
 * @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 {
        // 共通參數(shù)
        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 {

        // 實例化數(shù)據(jù)傳輸類
        Object obj = clazz.newInstance();


        // 首先得到pojo所定義的字段
        Field[] fields = clazz.getDeclaredFields();
        for (Field curField : fields) {
            // 設(shè)置字段可訪問(必須,否則報錯)
            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)) {
                    // 當(dāng)前集合的泛型類型
                    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();
                        // 獲取該實體對象設(shè)置的自定義信息
                        TableAndParamsDTO tableAndParams = tableAndParamsList.stream().filter(o -> o.getTable().equals(tableName)).findAny().orElse(null);
                        // 拼接hql和執(zhí)行獲取數(shù)據(jù)
                        obj = connectSqlAndExexute(obj, clazz, tablePath, tableAndParams, sideTablePath);
                    }
                } else {
                    System.out.println(curField.getName() + "--暫不支持的類型--" + curFieldType.getSimpleName());
                }
            } else {
                System.out.println("Ignore----");
            }
        }
        return null;
    }

    /**
     * 連接sql并獲取數(shù)據(jù)
     *
     * @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();

        // 拼接共通參數(shù)
        if (commonParameter != null) {
            // 拼接共通參數(shù)
            Field[] fields = commonParameter.getClass().getDeclaredFields();
            for (Field curField : fields) {
                // 設(shè)置字段可訪問(必須,否則報錯)
                curField.setAccessible(true);
                String name = curField.getName();
                whereBuilder.append(" and " + name + "=?");
                Object vlaue = ReflectionUtil.getVlaue(commonParameter, name, "");
                param.add(vlaue);
            }
        }
        // 如果設(shè)置了表和特殊參數(shù)則按照特殊情況處理,否則使用共通參數(shù)拼接條件
        if (tableAndParams != null) {
            //  遍歷該實體對象設(shè)置的配置信息
            // 獲取主表
            String table = tableAndParams.getTable();

            // 拼接自定義經(jīng)營范圍
            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);
                }

                // 關(guān)聯(lián)查詢
                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符號時,禁止執(zhí)行sql,防止全庫掃描
        if (StringUtils.isEmpty(whereBuilder.toString())) {
            throw new Exception("hql錯誤,因不存在and查詢條件,會導(dǎo)致全庫掃描" + selectBuilder.toString());
        }
        // TODO 執(zhí)行sql 將查詢到數(shù)據(jù)封裝到list<bean>對象中
        // List list = baseDao.findByHql(selectBuilder.toString()+whereBuilder.toString(),tableClazz,param);
        // TODO 這段代碼為無用的為獲取數(shù)據(jù)的代碼
        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();
            // 獲取該實體對象設(shè)置的自定義信息
            TableAndParamsDTO sideTableAndParams = tableAndParamsList.stream().filter(o -> o.getTable().equals(sideTableName)).findAny().orElse(null);
            // 拼接自定義經(jīng)營范圍
            Field[] sideFields = sideTableAndParams.getClass().getDeclaredFields();
            for (Field field : sideFields) {
                // 關(guān)聯(lián)查詢
                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("關(guān)聯(lián)表但為獲取到關(guān)聯(lián)條件信息" + selectBuilder.toString());
                    }
                    // 將值設(shè)置到對象中
                    field.setAccessible(true);
                    field.set(sideTableAndParams, sideParam);
                }
            }
            // 拼接hql和執(zhí)行獲取數(shù)據(jù)
            obj = connectSqlAndExexute(obj, clazz, sideTablePath, sideTableAndParams, null);
        }
        System.out.println("tableAndParams:" + tableAndParams + "commonParams:" + commonParameter + "執(zhí)行sql語句:" + selectBuilder.toString() + whereBuilder.toString() + "查詢條件:" + param + "查詢結(jié)果:" + 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;
    }
}

執(zhí)行完成之后,就可以獲取到咱們需要的數(shù)據(jù)了。

4.獲取到數(shù)據(jù)后,發(fā)送給另一端,進行解析保存

/**
     * 保存待處理數(shù)據(jù)
     *
     * @param obj
     */
    @Override
    public void saveOtherInfo(Object obj) throws Exception {
        // 首先得到pojo所定義的字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field curField : fields) {
            // 設(shè)置字段可訪問(必須,否則報錯)
            curField.setAccessible(true);

            Class<?> curFieldType = curField.getType();
            // 集合List元素
            if (curFieldType.equals(List.class)) {
                // 當(dāng)前集合的泛型類型
                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()));
            }
        }
    }

這樣兩端進行數(shù)據(jù)傳輸就完成了,或中間使用消息中間件進行傳輸也是可以的。

以上就是利用Java實體bean對象批量數(shù)據(jù)傳輸處理的詳細內(nèi)容,更多關(guān)于java bean對象數(shù)據(jù)傳輸?shù)馁Y料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Java發(fā)送HTTP請求

    詳解Java發(fā)送HTTP請求

    這篇文章主要介紹了Java發(fā)送HTTP請求,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • JAVA對list集合進行排序Collections.sort()

    JAVA對list集合進行排序Collections.sort()

    這篇文章主要介紹了JAVA對list集合進行排序Collections.sort(),需要的朋友可以參考下
    2017-01-01
  • springboot中縮短一個url鏈接的實現(xiàn)

    springboot中縮短一個url鏈接的實現(xiàn)

    縮短 URL 是現(xiàn)代應(yīng)用程序中常見的需求,通常用于減少長 URL 的長度,使其更易于分享,URL 縮短服務(wù)的核心思路是將長 URL 映射到一個唯一的短代碼,本文主要介紹了springboot中縮短一個url鏈接的實現(xiàn),感興趣的可以了解一下
    2024-09-09
  • Java中通過Class類獲取Class對象的方法詳解

    Java中通過Class類獲取Class對象的方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中通過Class類獲取Class對象的方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • lombok注解@Data使用在繼承類上時出現(xiàn)警告的問題及解決

    lombok注解@Data使用在繼承類上時出現(xiàn)警告的問題及解決

    Lombok的@Data注解簡化了實體類代碼,但在子類中使用時會出現(xiàn)警告,指出equals和hashCode方法不會考慮父類屬性,解決方法有兩種:一是在父類上使用@EqualsAndHashCode(callSuper=true)注解;二是通過配置lombok.config文件,均能有效解決警告問題
    2024-10-10
  • springboot之如何同時連接多個redis

    springboot之如何同時連接多個redis

    這篇文章主要介紹了springboot之如何同時連接多個redis問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • struts2入門(搭建環(huán)境、配置、示例)詳解

    struts2入門(搭建環(huán)境、配置、示例)詳解

    這篇文章主要介紹了struts2入門(搭建環(huán)境、配置、示例)詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • hotspot解析jdk1.8?Unsafe類park和unpark方法使用

    hotspot解析jdk1.8?Unsafe類park和unpark方法使用

    這篇文章主要為大家介紹了hotspot解析jdk1.8?Unsafe類park和unpark方法使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Spring Boot ActiveMQ如何設(shè)置訪問密碼

    Spring Boot ActiveMQ如何設(shè)置訪問密碼

    這篇文章主要介紹了Spring Boot ActiveMQ如何設(shè)置訪問密碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • JavaWeb中struts2實現(xiàn)文件上傳下載功能實例解析

    JavaWeb中struts2實現(xiàn)文件上傳下載功能實例解析

    這篇文章主要介紹了JavaWeb中struts2文件上傳下載功能的實現(xiàn),在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳和下載功能是非常常用的功能,需要的朋友可以參考下
    2016-05-05

最新評論

苍山县| 潞城市| 肥西县| 蕉岭县| 甘谷县| 西昌市| 格尔木市| 法库县| 镶黄旗| 慈利县| 谷城县| 屯留县| 巍山| 武陟县| 巩留县| 台中县| 临城县| 大竹县| 嘉义县| 西安市| 宁乡县| 江油市| 九寨沟县| 富民县| 东辽县| 申扎县| 会昌县| 苏州市| 宁南县| 车险| 广州市| 肥东县| 綦江县| 安陆市| 尖扎县| 巴彦淖尔市| 启东市| 阳朔县| 五常市| 福建省| 梅州市|