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;

【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

}

public class Customer {

/**

  • 主键id

  • */

private String id;

/**

  • 姓名

  • */

private String userName;

}

public class Shop {

/**

  • 主键id

  • */

private String id;

/**

  • 门店名

  • */

private String shopName;

/**

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

  • */

private List 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);

//:::进行数据匹配连接

   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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值