为了便于SEO搜索到,首先把报错内容贴出来吧
不同版本的Oracle驱动会报不同的错
1
2 com.oracle
3 ojdbc6
4 1.0
5
报错如下:
Error updating database. Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='name', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111
com.oracle
ojdbc4
1.0
报错如下:
Error updating database. Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='name', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型
有异常那就一点一点的对着MyBatis调试追踪吧。避免啰嗦,就用ojdbc6调试吧;因为ojbc6与mybatis的最新版本搭配更稳定。
便于源码分析,还是先上Demo吧。
mybatis-oracle-config.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 "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 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4
5
6 insert into users7 (name,age)8 values9 (#{name},#{age})10
11
Main方法入口:
1 public static void main(String[] args) throwsException{2 SqlSessionFactoryBuilder builder=newSqlSessionFactoryBuilder();3 SqlSessionFactory sqlSessionFactory=builder.build(Resources.getResourceAsStream("mybatis-oracle-config.xml"),"dev");4 SqlSession sqlSession=sqlSessionFactory.openSession(true);5 IUserMapper userMapper=sqlSession.getMapper(IUserMapper.class);6 User user=newUser();7 //此处不设置,故意插入null数据8 //user.setName("gggg");
9 user.setAge(20);10 int count=userMapper.insertUser(user);11 System.out.println(count == 1 ? "插入成功" : "插入失败");12 sqlSession.close();13 }
运行结果就是上面的报错内容了。
我们直接从SimpleExecutor.java执行器开始分析吧,
这个地方的stmt是指向OraclePreparedStatementWrapper.java这个类的;看来这个是Oracle驱动提供的类,继承了JDBC的Statement接口
第88行代码是开始进行sql参数进行设置的方法。我们追踪进去看看是如何实现的。