mybatis对象传参,属性为 Integer且值为 null ,与Map 传参或String类型是有什么区别 ?

简单说:
对象传参, 通过<when>或者<if>标签判断某属性为 null 且为 Integer,就会抛出"java.lang.Integer.intValue()" because "XXX" is null的异常。而 String 类型或者 使用 Map 传参就没有问题,如果Integer类型不为Null 也能正常运行,是哪里的问题?望诸位大佬不吝赐教,拜谢。。。

代码如下,实体类:

public class user {
    private String name;
    private Integer age;
    ...get,set,有参构造,无参构造...
}

sql mapper文件:

<select id="selectByConditionSingle" resultType="user">
    select * from tb_student where
    <choose>
        <when test="age != null">
            age = #{age}
        </when>
        <when test="name != null and name != ''">
            name like #{name}
        </when>
    </choose>
</select>

java mapper 接口:

List<user> selectByConditionSingle(user user);

测试方法:

@Test
public void selectByConditionSingleTest() throws IOException {
    String name= "%"+"zhangsan"+"%";
    Integer age=18;
    user user = new user();
    user.setName(name);
    // 这里不设置 age 属性,或者设置为 NUll 就会抛出下面异常。
    //user.setAge(age);
    InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    studentMapper mapper = sqlSession.getMapper(studentMapper.class);
    List<user> users = mapper.selectByConditionSingle(user);
    for (user item:users) {
        System.out.println(item);
    }
    sqlSession.close();
}

异常信息:

### Error querying database.  Cause: java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.age" is null
阅读 2.3k
1 个回答

实体类当中定义属性,开始用的 int 类型。后来考虑到 int 不能为 null 改成了 Integer

但是,在 set() get() 中,因为程序没用到,所以就没改。。。。。

没用到,可以不写,能够运行通过,但只要写,就必须要写正确。否则就无法运行通过。

另,在实际项目中应尽量使用Integer ,避免使用int

毕竟,本就是面向对象编程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题