国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

利用Java實體bean對象批量數據傳輸處理方案小結

瀏覽:23日期:2022-08-12 13:00:06

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

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

需求

現在有兩方數據庫表結構相同,一方A、另一個方B,現想從A處查詢出多個表的數據,傳輸到B地保存起來。

解決方案1

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

方案2

新建一個需要準備哪些數據的實體類對象

待查詢的貓

@Data@AllArgsConstructor@NoArgsConstructorpublic class Cat { private String id; private String food; private String weight; private String height;}

待查詢的狗

@Data@AllArgsConstructorpublic class Dog { private String id; private String food; private String weight; private String height;}

待查詢的豬

@Data@AllArgsConstructorpublic class Pig { private String id; private String food; private String weight; private String height; private String pid;}

自定義傳輸實體對象,這里定義了需要查詢那些集合對象

@Data@AllArgsConstructor@NoArgsConstructorpublic 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@NoArgsConstructorpublic class CommonParameterDTO { /** * =============================================================== * 這里配置所有集合查詢的公共查詢條件 * =============================================================== */ /** * 主鍵信息 */ public String id;}

自定義查詢參數

/** * 自定義查詢條件及關聯表信息查詢實體對象 * @author Administrator */@Data@AllArgsConstructor@NoArgsConstructorpublic 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())); }} }

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

以上就是利用Java實體bean對象批量數據傳輸處理的詳細內容,更多關于java bean對象數據傳輸的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 亚洲国产精品久久久久秋霞不卡 | 很黄的网站在线观看 | 国产一级爱做片免费观看 | 超清国产粉嫩456在线免播放 | 一本三道a无线码一区v小说 | 国产偷自拍 | 欧美三级欧美成人高清www | 男人桶女人逼 | 国内主播福利视频在线观看 | 精品高清国产a毛片 | 性配久久久 | 一本久久a久久精品亚洲 | 2019天天操天天干天天透 | 免费在线黄色网址 | 国产精品二区三区免费播放心 | 窝窝午夜精品一区二区 | 久久99中文字幕 | 日韩欧美一二区 | 国产无毛| 亚洲欧美精品中文字幕 | 欧美成人性色区 | 最近免费手机中文字幕3 | 国产视频一二三 | 亚洲欧美一区二区三区国产精品 | 337p粉嫩大胆噜噜噜鲁 | 一级亚洲| 九九精品视频在线播放 | 67194午夜| 日本加勒比一区 | 在线观看免费为成年视频 | 一区二区三区亚洲视频 | 国内精品久久久久不卡 | 加勒比色综合久久久久久久久 | 日韩毛片一级 | 国产又色又爽黄的网站免费 | 免费小视频在线观看 | 国产玖玖玖精品视频 | 欧美操操操操 | 日韩一中文字幕 | 理论片我不卡在线观看 | 欧洲精品一区二区三区在线观看 |