Java程序员校招蚂蚁金服,java分库关联查询的工具

Posted 程序员超时空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java程序员校招蚂蚁金服,java分库关联查询的工具相关的知识,希望对你有一定的参考价值。

一对一的关系一般表示为:一方中存在一个属性,值为关联的另一方的数据对象(订单和用户是一对一的关系,则订单对象中存在一个用户属性)。

一对多的关系一般表示为:一方中存在一个属性,值为关联的另一方的数据对象列表(门店和所属订单是一对多的关系,则门店对象表存在一个订单列表(List)属性)。

可以看出java的对象机制,天然就支持非关系型的数据模型,因此大概的思路就是,将查询出来的两个列表进行符合要求的映射即可。

由于公司业务扩大,各个子系统陆续迁移和部署在不同的数据源上,这样方便扩容,但是因此引出了一些问题。

举个例子:在查询"订单"(位于订单子系统)列表时,同时需要查询出所关联的"用户"(位于账户子系统)的姓名,而这时由于数据存储在不同的数据源上,没有办法通过一条连表的sql获取到全部的数据,而是必须进行两次数据库查询,从不同的数据源分别获取数据,并且在web服务器中进行关联映射。在观察了一段时间后,发现进行关联映射的代码大部分都是模板化的,因此产生一个想法,想要把这些模板代码抽象出来,简化开发,也增强代码的可读性。同时,即使在同一个数据源上,如果能将多表联查的需求转化为单表多次查询,也能够减少代码的耦合,同时提高数据库效率。

pojo类:


public class OrderForm {

    /**

     * 主键id

     * */

    private String id;

    /**

     * 所属门店id

     * */

    private String shopID;

    /**

     * 关联的顾客id

     * */

    private String customerID;

    /**

     * 关联的顾客model

     * */

    private Customer customer;

}



public class Customer {

    /**

     * 主键id

     * */

    private String id;

    /**

     * 姓名

     * */

    private String userName;

}



public class Shop {

    /**

     * 主键id

     * */

    private String id;

    /**

     * 门店名

     * */

    private String shopName;

    /**

     * 订单列表 (一个门店关联N个订单 一对多)

     * */

    private List<OrderForm> orderFormList;

}

辅助工具函数:


/***

     * 将通过keyName获得对应的bean对象的get方法名称的字符串

     * @param keyName 属性名

     * @return  返回get方法名称的字符串

     */

    private static String makeGetMethodName(String keyName){

        //:::将第一个字母转为大写

        String newKeyName = transFirstCharUpperCase(keyName);



        return "get" + newKeyName;

    }



    /***

     * 将通过keyName获得对应的bean对象的set方法名称的字符串

     * @param keyName 属性名

     * @return  返回set方法名称的字符串

     */

    private static String makeSetMethodName(String keyName){

        //:::将第一个字母转为大写

        String newKeyName = transFirstCharUpperCase(keyName);



        return "set" + newKeyName;

    }



    /**

     * 将字符串的第一个字母转为大写

     * @param str 需要被转变的字符串

     * @return 返回转变之后的字符串

     */

    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")。

一对一连接代码实现:


/**

     * 一对一连接 :  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);

&emsp;&emsp;}



/**

     * 将批量查询出来的数据集合,组装到对应的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

### 最后

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!**有需要的程序猿(媛)可以关注+点赞,[点击这里免费获取](https://gitee.com/vip204888/java-p7)**

**程序员代码面试指南 IT名企算法与数据结构题目最优解**

这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!

![image.png](https://img-blog.csdnimg.cn/img_convert/627a86f20bbea33fd8d34d8b89aa7bcc.png)



**《TCP-IP协议组(第4版)》**

本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。

本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。

![image.png](https://img-blog.csdnimg.cn/img_convert/d826ff7c0113d974883337f3e746daac.png)


**Java开发手册(嵩山版)**

这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**

![image.png](https://img-blog.csdnimg.cn/img_convert/985ac002ac4212559d72f524b18fa06b.png)

**mysql 8从入门到精通**

本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、php操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。

![image.png](https://img-blog.csdnimg.cn/img_convert/8ea5b7943108eb6548ba45d25c63e12e.png)


**Spring5高级编程(第5版)**

本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。

本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。

![image.png](https://img-blog.csdnimg.cn/img_convert/3f28e09df49dc2b8003475f050e01881.png)


**JAVA核心知识点+1000道 互联网Java工程师面试题**

![image.png](https://img-blog.csdnimg.cn/img_convert/686a012c02716c66ccced32bd3e0323c.png)


![image.png](https://img-blog.csdnimg.cn/img_convert/867344f684fa79577a6451e4d09371e6.png)


**企业IT架构转型之道 阿里巴巴中台战略思想与架构实战**

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

**

本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。

本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。

[外链图片转存中...(img-KK12j224-1628074827224)]


**JAVA核心知识点+1000道 互联网Java工程师面试题**

[外链图片转存中...(img-56GQzRsW-1628074827225)]


[外链图片转存中...(img-QvcKB8Wg-1628074827226)]


**企业IT架构转型之道 阿里巴巴中台战略思想与架构实战**

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

![image.png](https://img-blog.csdnimg.cn/img_convert/6d83300ac2e2c9739c1b2cce3821a4a3.png)

以上是关于Java程序员校招蚂蚁金服,java分库关联查询的工具的主要内容,如果未能解决你的问题,请参考以下文章

蚂蚁金服财富技术部,诚招Java研发工程师。校招内推!!!

一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!

阿里蚂蚁金服Java程序员面试的11个问题,你会几个呢?

Java程序员春招三面蚂蚁金服,java反射获取枚举对象

Java 面试题 —— 程序员的蚂蚁金服面试经历

一个程序媛的Java面试经验总结(蚂蚁金服+美团+携程+滴滴)