把javaBean变为map

本文档详细介绍了如何使用Lombok的Slf4j注解,通过BeanUtil类实现Java Bean对象属性到Map的转换,展示了关键的代码片段和异常处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说,直接上代码



import lombok.extern.slf4j.Slf4j;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class BeanUtil {
    /**
     * 把JavaBean转化为map
     */
    public static Map<String, Object> bean2map(Object bean) {
        Map<String, Object> map = new HashMap<>();
        BeanInfo b;
        try {
            //获取JavaBean的描述器
            b = Introspector.getBeanInfo(bean.getClass(), Object.class);
            //获取属性描述器
            PropertyDescriptor[] pds = b.getPropertyDescriptors();
            //对属性迭代
            for (PropertyDescriptor pd : pds) {
                //属性名称
                String propertyName = pd.getName();
                //属性值,用getter方法获取
                Method m = pd.getReadMethod();
                Object properValue = m.invoke(bean);//用对象执行getter方法获得属性值

                //把属性名-属性值 存到Map中
                map.put(propertyName, properValue);
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }

        return map;
    }


}

<think>嗯,用户想了解MyBatis中ResultMapmap属性用法或含义。首先,我得回忆一下ResultMap的相关知识。根据之前看的引用资料,比如引用[1]提到解析resultMap标签里的配置元素,像id、type这些,然后封装成ResultMap。而引用[3]的例子中,type属性指定了映射的目标类,比如Dept。 那么问题来了,用户问的是map属性,但通常在ResultMap标签里用的是type属性,例如type="Dept"。可能在MyBatis中,当需要返回一个Map结构而不是JavaBean时,会用到map类型。比如,引用[4]中的mapper接口返回的是List<Map<String,Object>>,这时候可能需要在ResultMap中指定type为map,或者使用resultType="map"? 不过用户提到的是ResultMapmap属性,可能这里有些混淆。ResultMap本身没有map属性,但可能有使用map作为type的情况。比如当type设置为java.util.Map时,这样ResultMap会把查询结果映射到一个Map对象中,键是列名,属性是值。这时候每个结果行都会变成一个Map,而整个查询结果可能返回List<Map>。 需要确认的是,用户是否指的是在ResultMap标签中使用type="map",或者是在其他地方使用map属性。例如,在引用[3]的示例中,type="Dept"指定了目标类,而如果是map的话,可能type="java.util.Map",或者直接使用别名map。MyBatis内置了一些别名,比如map对应的是java.util.Map。 另外,引用[4]中的例子展示了mapper接口返回List<Map<String,Object>>,这时候可能不需要定义ResultMap,而是直接使用resultType="map",因为MyBatis会自动将结果映射到Map。但如果有更复杂的结构,比如嵌套的map,可能需要使用ResultMap来定义。 总结一下,可能的两种情况:1. 在ResultMap中指定type为map,用于将结果映射到Map对象;2. 在查询语句中使用resultType="map"或resultMap引用一个定义为map类型的ResultMap。需要解释这两种情况的区别和使用场景,以及如何定义这样的ResultMap。 另外要注意,当使用Map时,列名会作为键,而值就是对应的数据。如果有复杂的关联查询,可能需要使用<association>或<collection>来处理,但如果是简单的单表查询,直接使用resultType="map"会更方便。 可能还需要提到,使用Map的缺点,比如可读性差,难以维护,而使用JavaBean更推荐。但在某些场景下,比如动态字段或者不需要定义实体类时,Map会更灵活。 最后,根据引用[2]中的问题,如果ResultMap映射出问题,可能是因为未正确使用type或者属性名不匹配,所以在使用map时也要注意列名和键的一致性。</think>### MyBatis中ResultMapmap属性使用说明 #### 1. **基本定义与功能** 在MyBatis中,`ResultMap`的`type`属性可设置为`map`(即`java.util.Map`的别名),用于将查询结果映射到键值对集合中。 - **核心作用**:将数据库字段直接映射为`Map`的键值对,适用于**动态字段**或**无需实体类**的场景[^3][^4]。 - **示例**: ```xml <resultMap id="simpleMap" type="map"> <id column="id" property="id"/> <result column="name" property="dname"/> </resultMap> ``` #### 2. **使用场景** - **动态字段**:当SQL查询结果字段不固定时,`Map`可自动适配列名与键名。 - **临时数据**:无需定义实体类,快速获取结果(例如统计报表)。 - **关联查询简化**:若结果结构简单,直接映射为`Map`可减少配置。 #### 3. **具体用法** ##### (1) 声明ResultMap 通过`type="map"`显式指定映射目标为`Map`: ```xml <resultMap id="productMap" type="map"> <result column="product_name" property="name"/> <result column="price" property="value"/> </resultMap> ``` - `column`:数据库字段名 - `property`:`Map`中的键名[^1][^3] ##### (2) 在查询中引用 ```xml <select id="fetchProducts" resultMap="productMap"> SELECT product_name, price FROM products </select> ``` 或直接使用`resultType="map"`(无需定义`ResultMap`): ```xml <select id="fetchTypesOfProductMap" resultType="map"> SELECT category, COUNT(*) AS total FROM products GROUP BY category </select> ``` ##### (3) 接口定义 Mapper接口返回类型为`List<Map<String, Object>>`: ```java List<Map<String, Object>> fetchTypesOfProductMap(); ``` - 每个`Map`对应一行数据,键为`property`定义的名称,值为字段值[^4]。 #### 4. **注意事项** - **键名一致性**:需确保`column`与`property`匹配,否则数据无法映射[^2]。 - **类型限制**:`Map`的值为`Object`,需手动处理类型换(如日期、数值)。 - **维护性**:长期项目建议优先使用实体类,提高代码可读性。 #### 5. **对比`resultType="map"`与`resultMap`** | 特性 | `resultType="map"` | 自定义`ResultMap`(type="map") | |---------------------|-------------------------------|--------------------------------| | 配置复杂度 | 无需配置,自动映射列名到键名 | 需显式定义字段映射关系 | | 灵活性 | 仅支持简单映射 | 支持复杂逻辑(如关联查询) | | 适用场景 | 单表查询或字段名与键名一致 | 需要重命名键名或处理嵌套结构 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值