查询出来内容为null,resultMap相关解答

当查询结果中属性名与列名不匹配时,使用MyBatis的ResultMap可以有效地解决这个问题。ResultMap允许指定列名与实体类属性的映射,避免使用resultType导致的查询结果为null。通过在resultMap中定义id和result,映射列名到对应的属性,确保数据能正确填充到实体对象中。

查询出来内容为null,resultMap相关解答

ResultMap常用知识点
  1. resultMap元素,是mybatis映射文件中最为重要、功能最强大的元素。
  2. 使用JDBC查询,返回ResultSets,是最为常用的数据库操作。
  3. ResultMap的设计,简化了映射文件中编写复杂SQL的操作。
  4. 列名与属性名映射,一般用于列名和属性名不一致的情况。
  5. resultMap作为JDBC查询的ResultSets与映射实体之间的有效衔接,可以解决表中列的名字与实体中属性名不一致的问题。
举例说明

如果select语句的返回值是一个对象,并且实体类中的属性名和列名一致的情况,可以用resultType直接关联这个对象的全限定名;如果实体类中的属性名和列名不一致的情况,除了在sql语句中加别名之外,可以使用resultMap来指定属性名和列名,然后通过id注入到select标签里面。
如果属性名和列名不一致的情况,还用resultType去关联实体类,查询不出来内容,都为null,这时候就需要用resultType来指定了。

没有使用resultType情况

数据库中的表结构
实体类中的属性名

以上可以看出属性名和数据表中的列名不一致
映射文件
我们用resultType来关联我们将要查询出来的实体类
测试类
s没有resultMap的查询结果

以上为查询结果,虽然从数据库中查询出四条数据,但是我们并没有输出出来,就是因为属性名和列名不一致,导致数据不匹配,所以最后查询出来的内容为null

修改后的映射
我们添加了resultMap标签,并且设置id,然后让下面的select语句的resultMap属性关联上面resultMap标签里面的id就可以。
resultMap标签里面的id标签指的是你的主键,result表示除了主键以外的属性,column指得是数据库中的列名,property指实体类中的属性名。
加上resultMap之后的输出内容

<think>好的,我现在需要回答用户的问题:“为什么要先把参数转化为map?然后去Mybatis查询”。首先,我得理解用户的问题场景。用户可能在使用MyBatis进行数据库操作时,遇到了需要将参数转换为Map的情况,想知道这样做的原因。 首先,我应该回忆MyBatis的基本用法。在MyBatis中,传递参数通常有两种方式:直接传递对象或者使用Map。当使用对象时,MyBatis会根据对象的属性名来映射SQL中的参数。而使用Map的话,则是通过键值对来传递参数。 那为什么有时候需要将参数转为Map呢?可能有几个原因。首先,当传递的参数来自不同的对象或者多个来源时,将这些参数合并到一个Map中会更方便。例如,前端传来的表单数据和后端添加的一些额外参数,合并到Map后可以统一处理。 其次,动态SQL的情况。MyBatis的动态SQL功能允许根据参数的不同动态生成SQL语句。如果使用Map,可以更灵活地添加或移除参数,而不需要为每个可能的参数组合创建不同的POJO类。这对于复杂查询条件特别有用,比如用户可以选择不同的过滤条件,这些条件组合多变,使用Map可以避免创建大量的类。 另外,当参数名与数据库字段名不一致时,使用Map可以避免编写复杂的ResultMap。例如,数据库字段是user_name,而参数是username,直接在Map中设置键为user_name,值对应用户输入,简化了映射过程。 还可能考虑到接口的通用性。有时候,编写一个通用的查询方法,接受Map作为参数,可以在不同场景下复用,而不需要为每个查询都定义特定的参数对象。这在快速开发或处理多变需求时特别有用。 不过,使用Map也有一些缺点,比如类型不安全,容易因为键名拼写错误导致运行时错误,而且代码的可读性和维护性可能下降。因此,通常在参数结构明确且固定的情况下,推荐使用POJO,而在需要灵活处理动态参数时,才考虑使用Map。 总结一下,用户的问题可能涉及到MyBatis中参数传递的灵活性和动态SQL处理的需求。需要将这些点组织成结构清晰的回答,逐步解释为什么需要转换为Map,并举例说明适用场景,同时提醒潜在的缺点,以全面解答用户的疑问。</think>在MyBatis中将参数转换为Map后再进行查询,主要出于以下目的和场景需求: --- ### 一、**灵活适配动态参数** 当查询条件数量不确定或参数名称与实体类属性不完全匹配时: - **示例场景**:用户表单包含`name`、`age`、`email`等多个可选筛选条件,但后端不希望为每种组合单独创建DTO。 - **Map的优势**:通过`Map<String, Object>`动态封装键值对,无需固定结构: ```xml <!-- MyBatis动态SQL --> <select id="findUsers" parameterType="map" resultType="User"> SELECT * FROM users <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> <if test="email != null">AND email = #{email}</if> </where> </select> ``` --- ### 二、**简化多表关联查询** 当查询涉及多个表且字段名冲突时: - **示例场景**:查询`订单表(order)`和`用户表(user)`,两表均有`create_time`字段。 - **Map的解决方案**:通过别名将字段映射到Map键名避免冲突: ```sql <!-- SQL映射 --> SELECT o.id AS order_id, u.id AS user_id, o.create_time AS order_create_time, u.create_time AS user_create_time FROM order o JOIN user u ON o.user_id = u.id ``` 结果直接存入Map,键名如`order_create_time`、`user_create_time`。 --- ### 三、**兼容非标准POJO场景** 当参数来源分散或临时性强时: - **示例场景**:参数来自URL路径变量(`@PathVariable`)、请求头(`@RequestHeader`)和业务逻辑计算的混合数据。 - **Map的便捷性**:无需定义新类,直接整合数据: ```java Map<String, Object> params = new HashMap<>(); params.put("id", pathVariableId); params.put("authToken", headerToken); params.put("offset", calculatedOffset); sqlSession.selectList("findData", params); ``` --- ### 四、**直接控制SQL参数名称** 当需要精确匹配SQL占位符时: - **问题**:若直接传递对象,MyBatis默认通过属性名映射`#{property}`,但特殊情况下需自定义键名。 - **Map的精准控制**:通过键名直接对应SQL中的`#{key}`: ```xml <!-- SQL使用明确键名 --> <select id="findByStatus" parameterType="map"> SELECT * FROM tasks WHERE status = #{taskStatus} </select> ``` --- ### 五、**与动态SQL标签协同工作** MyBatis的`<foreach>`, `<choose>`等标签天然适配Map结构: - **示例:批量插入**: ```java Map<String, Object> params = new HashMap<>(); params.put("ids", Arrays.asList(1, 2, 3)); ``` ```xml <insert id="batchInsert"> INSERT INTO items (id) VALUES <foreach item="id" collection="ids" separator=","> (#{id}) </foreach> </insert> ``` --- ### 潜在缺点与注意事项 1. **类型安全缺失**:Map无法在编译期检查键名和值类型,需手动保证一致性。 2. **可维护性降低**:键名硬编码在代码和XML中,重构时易出错。 3. **推荐平衡方案**:核心业务逻辑建议使用POJO/DTO,边缘场景或快速原型开发可合理使用Map。 --- ### 总结 | 场景 | 推荐方式 | |---------------------|------------------| | 固定结构参数 | POJO/DTO | | 动态条件、临时参数 | Map | 合理选择参数传递方式,可在灵活性和代码质量间取得平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值