天天看點

java分庫關聯查詢的工具,tomcat原理及實作讀者福利讀者福利

Map<String,Object> map = new HashMap<>();



    //:::由keyName獲得對應的get方法字元串

    String getMethodName = makeGetMethodName(keyName);



    //:::周遊beanList

    for(Object obj : beanList){

        //:::如果目前資料是hashMap類型

        if(obj.getClass() == HashMap.class){

            Map currentMap = (Map)obj;



            //:::使用keyName從map中獲得對應的key

            String result = (String)currentMap.get(keyName);



            //:::放入map中(如果key一樣,則會被覆寫去重)

            map.put(result,currentMap);

        }else{

            //:::否則預設是pojo對象

            //:::獲得get方法

            Method getMethod = obj.getClass().getMethod(getMethodName);



            //:::通過get方法從bean對象中得到資料key

            String result = (String)getMethod.invoke(obj);



            //:::放入map中(如果key一樣,則會被覆寫去重)

            map.put(result,obj);

        }

    }

    //:::傳回結果

    return map;

}
           
**一對一連接配接接口定義:**



           

/**

* 一對一連接配接 :  beanKeyName <---> dataKeyName 作為連接配接條件

  *

  * @param beanList 需要被存放資料的beanList(主體)

  * @param beanKeyName   beanList中連接配接字段key的名字

  * @param beanModelName  beanList中用來存放比對到的資料value的屬性

  * @param dataList  需要被關聯的data清單

  * @param dataKeyName 需要被關聯的data中連接配接字段key的名字

  *

  * @throws Exception

  */

 public static void oneToOneLinked(List beanList, String beanKeyName, String beanModelName, List dataList, String dataKeyName) throws Exception { }
           
如果帶入上述一對一連接配接的例子,beanList是訂單清單(List),beanKeyName是訂單用于關聯使用者的字段名稱(例如外鍵“OrderForm.customerID”),beanModelName是用于存放使用者類的字段名稱("例如OrderForm.customer"),dataList是顧客清單(List),dataKeyName是被關聯資料的key(例如主鍵"[Customer.id]( )")。



  一對一連接配接代碼實作:   



           

/**

* 一對一連接配接 :  beanKeyName <---> dataKeyName 作為連接配接條件

 *

 * @param beanList 需要被存放資料的beanList(主體)

 * @param beanKeyName   beanList中連接配接字段key的名字

 * @param beanModelName  beanList中用來存放比對到的資料value的屬性

 * @param dataList  需要被關聯的data清單

 * @param dataKeyName 需要被關聯的data中連接配接字段key的名字

 *

 * @throws Exception

 */

public static void oneToOneLinked(List beanList, String beanKeyName, String beanModelName, List dataList, String dataKeyName) throws Exception {

    //:::如果不需要轉換,直接傳回

    if(!needTrans(beanList,dataList)){

        return;

    }

    //:::将被關聯的資料清單,以需要連接配接的字段為key,轉換成map,加快查詢的速度

    Map<String,Object> dataMap = beanListToMap(dataList,dataKeyName);



    //:::進行資料比對連接配接

&emsp;&emsp; matchedDataToBeanList(beanList,beanKeyName,beanModelName,dataMap);
           

  }

/**

* 将批量查詢出來的資料集合,組裝到對應的beanList之中

 * @param beanList 需要被存放資料的beanList(主體)

 * @param beanKeyName   beanList中用來比對資料的屬性

 * @param beanModelName  beanList中用來存放比對到的資料的屬性

 * @param dataMap  data結果集以某一字段作為key對應的map

 * @throws Exception

 */

private static void matchedDataToBeanList(List beanList, String beanKeyName, String beanModelName, Map<String,Object> dataMap) throws Exception {

    //:::獲得beanList中存放對象的key的get方法名

    String beanGetMethodName = makeGetMethodName(beanKeyName);

    //:::獲得beanList中存放對象的model的set方法名

    String beanSetMethodName = makeSetMethodName(beanModelName);



    //:::周遊整個beanList

    for(Object bean : beanList){

        //:::獲得bean中key的method對象

        Method beanGetMethod = bean.getClass().getMethod(beanGetMethodName);



        //:::調用獲得目前的key

        String currentBeanKey = (String)beanGetMethod.invoke(bean);



        //:::從被關聯的資料集map中找到比對的資料

        Object matchedData = dataMap.get(currentBeanKey);



        //:::如果找到了比對的對象

        if(matchedData != null){

            //:::獲得bean中對應model的set方法

            Class clazz = matchedData.getClass();



            //:::如果比對到的資料是hashMap

            if(clazz == HashMap.class){

                //:::轉為父類map class用來調用set方法

                clazz = Map.class;

            }



            //:::獲得主體bean用于存放被關聯對象的set方法

            Method beanSetMethod = bean.getClass().getMethod(beanSetMethodName,clazz);

            //:::執行set方法,将比對到的資料放入主體資料對應的model屬性中

            beanSetMethod.invoke(bean,matchedData);

        }

    }

}
           
一對多連接配接接口定義:



