Mybatis实体类(POJO)一定要用包装类吗?为什么换回去基本类型还能插入成功?

最近学Mybatis时候遇到一个神奇的问题。

POJO

@Alias("role")
public class Role implements Serializable {
    private long id;
    private String roleName;
    private String note;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getNote() {
        return note;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", roleName='" + roleName + '\'' +
                ", note='" + note + '\'' +
                '}';
    }

    public void setNote(String note) {
        this.note = note;
    }
}

接口

public interface RoleMapper {

    public int insertRole(Role role);
    
}

XML

<mapper namespace="deejing.Chapter3.mapper.RoleMapper">
    <insert id="insertRole" parameterType="role">
        <selectKey keyProperty="id" resultType="long" order="BEFORE">
            SELECT if (max(id)=null,1,max(id)+3) FROM t_role
        </selectKey>
        insert into t_role(id,role_name,note) values (#{id},#{roleName},#{note})
    </insert>
</mapper>

测试函数

    @Test
    public void testDemo02(){
        SqlSession session = SqlSessionUtil.getSession();
        RoleMapper mapper = session.getMapper(RoleMapper.class);
        Role role = new Role();
        role.setRoleName("陈奕迅");
        role.setNote("歌手");
        mapper.insertRole(role);
        session.commit();
        session.close();
    }

运行后发现插入失败

报如下错误:

Could not set property 'id' of 'class deejing.Chapter3.domain.Role' with value 'null' Cause: java.la
查看错误信息发现是实体类的id属性没有用包装类,导致没有插入数据。

把实体类的id属性类型换成包装类Long,重新生成getter和setter。

public class Role implements Serializable {
    private Long id;
    private String roleName;
    private String note;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }
}

就成功插入了数据了。。。。

最神奇的是:我把实体类的id类型重新换回去long类型。它还是能正常插入数据,不会报之前的错误。

@Alias("role")
public class Role implements Serializable {
    private long id;
    private String roleName;
    private String note;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getNote() {
        return note;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", roleName='" + roleName + '\'' +
                ", note='" + note + '\'' +
                '}';
    }

    public void setNote(String note) {
        this.note = note;
    }
}

这到底是为什么???只要把数据库插入的数据删除后,又会报同样的错误。这到底是为什么???
找了很久都找不到答案,本人小白,请各位大佬告诉一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值