mybatis对布尔类型的处理

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

  前几篇记录完了对枚举类的处理,顺便简单记录一下对布尔值的处理,因为遇到了一个小坑。

新增属性:

先看下保存相关代码:

    // 实体属性
    private Boolean localFlag;    
    
    // xml中
    <insert id="savePerson" parameterType="com.example.springbootmybatis.bean.Person">
        insert into t_person
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="pname != null and pname != ''">pname,</if>
            <if test="ptype != null">ptype,</if>
            <if test="sex != null">sex,</if>
            <if test="localFlag != null">local_flag,</if>
        </trim>
        <trim prefix="values(" suffix=")" suffixOverrides=",">
            <if test="pname != null and pname != ''">#{pname},</if>
            <if test="ptype != null">#{ptype},</if>
            <if test="sex != null">#{sex},</if>
            <if test="localFlag != null">#{localFlag},</if>
        </trim>
    </insert>

我遇到的小坑是:

  1. 多判了!='':<if test="localFlag != null and localFlag  != '' ">  这样的后果是可以正常保存true数据库中为1,但是保存false的时候数据库为空不为0
  2. 属性使用boolean:应该使用包装类Boolean,使用boolean的时候@Data注解生成的是is**方法,而不是get**方法,导致取值有问题。
  3. 另外注意一下在判断日期类型和枚举类型的时候也不要判 !='',只判null即可,否则会报错

补充一下查询:

    @GetMapping("/query")
    public ResponseEntity query(@RequestParam PersonType ptype,@RequestParam Boolean localFlag){
        List<Person> personDtos = personService.queryByType(ptype,localFlag);
        return ResponseEntity.ok().body(personDtos);
    }
    <select id="queryByType" resultType="com.example.springbootmybatis.bean.Person">
        select * from t_person
        <where>
            <if test="ptype != null">ptype = #{ptype}</if>
            <if test="localFlag != null">and local_flag = #{localFlag}</if>
        </where>
    </select>

 测试下:

布尔类型参数在数据库中会保存为0/1,查询时Boolean类型参数直接传true/false即可,顺便看一下使用swagger测试的页面:

直接就可以在页面上通过下拉选择,还是挺方便的,而且还能避免一些坑,像是之前测试Long类型失精度问题,在postman/apipost上是表现不出来的,只有在swagger上才能体现,建议用swagger进行测试。 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis并没有原生的bool类型,而是使用了基本的Java类型和MyBatis的自定义类型来代表布尔值。在MyBatis,我们可以通过以下两种方式来表示bool类型: 1.使用Java的布尔类型来表示: MyBatis支持将Java的布尔类型(Boolean)作为参数传递给SQL,也可以将SQL的查询结果映射到Java的布尔类型。在数据库布尔类型通常以整数或字符串形式存储,因此需要将它们转换成Java的布尔类型。 例如,我们可以在Mapper映射文件定义如下参数: ```xml <select id="findUserByIsValid" resultType="User"> SELECT * FROM USER WHERE IS_VALID=#{isValid} </select> ``` 可以看到,其isValid参数使用了Boolean类型,因为我们希望查询出isValid=true的用户。在代码调用Mapper时,我们需要传递一个布尔值作为参数: ```java boolean isValid = true; User user = userMapper.findUserByIsValid(isValid); ``` 2.使用自定义类型来表示: MyBatis也支持使用自定义类型来表示布尔值。这在一些特殊场景下很有用,比如当我们希望将数据库的数值类型映射成布尔类型时。 在MyBatis,自定义类型是通过实现TypeHandler接口来完成的。例如,我们可以自定义一个BoolTypeHandler类来将数据库的0和1转换成Java的布尔类型: ```java public class BoolTypeHandler implements TypeHandler<Boolean> { @Override public void setParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter ? 1 : 0); } @Override public Boolean getResult(ResultSet rs, String columnName) throws SQLException { int value = rs.getInt(columnName); return value == 1; } @Override public Boolean getResult(ResultSet rs, int columnIndex) throws SQLException { int value = rs.getInt(columnIndex); return value == 1; } @Override public Boolean getResult(CallableStatement cs, int columnIndex) throws SQLException { int value = cs.getInt(columnIndex); return value == 1; } } ``` 当我们需要将数据库的一个字段映射成布尔类型时,可以在Mapper映射文件使用自定义类型: ```xml <resultMap id="userResultMap" type="User"> <result column="IS_VALID" property="valid" typeHandler="com.example.BoolTypeHandler"/> </resultMap> ``` 通过使用自定义类型,我们可以更加灵活地处理布尔类型的数据,并且避免了在Java和数据库之间频繁转换的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值