为了便于测试,先给出demo代码:
mybatis-oracle-config.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 /p>
3 "http://mybatis.org/dtd/mybatis-3-config.dtd">
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
user.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 /p>
3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4
5
6 insert into users
7 (name,age)
8 values
9 (#{name},#{age})
10
11
12
main()入口方法
public static void main(string[] args) throws exception{
sqlsessionfactorybuilder builder=new sqlsessionfactorybuilder();
sqlsessionfactory sqlsessionfactory=builder.build(resources.getresourceasstream("mybatis-oracle-config.xml"),"dev");
sqlsession sqlsession=sqlsessionfactory.opensession(true);
iusermapper usermapper=sqlsession.getmapper(iusermapper.class);
user user=new user();
//user.setname("a");//故意注释,不设置。模拟空值
user.setage(20);
int count=usermapper.insertuser(user);
system.out.println(count == 1 ? "插入成功" : "插入失败");
list list=usermapper.getuserlist();
for (user user1 : list) {
system.out.println(user1.tostring());
}
sqlsession.close();
}
总结一下空值报错的原因:
mybatis在build阶段,不知道这个参数的具体jdbctype类型,mybatis会给他一个默认的1111编号;
在mybatis运行阶段,空值 +111编号条件就使得mybatis去调用了oracle驱动中预编译器的setnull()方法;
因为oracle不识别1111编号,所以直接就抛出了异常。
方法1:构建时办法
在user.xml的sql中,给参数指明具体的jdbctype类型,让oracle预编译器能够知道以varchar或者numeric方式处理这种空值。
修改后的代码如下红色地方。
/p>
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
insert into users
(name,age)
values
(#{name,jdbctype=varchar},#{age})
方法2:运行时办法
编写自定义的typehandler。
当mybatis不知道具体的jdbctype类型时,在自定义typehandler中指定jdbctype。
数据库中常用的就两种字段,一个varchar字段,一个numberic字段。所以定义两个typehandler。
public class mynumbernulltypehandler extends integertypehandler {
@override
public void setparameter(preparedstatement ps, int i, integer parameter, jdbctype jdbctype) throws sqlexception {
super.setparameter(ps, i, parameter, jdbctype.numeric);
}
}
public class mystringnulltypehandler extends stringtypehandler {
@override
public void setparameter(preparedstatement ps, int i, string parameter, jdbctype jdbctype) throws sqlexception {
super.setparameter(ps,i,parameter,jdbctype.varchar);
}
}
mybatis-oracle-config.xml中的properties后面添加如下配置
综合比较后感觉方法2是一个一劳永逸的方法。
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!