mybatis使用问题记录
1. 与spring整合 启动报错, 一直读取不到properties中设置的属性
<bean id="scanner" class="org.mybatis.spring.MapperScannerConfigurer"> <property name="annotationClass" value="org.springframework.stereotype.Repository"></property> <property name="basePackage" value="com.xxx.*.mapper"></property> <property name="sqlSessionFactory" value="sqlSessionFactory"></property> </bean>
原因:mybatis配置中使用了MapperScannerConfigurer进行自动扫描,会使spring的propertyPlaceholderConfigurer失效,
因为MapperScannerConfigurer在解析加载bean定义阶段设置了sqlSessionFactory的话会提前初始化一此类,
此时propertyPlaceholderConfigurer还没来得及替换定义的变量。
解决: 使用sqlSessionFactoryBeanName 代替sqlSessionFactory
<bean id="scanner" class="org.mybatis.spring.MapperScannerConfigurer"> <property name="annotationClass" value="org.springframework.stereotype.Repository"></property> <property name="basePackage" value="com.xxx.*.mapper"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean>
2.项目中之前是用的sqlserver数据库,需要连到oracle上 直接切换运行会报错(只有在插入数据,更新数据时报错)
java.sql.SQLException: 无效的列类型
OraclePreparedStatement.setNull()
原因:实体mapper.xml 配置文件 在插入,更新的sql上都没有写加对应数据类型
如 values(#{username,jdbcType=VARCHAR}) 所以插入null数据会报错 没有自动转换成对应类型。
加上jdbcType = 类型之后正确,但是工作量太大,每个mapper.xml都需要改动
查找mybatis配置说明发现settings下属性: jdbcTypeForNull 此属性默认设置是OTHER,在oracle数据库驱动使用时处理null会有问题,需要指定此属性为null
设置参数 | 描述 | 有效值 | 默认值 |
jdbcTypeForNull | Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER. | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
设置<settings>
<setting name="jdbcTypeForNull" value="NULL"></setting>
</settings>
运行正常
3. 待续 遇到后补上