mybatis mysql insert 空值_Mybatis+Oracle搭配insert空值报错之myBatis+mysql驱动+oracle驱动的源码分析...

为了便于测试,先给出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是一个一劳永逸的方法。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值