我們平時在用Myabtis時不是常常需要用map來傳遞參數,大體是如下的步驟:
public List<Role> findRoles(Map<String,Object> param);
<select id="dindRoles" parameterType="map" resultType="role">
select id,role_name as roleName,note form t_role
where role_name = #{roleName}
and note = #{note}
</select>
//我們常常需要手打這些字段名
Map<String,Object> map = new HashMap<>();
map.put("roleName","xiaoming");
map.put("note","10");
List<Role> roles = roleMapper.findRoles(map);
但如果需要put的字段很多,而且每個屬性名都很長的時候,那就很難受了,這里可以采用Java反射的方法去自動裝配map,以下是博主的實現:
public class Test {
//實現效果
public static void main(String[] args) {
HashMap<String, Object> map = new HashMap<>();
Person person1 = new Person();
person1.setAge(2);
person1.setName("foonsu");
//調用寫好的mapBuild自動裝配
mapBuild(person1, map);
//輸出效果
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
public static void mapBuild(Object javaBean, Map map) {
Class clazz = javaBean.getClass();
//反射獲取
Field[] name = clazz.getDeclaredFields();
for (Field field : name) {
//將非null的javaBean屬性值裝配到map中
if (getGetMethod(javaBean,field.getName())!=null)
map.put(field.getName(), getGetMethod(javaBean,field.getName()));
}
}
/**
* 根據屬性,獲取get方法
*/
public static Object getGetMethod(Object ob, String name) {
Method[] m = ob.getClass().getMethods();
try {
for (int i = 0; i < m.length; i++) {
if (("get" + name).toLowerCase().equals(m[i].getName().toLowerCase())) {
return m[i].invoke(ob);
}
}
} catch (Exception e) {
}
return null;
}
}
class Person{
int age;
String name;
String personId;
public String getPersonId() {
return personId;
}
public void setPersonId(String personId) {
this.personId = personId;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Ps:在這是直接采遍歷的方法,時間復雜度是O(N^2)的,因為在實際生產中一個JavaBean屬性的設計也不會非常多,其實也可以采用空間換時間的思想將方法優化到O(n)的時間復雜度。