java分库关联查询的工具(1),狂神说docker笔记百度云

 */

private static String transFirstCharUpperCase(String str){

    return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());

}



/**

 * 判断当前的数据是否需要被转换

 *

 * 两个列表存在一个为空,则不需要转换

 * @return 不需要转换返回 false,需要返回 true

 * */

private static boolean needTrans(List beanList,List dataList){

    if(listIsEmpty(beanList) || listIsEmpty(dataList)){

        return false;

    }else{

        return true;

    }

}



/**

 * 列表是否为空

 * */

private static boolean listIsEmpty(List list){

    if(list == null || list.isEmpty()){

        return true;

    }else{

        return false;

    }

}

/**

 * 将javaBean组成的list去重 转为map, key为bean中指定的一个属性

 *

 * @param beanList list 本身

 * @param keyName 生成的map中的key

 * @return

 * @throws Exception

 */

public static Map<String,Object> beanListToMap(List beanList,String keyName) throws Exception{

    //:::创建一个map

    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](https://gitee.com/vip204888/java-p7)")。



  一对一连接代码实现:   



/**

 * 一对一连接 :  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](https://gitee.com/vip204888/java-p7)”),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);

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

更多JVM面试整理:

return;

    }

    //:::将'一方'数据,以连接字段为key,转成map,便于查询

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

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

[外链图片转存中…(img-sKGDbTYD-1628342041095)]

更多JVM面试整理:

[外链图片转存中…(img-o767NT4T-1628342041099)]

点击这里免费下载“百万级”「JVM笔记」


版权声明:本文为m0_60607171原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。