使用mybatis时遇到Error setting null parameter异常,常用的解决方式是在sql中指定jdbcType,这样的写法感觉有点罗嗦,后来参考spring jdbc中的实现方式,改写了mybatis中的BaseTypeHandler类,经测试ok。
以下是修改的类文件,修改的地方为19 ~ 36行。
package org.apache.ibatis.type;
import java.sql.CallableStatement;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
public abstract class BaseTypeHandler implements TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
if (jdbcType == null) {
try {
boolean useSetObject = false;
int sqlType = Types.NULL;
try {
DatabaseMetaData dbmd = ps.getConnection().getMetaData();
String databaseProductName = dbmd.getDatabaseProductName();
String jdbcDriverName = dbmd.getDriverName();
if (databaseProductName.startsWith("Informix")
|| jdbcDriverName.startsWith("Microsoft SQL Server")) {
useSetObject = true;
} else if (databaseProductName.startsWith("Oracle") || databaseProductName.startsWith("DB2") || jdbcDriverName.startsWith("jConnect")
|| jdbcDriverName.startsWith("SQLServer") || jdbcDriverName.startsWith("Apache Derby")) {
sqlType = Types.VARCHAR;
}
} catch (Throwable ex) {
throw new TypeException("Could not check database or driver name", ex);
}
if (useSetObject) {
ps.setObject(i, null);
} else {
ps.setNull(i, sqlType);
}
} catch (SQLException e) {
throw new TypeException(
"Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: "
+ e, e);
}
} else {
ps.setNull(i, jdbcType.TYPE_CODE);
}
} else {
setNonNullParameter(ps, i, parameter, jdbcType);
}
}
public Object getResult(ResultSet rs, String columnName) throws SQLException {
Object result = getNullableResult(rs, columnName);
if (rs.wasNull()) {
return null;
} else {
return result;
}
}
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
Object result = getNullableResult(cs, columnIndex);
if (cs.wasNull()) {
return null;
} else {
return result;
}
}
public abstract void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
throws SQLException;
public abstract Object getNullableResult(ResultSet rs, String columnName) throws SQLException;
public abstract Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException;
}
分享到:
相关推荐
"解决mybatis使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...
Mybatis 中 Oracle 的拼接模糊查询及用法详解 Mybatis 是一个基于 Java 的持久层框架,提供了强大的数据库交互能力,而 Oracle 则是业界最流行的关系数据库管理系统。本文将详细介绍 Mybatis 中 Oracle 的拼接模糊...
在MyBatis框架中,当处理SQL语句时,遇到参数为null的情况,可能会出现一些问题,这主要是由于MyBatis将null值默认映射到JDBC类型的`OTHER`,而并非所有数据库都能正确处理这种类型。这可能导致插入或更新操作失败,...
在本文中,我们将讨论如何解决MyBatis中使用Oracle关键字出错的问题。 问题描述 在MyBatis中,如果使用的字段是Oracle的关键字,可能会出现错误。例如,如果我们的表名或列名是Oracle的关键字,例如"DATE"、"USER...
在Oracle数据库中,BLOB(Binary Large Object)字段是用来存储大量二进制数据的类型,如图片、视频或任何非文本文件。与之相对的是CLOB(Character Large Object),用于存储大量的文本数据。在Java应用中,特别是...
在 Oracle 数据库中,CLOB 类型对应的数据库类型是 CLOB,在 MySQL 中对应的类型是 TEXT 或 LONGTEXT。 BLOB 类型用于存储二进制数据,可以存储图片、音乐、视频等文件。在 Oracle 数据库中,BLOB 类型对应的数据库...
Oracle数据库中的表分区是一种高级组织技术,它通过将表的大数据集划分为较小的、更易于管理的部分(即分区),从而提高查询性能和可管理性。表分区可以按照不同的策略进行划分,如范围分区、列表分区等。 #### 二...
下面将详细介绍这两种数据类型以及如何在Oracle中使用它们存储和读取图片。 1. **CLOB数据类型**: `CLOB`数据类型用于存储大量的字符数据,最大可达到4GB。虽然主要用于存储文本,但在本例中,由于图片可以被转换...
如果实体Bean中存在某个属性没有Getter方法,在运行过程中,MyBatis会将其视为一个复杂对象。这会导致MyBatis在填充SQL执行后的结果时遇到性能问题。尤其是在属性数量较多的情况下,性能下降尤为明显。例如,在有10...
springboot mybatis多数据源加事务嵌套 事务之间的调用 回滚 亲测可用 定义2个库分别建立 CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `user_name` varchar(25) ...
sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名非常重要,你在 具体的类的映射中,比如User...
在上面的示例中,如果传递了title参数,那么将生成一个包含title的where子句。如果没有传递title参数,那么将生成一个不包含title的where子句。 批量插入的应用 ------------- MyBatis还提供了批量插入的功能,...
本项目以"Mybatis+SpringMVC"为技术栈,实现了Oracle数据库中的emp表的增删改操作,并结合分页功能,提供了良好的用户体验。 首先,Mybatis是一个优秀的持久层框架,它简化了Java开发中的SQL操作,将SQL语句与Java...
Spring MyBatis Oracle性能问题 概述 通过Spring MyBatis事务或通过MyBatis使用ExecutorType.BATCH WIHOUT在xml中为可为空的列指定jdbcType插入Oracle数据库时,性能可能会严重下降并降低200倍甚至更多。 即使在...
### MyBatis 3.2.7 与 EHCache 2.6.8 在 Oracle 数据库中的集成及测试用例 #### 一、基础知识简介 **MyBatis** 是一个支持普通 SQL 查询、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的 JDBC 代码和...
这类问题通常出现在尝试将空值(`null`)插入数据库表中时,尤其是在未指定 JDBC 类型的情况下更为常见。本文将详细介绍这种异常的原因,并提供相应的解决方案。 #### 异常原因分析 当 MyBatis 在执行 SQL 语句时...
create or replace function f_getFirstOrFullSpell(p_cnStr In varchar2,p_sign In number default null) return varchar2 as lv_spell varchar2(200); lv_temp Varchar2(10); lv_char varchar2(10); --lv_...
MyBatis 支持多种数据库,包括 MySQL、Oracle、SQL Server 等。开发者可以根据不同的数据库类型调整 SQL 语法和配置。 #### 五、最佳实践 1. **代码分离**:将 SQL 语句与 Java 代码分离,便于维护和重用。 2. **...
通常做法是在传入的参数中包含页码和每页大小,然后在SQL语句中添加`LIMIT`和`OFFSET`子句(MySQL)或`ROW_NUMBER()`(Oracle、SQL Server等)。例如: ```java public interface WebsiteMapper { List<Website>...