`
queri
  • 浏览: 3066 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

解决mybatis在oracle中null的问题

阅读更多

使用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;

}

分享到:
评论
1 楼 yonguo 2012-08-07  
这个类写好后怎么用呢,是在mybatis-config.xml中声明一下就成了吗?

相关推荐

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    "解决mybatis使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...

    Mybatis 中 Oracle 的拼接模糊查询及用法详解

    Mybatis 中 Oracle 的拼接模糊查询及用法详解 Mybatis 是一个基于 Java 的持久层框架,提供了强大的数据库交互能力,而 Oracle 则是业界最流行的关系数据库管理系统。本文将详细介绍 Mybatis 中 Oracle 的拼接模糊...

    mybatis,对null无法处理的原因.pdf

    在MyBatis框架中,当处理SQL语句时,遇到参数为null的情况,可能会出现一些问题,这主要是由于MyBatis将null值默认映射到JDBC类型的`OTHER`,而并非所有数据库都能正确处理这种类型。这可能导致插入或更新操作失败,...

    mybatis中使用oracle关键字出错的解决方法

    在本文中,我们将讨论如何解决MyBatis中使用Oracle关键字出错的问题。 问题描述 在MyBatis中,如果使用的字段是Oracle的关键字,可能会出现错误。例如,如果我们的表名或列名是Oracle的关键字,例如"DATE"、"USER...

    深入浅析mybatis oracle BLOB类型字段保存与读取

    在Oracle数据库中,BLOB(Binary Large Object)字段是用来存储大量二进制数据的类型,如图片、视频或任何非文本文件。与之相对的是CLOB(Character Large Object),用于存储大量的文本数据。在Java应用中,特别是...

    Mybatis 处理 CLOB、BLOB 类型数据

    在 Oracle 数据库中,CLOB 类型对应的数据库类型是 CLOB,在 MySQL 中对应的类型是 TEXT 或 LONGTEXT。 BLOB 类型用于存储二进制数据,可以存储图片、音乐、视频等文件。在 Oracle 数据库中,BLOB 类型对应的数据库...

    oracle表分区详解

    Oracle数据库中的表分区是一种高级组织技术,它通过将表的大数据集划分为较小的、更易于管理的部分(即分区),从而提高查询性能和可管理性。表分区可以按照不同的策略进行划分,如范围分区、列表分区等。 #### 二...

    图片存入Oracle中,用clob和blob两种方式

    下面将详细介绍这两种数据类型以及如何在Oracle中使用它们存储和读取图片。 1. **CLOB数据类型**: `CLOB`数据类型用于存储大量的字符数据,最大可达到4GB。虽然主要用于存储文本,但在本例中,由于图片可以被转换...

    Mybatis优化

    如果实体Bean中存在某个属性没有Getter方法,在运行过程中,MyBatis会将其视为一个复杂对象。这会导致MyBatis在填充SQL执行后的结果时遇到性能问题。尤其是在属性数量较多的情况下,性能下降尤为明显。例如,在有10...

    springboot mybatis多数据源加事务嵌套

    springboot mybatis多数据源加事务嵌套 事务之间的调用 回滚 亲测可用 定义2个库分别建立 CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `user_name` varchar(25) ...

    springmybatis

    sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名非常重要,你在 具体的类的映射中,比如User...

    MyBatis动态SQL,MyBatis批量插入(Oracle数据库)[收集].pdf

    在上面的示例中,如果传递了title参数,那么将生成一个包含title的where子句。如果没有传递title参数,那么将生成一个不包含title的where子句。 批量插入的应用 ------------- MyBatis还提供了批量插入的功能,...

    mybatis+springmvc分页

    本项目以"Mybatis+SpringMVC"为技术栈,实现了Oracle数据库中的emp表的增删改操作,并结合分页功能,提供了良好的用户体验。 首先,Mybatis是一个优秀的持久层框架,它简化了Java开发中的SQL操作,将SQL语句与Java...

    spring-mybatis-oracle-performance-issue

    Spring MyBatis Oracle性能问题 概述 通过Spring MyBatis事​​务或通过MyBatis使用ExecutorType.BATCH WIHOUT在xml中为可为空的列指定jdbcType插入Oracle数据库时,性能可能会严重下降并降低200倍甚至更多。 即使在...

    mybatis-3.2.7 EHCache2.6.8 oracle 及 测试用例

    ### MyBatis 3.2.7 与 EHCache 2.6.8 在 Oracle 数据库中的集成及测试用例 #### 一、基础知识简介 **MyBatis** 是一个支持普通 SQL 查询、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的 JDBC 代码和...

    mybatis 报空值异常

    这类问题通常出现在尝试将空值(`null`)插入数据库表中时,尤其是在未指定 JDBC 类型的情况下更为常见。本文将详细介绍这种异常的原因,并提供相应的解决方案。 #### 异常原因分析 当 MyBatis 在执行 SQL 语句时...

    Oracle 汉字转全拼 拼音首字母

    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_...

    MyBatis3.2.6

    MyBatis 支持多种数据库,包括 MySQL、Oracle、SQL Server 等。开发者可以根据不同的数据库类型调整 SQL 语法和配置。 #### 五、最佳实践 1. **代码分离**:将 SQL 语句与 Java 代码分离,便于维护和重用。 2. **...

    Java的MyBatis框架中实现多表连接查询和查询结果分页

    通常做法是在传入的参数中包含页码和每页大小,然后在SQL语句中添加`LIMIT`和`OFFSET`子句(MySQL)或`ROW_NUMBER()`(Oracle、SQL Server等)。例如: ```java public interface WebsiteMapper { List<Website>...

Global site tag (gtag.js) - Google Analytics