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);
测试方法:
@Testpublic 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
回答:
实体类当中定义属性,开始用的 int 类型。后来考虑到 int 不能为 null 改成了 Integer
但是,在 set() get() 中,因为程序没用到,所以就没改。。。。。
没用到,可以不写,能够运行通过,但只要写,就必须要写正确。否则就无法运行通过。
另,在实际项目中应尽量使用Integer ,避免使用int
毕竟,本就是面向对象编程。
以上是 mybatis对象传参,属性为 Integer且值为 null ,与Map 传参或String类型是有什么区别 ? 的全部内容, 来源链接: utcz.com/p/944825.html