大专目前学的大数据技术,学过java,数据库,网页设计等,现在在学习ui,数据可视化,软件测试,数据库设计与应用开发,分布式数据库。
计算机吧下定学那一门就不能变,我也不知道学后端还是前端。主要java我只学了基础,框架算法都没学过也不知道吃不吃力,现在又重新复习java的知识。想听听大家的意见
就业和学习最大的差别是,学习要求每一门都及格,而就业要求精通一门
比方说我们的数据库中 user 表有以下几条数据:
id | uid | name |
---|---|---|
1 | user_003 | 法半夏 |
2 | user_001 | 蜜远志 |
3 | user_002 | 麦冬 |
4 | user_004 | 茵陈 |
我们需要 通过前端传来的参数 uid 列表 查询 其中的数据,然后返回给前端,但是前端传来的 uid 列表是 [“user_001”, “user_002”, “user_003” ,“user_004”] ,这时候,我们通过
SELECT uid,`name` from user where uid
IN('user_001','user_002','user_003','user_004');
查询出来的结果是这样的:
id | uid | name |
---|---|---|
1 | user_003 | 法半夏 |
2 | user_001 | 蜜远志 |
3 | user_002 | 麦冬 |
4 | user_004 | 茵陈 |
[
{"name":"法半夏","uid":"user_003"},
{"name":"蜜远志","uid":"user_001"},
{"name":"麦冬","uid":"user_002"},
{"name":"茵陈","uid":"user_004"}
]
可以看到传入的参数列表和返回的列表 uid 并不是对应的。
[
{"name":"蜜远志","uid":"user_001"},
{"name":"麦冬","uid":"user_002"},
{"name":"法半夏","uid":"user_003"},
{"name":"茵陈","uid":"user_004"}
]
为了解决这个问题,有多种方法,比方说在mybatis 中 先 使用 foreach 入参列表 再left join user 表, 但 这样的缺点是当参数列表较长的时候sql 语句可能很长,sql 语句解析可能会比较慢,占用网络带宽可能较大,总而言之就是可能存在 bug;
不想打字了,直接上代码
排序工具类:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.util.*;
/**
* @author: XiaTian
* @create-time 18:22 2021/11/14
*/
public class OrderUtil {
private static Logger logger = LoggerFactory.getLogger(OrderUtil.class);
/**
* 排序操作
* @param originList 数据库中查询出来的的列表,需要排序操作
* @param orderList 前端传来的参数列表
* @param orderField 需要排序的字段, 如: uid
* @param <T> 泛型
* @return
*/
public static <T> List<T> order(List<T> originList,
List<String> orderList,
final String orderField){
if (CollectionUtils.isEmpty(originList)){
logger.info("入参集合为空");
return originList;
}
Map<String,T> tempMap = new HashMap<>();
Field declaredField;
List<T> rtnList = new ArrayList<>();
try {
declaredField = originList.get(0).getClass().getDeclaredField(orderField);
declaredField.setAccessible(true);
for (T ele : originList){
String value = declaredField.get(ele).toString();
tempMap.put(value,ele);
}
for (String code : orderList){
rtnList.add(tempMap.get(code));
}
} catch (NoSuchFieldException e) {
logger.warn("没用指定字段[{}]",orderField);
} catch (IllegalAccessException e) {
logger.warn("访问字段非法,请检查字段[{}]权限",orderField);
}
return rtnList;
}
public static void main(String[] args) {
List<String> orderList = Arrays.asList("user_001","user_002","user_003","user_004");
List<User> userList = new ArrayList<>();
userList.add(new User(1,"user_003","法半夏"));
userList.add(new User(2,"user_001","蜜远志"));
userList.add(new User(3,"user_002","麦冬"));
userList.add(new User(4,"user_004","茵陈"));
List<User> orderedUsers = OrderUtil.order(userList, orderList, "uid");
System.out.println(orderedUsers);
}
}
user 类
package com.xhw.product.outman.util;
import lombok.Data;
/**
* @author: XiaTian
* @create-time 18:37 2021/11/14
*/
@Data
public class User {
private int id;
private String uid;
private String name;
public User(int id, String uid, String name) {
this.id = id;
this.uid = uid;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", uid='" + uid + '\'' +
", name='" + name + '\'' +
'}';
}
}