MyBatis条件查询,当参数的数据类型为int并且值为0时,会判断为空字符串

        MyBatis条件查询对字段判断是否为空一般为:

<if test="qry.isSplit!= '' and qry.isSplit != null">
    AND is_split = #{qry.isSplit}
</if>

        如果传入参数为int类型且值为0时,会把0转为空串。

        源码的真实情况是:

        MyBatis解析的所有sqlNode节点,针对if节点会交给IfSqlNode来处理,经过层层处理,最终都会调用OgnlOps.class类的doubleValue(Object value)方法。

public static double doubleValue(Object value) throws NumberFormatException {
    if (value == null) {
        return 0.0D;
    } else {
        Class c = value.getClass();
        if (c.getSuperclass() == Number.class) {
            return ((Number)value).doubleValue();
        } else if (c == Boolean.class) {
            return ((Boolean)value).booleanValue() ? 1.0D : 0.0D;
        } else if (c == Character.class) {
            return (double)((Character)value).charValue();
        } else {
            String s = stringValue(value, true);
            return s.length() == 0 ? 0.0D : Double.parseDouble(s);
        }
    }
}

        0和""都调用该方法返回的double值都为0.0,再进行比较。

        解决方法:

<if test="qry.isSplit!= '' and qry.isSplit != null or 0 == qry.isSplit">
    AND is_split = #{qry.isSplit}
</if>

        或者

<if test="qry.isSplit != null">
    AND is_split = #{qry.isSplit}
</if>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis查询结果字符串类型的数据自动转换为日期类型。如果查询结果中包含日期类型的数据,需要在 SQL 映射文件中通过类型转换器(TypeHandler)将其转换为 Java 中的日期类型。 MyBatis 提供了许多默认的 TypeHandler,包括将字符串类型转换为日期类型的 TypeHandler。如果默认的 TypeHandler 不能满足需求,也可以自定义 TypeHandler。例如,以下是将字符串类型转换为 Date 类型的自定义 TypeHandler 的示例: ``` public class DateTypeHandler extends BaseTypeHandler<Date> { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); @Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, sdf.format(parameter)); } @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { String str = rs.getString(columnName); if (rs.wasNull()) { return null; } else { return sdf.parse(str); } } @Override public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String str = rs.getString(columnIndex); if (rs.wasNull()) { return null; } else { return sdf.parse(str); } } @Override public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String str = cs.getString(columnIndex); if (cs.wasNull()) { return null; } else { return sdf.parse(str); } } } ``` 在 SQL 映射文件中使用该 TypeHandler: ``` <resultMap id="userResultMap" type="User"> <result column="birth_date" property="birthDate" jdbcType="VARCHAR" typeHandler="com.example.DateTypeHandler"/> </resultMap> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值