一、前言
在获取map对象或者是其他深层嵌套对象,如果你的做法是挨个取出判空然后继续再向下查找,那么可以看看本文的方案,它或许能让你打开新的思路。
作为一名java开发人员,Mybatis几乎是我们无法避开的ORM框架,如果你在开发中使用的ORM框架是Mybatis,那么深层嵌套对象的获取你可以换个写法了。本文所使用的工具是Mybatis提供
二、使用
Mybatis中提供了一个MetaObject类,该类是Mybatis实现的元对象反射工具类
,他可以通过反射将对象属性填充。
/**
* @author : 卡诺来了
* @Date 2024/8/13
*/
public class MetaObjectTools {
@Getter@Setter@Accessors(chain = true)@ToString
public static class User {
private String id;
private String name;
}
public static void main(String[] args) {
// 初始化map对象(其他深层次的嵌套对象也成,此处拿map举例)
Map<String, Object> map = new HashMap<>();
map.put("user", new User().setId("1"));
map.put("users", Arrays.asList(new User().setId("1"), new User().setId("2").setName("卡诺来了2")));
// 构建元对象
MetaObject metaObject = SystemMetaObject.forObject(map);
// 通过元对象获取数据
// ===== 普通对象=======
// 获取user的name
Object value = metaObject.getValue("user.name");
System.out.println(value); // 不存在输出:null
// 设置user的name
metaObject.setValue("user.name", "卡诺来了");
value = metaObject.getValue("user");
System.out.println(value);// MetaObjectTools.User(id=1, name=卡诺来了)
// ====== 数组类型======
// 获取users的第二个对象的name
value = metaObject.getValue("users[1].name");
System.out.println(value); // 卡诺来了2
// 更新users的第一个对象的name
metaObject.setValue("users[0].name", "卡诺来了1");
value = metaObject.getValue("users");
System.out.println(value); // [MetaObjectTools.User(id=1, name=卡诺来了1), MetaObjectTools.User(id=2, name=卡诺来了2)]
}
}