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类型。这会导致几个问题:
- 无法区分其他整数值(如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:待支付 <


986

被折叠的 条评论
为什么被折叠?



