mybatis 使用 parameterType="Map" 传入值后 数据库中得到的却是 NULL

mybatis 映射文件:
	<select id="queryFuzzyMessagesByUser" parameterType="Map" resultType="MessageDto">
		select
		<include refid="messageInfo" /> , <include refid="uInfo" />
		from tb_message m , tb_user u
		<where>
			m.user_id = u.id  and  m.f_type = 0
			<if test="messageId != null and  messageId != ''">
				and m.id = #{messageId,jdbcType=NUMERIC}
			</if>
			<if test="title != null and  title != ''">
				and m.title like '%${title}%'
			</if>
			<if test="userId != null and  userId != ''">
				and u.id = #{userId,jdbcType=NUMERIC}
			</if>
			<if test="sDateMin != null">
				and m.s_date >= #{sDateMin, jdbcType=DATE}
			</if>
			<if test="sDateMax != null">
				and m.s_date <= #{sDateMax, jdbcType=DATE}
			</if>
			<if test="sTimeMin != null">
				and m.s_time >= #{sTimeMin, jdbcType=TIME}
			</if>
			<if test="sTimeMax != null">
				and m.s_time <= #{sTimeMax, jdbcType=TIME}
			</if>
		</where>
	</select>

service 层代码:
		Map<String,Object> param = new HashMap<String,Object>();
		
		Calendar c = Calendar.getInstance();
		c.set(2013, 1, 18, 1, 30);
		param.put("sDateMin", new Date(c.getTimeInMillis()));
		Time a = new Time(c.getTimeInMillis());
		param.put("sTimeMin", a.toString());
		c.set(2015, 8, 18, 14, 50);
		param.put("sDateMax", new Date(c.getTimeInMillis()));
		a =  new Time(c.getTimeInMillis());
		param.put("sTimeMax",a.toString());
		
		List<MessageDto> ms = _mService.queryFuzzyMessagesByUser(param);
		for(MessageDto m : ms){
			System.out.println(m.getId());
		}

今天不知道为什么,总是不在状态!尤其是出现了这种狗屎问题,今天贴出来,以免以后踩到狗屎......................

在 java service 层:使用HashMap传值,结果传入了NULL到数据库,映射名称完全没有问题,后来发现了:原来是我在映射文件那里多了空格!面壁........

<if test="sDateMin != null">
				and m.s_date >= #{sDateMin , jdbcType=DATE}
			</if>




### MyBatis 中 `<=` 运算符失效解决方案 当遇到 MyBatis 的 `<=` 运算符失效的情况时,通常是因为 SQL 语句构建过程中出现了语法错误或者是参数传递不正确。为了确保查询能够正常工作并返回预期的结果集,可以采取以下几种方法: #### 方法一:检查SQL语句中的数据类型匹配 确保比较操作的数据类型一致非常重要。如果字段是数型而传入的是字符串,则可能导致判断逻辑失败。应确认映射文件中定义的属性与数据库表结构相吻合。 ```xml <select id="findItemsByPriceLessThanOrEqual" parameterType="map" resultType="Item"> SELECT * FROM items WHERE price <= #{maxPrice,jdbcType=DECIMAL} </select> ``` 上述代码片段展示了如何通过指定 JDBC 类型来保证输入参数被正确解析为所需格式[^1]。 #### 方法二:使用动态SQL标签处理边界情况 对于某些特殊场景下的范围查询(如最大最小),建议采用 `<if>` 或者其他条件控制标签来进行更灵活的操作,从而避免因为空或其他意外状况引起的问题。 ```xml <where> <if test="maxPrice != null and maxPrice >= minPrice "> AND price <= #{maxPrice} </if> </where> ``` 注意这里使用了 HTML 实体编码形式表示小于等于符号(<=),这是因为在 XML 文件内直接写入 "<=" 可能会被误解成标记的一部分[^2]。 #### 方法三:验证Mapper接口配置无误 确保 Mapper 接口的方法签名与其对应的XML 映射文件内的命名空间和 ID 完全对应,并且项目已经成功加载了所有的 Mapper 资源。可以通过在 Spring Boot 启动类上添加 `@MapperScan` 注解的方式实现自动扫描功能[^3]。 ```java @SpringBootApplication @MapperScan("com.example.mappers") public class Application { } ``` 以上措施有助于排查并修复 MyBatis 使用 `<=` 符号可能出现的各种问题。当然,在实际开发环境中还需要结合日志输出、调试工具等多种手段进一步定位具体原因。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值