MyBatis中tinyint(1)与Boolean映射陷阱及Integer=0判空失效的深度解析

1. 为什么tinyint(1)会变成boolean?

这个问题困扰过不少刚接触MyBatis的开发者。我清楚地记得第一次遇到这个坑时的场景:数据库明明存储的是0和1,但程序里拿到的却是false和true。后来查阅资料才发现,这是MySQL JDBC驱动的默认行为。

MySQL官方文档明确指出,当tinyint类型长度为1时,JDBC驱动会默认将其映射为Java的Boolean类型。这种设计原本是为了兼容MySQL的布尔语义(MySQL没有真正的布尔类型,通常用tinyint(1)模拟),但在实际业务中却经常带来困扰。

举个例子,假设我们有个用户表:

CREATE TABLE user (
    id INT PRIMARY KEY,
    is_vip TINYINT(1) COMMENT '0否1是'
);

当MyBatis查询这个表时,is_vip字段会被自动转为Boolean类型。这会导致几个问题:

  1. 无法区分其他整数值(如2、3等)
  2. 业务代码中需要额外处理类型转换
  3. 前端期望收到数字却收到布尔值

2. Integer=0被误判为空字符串的坑

另一个更隐蔽的问题是MyBatis对Integer类型0值的处理。在动态SQL中,我们经常这样写条件判断:

<if test="status != null and status != ''">
    AND status = #{status}
</if>

当status=0时,这个条件会被跳过!因为MyBatis会将Integer类型的0等同于空字符串。这个行为在官方文档中并没有明确说明,但通过查看源码可以发现,MyBatis的OGNL表达式处理确实存在这种隐式转换。

这个问题在状态字段上尤为致命。比如电商系统中的订单状态:

  • 0:待支付
  • <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值