![](https://img-blog.csdnimg.cn/2018112913253166.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAxOTU2,size_16,color_FFFFFF,t_70)



如果帶入上述一對多連接配接的例子,oneDataList是門店清單(List),oneKeyName是門店用于關聯訂單的字段名稱(例如主鍵“[Shop.id]( )”),oneModelName是用于存放訂單清單的字段名稱(例如"Shop.orderFomrList"),manyDataList是多方清單(List),manyKeyName是被關聯資料的key(例如外鍵"OrderFrom.shopID")。



  一對多連接配接代碼實作:   



           

/**

* 一對多連接配接 :  oneKeyName <---> manyKeyName 作為連接配接條件

 *

 * @param oneDataList       '一方' 資料清單

 * @param oneKeyName        '一方' 連接配接字段key的名字

 * @param oneModelName      '一方' 用于存放 '多方'資料的清單屬性名

 * @param manyDataList      '多方' 資料清單

 * @param manyKeyName       '多方' 連接配接字段key的名字

 *

 *  注意:  '一方' 存放 '多方'資料的屬性oneModelName類型必須為List

 *

 * @throws Exception

 */

public static void oneToManyLinked(List oneDataList,String oneKeyName,String oneModelName,List manyDataList,String manyKeyName) throws Exception {

    if(!needTrans(oneDataList,manyDataList)){

        return;

    }

    //:::将'一方'資料,以連接配接字段為key,轉成map,便于查詢

    Map<String,Object> oneDataMap = beanListToMap(oneDataList,oneKeyName);



    //:::獲得'一方'存放 '多方'資料字段的get方法名

    String oneDataModelGetMethodName = makeGetMethodName(oneModelName);

    //:::獲得'一方'存放 '多方'資料字段的set方法名

    String oneDataModelSetMethodName = makeSetMethodName(oneModelName);



    //:::獲得'多方'連接配接字段的get方法名

    String manyDataKeyGetMethodName = makeGetMethodName(manyKeyName);



    try {

        //:::周遊'多方'清單

        for (Object manyDataItem : manyDataList) {

            //:::'多方'對象連接配接key的值

            String manyDataItemKey;

            //:::判斷目前'多方'對象的類型是否是 hashMap

            if(manyDataItem.getClass() == HashMap.class){

                //:::如果是hashMap類型的,先轉為Map對象

                Map manyDataItemMap = (Map)manyDataItem;



                //:::通過參數key 直接擷取對象key連接配接字段的值

                manyDataItemKey = (String)manyDataItemMap.get(manyKeyName);

            }else{

                //:::如果是普通的pojo對象,則通過反射獲得get方法來擷取key連接配接字段的值



                //:::獲得'多方'資料中key的method對象

                Method manyDataKeyGetMethod = manyDataItem.getClass().getMethod(manyDataKeyGetMethodName);

                //:::調用'多方'資料的get方法獲得目前'多方'資料連接配接字段key的值

                manyDataItemKey = (String) manyDataKeyGetMethod.invoke(manyDataItem);

            }

            //:::通過'多方'的連接配接字段key從 '一方' map集合中查找出連接配接key相同的 '一方'資料對象

            Object matchedOneData = oneDataMap.get(manyDataItemKey);



            //:::如果比對到了資料,才進行操作

            if(matchedOneData != null){

                //:::将目前疊代的 '多方'資料 放入 '一方' 的對應的清單中

                setManyDataToOne(matchedOneData,manyDataItem,oneDataModelGetMethodName,oneDataModelSetMethodName);

            }

        }

    }catch(Exception e){

        throw new Exception(e);

    }

}
           

/**

* 将 '多方' 資料存入 '一方' 清單中

 * @param oneData 比對到的'一方'資料

 * @param manyDataItem  目前疊代的 '多方資料'

 * @param oneDataModelGetMethodName 一方清單的get方法名

 * @param oneDataModelSetMethodName 一方清單的set方法名

 * @throws Exception

 */

private static void setManyDataToOne(Object oneData,Object manyDataItem,String oneDataModelGetMethodName,String oneDataModelSetMethodName) throws Exception {

    //:::獲得 '一方' 資料中存放'多方'資料屬性的get方法

    Method oneDataModelGetMethod = oneData.getClass().getMethod(oneDataModelGetMethodName);

    //::: '一方' 資料中存放'多方'資料屬性的set方法

    Method oneDataModelSetMethod;

    try {

        //::: '一方' set方法對象

        oneDataModelSetMethod = oneData.getClass().getMethod(oneDataModelSetMethodName,List.class);

    }catch(NoSuchMethodException e){

        throw new Exception("未找到滿足條件的'一方'set方法");

    }



    //:::獲得存放'多方'資料get方法傳回值類型

    Class modelType = oneDataModelGetMethod.getReturnType();

    //::: get方法傳回值必須是List

    if(modelType.equals(List.class)){

        //:::調用get方法,獲得資料清單

        List modelList = (List)oneDataModelGetMethod.invoke(oneData);



        //:::如果目前成員變量為null

        if(modelList == null){

            //:::建立一個新的List

            List newList = new ArrayList<>();

            //:::将目前的'多方'資料存入list

            newList.add(manyDataItem);

            //:::将這個新建立出的List指派給 '一方'的對象

            oneDataModelSetMethod.invoke(oneData,newList);

        }else{
           

讀者福利

由于篇幅過長,就不展示所有面試題了,感興趣的小夥伴

CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】

java分庫關聯查詢的工具,tomcat原理及實作讀者福利讀者福利
java分庫關聯查詢的工具,tomcat原理及實作讀者福利讀者福利
java分庫關聯查詢的工具,tomcat原理及實作讀者福利讀者福利

更多筆記分享

newList.add(manyDataItem);

            //:::将這個新建立出的List指派給 '一方'的對象

            oneDataModelSetMethod.invoke(oneData,newList);

        }else{
           

讀者福利

由于篇幅過長,就不展示所有面試題了,感興趣的小夥伴

CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】

[外鍊圖檔轉存中…(img-kesatyGU-1630898289185)]

[外鍊圖檔轉存中…(img-l5cfVKbf-1630898289187)]

[外鍊圖檔轉存中…(img-q8QE2oOk-1630898289188)]

更多筆記分享

java分庫關聯查詢的工具,tomcat原理及實作讀者福利讀者福利