`

Ibatis关于null的处理

阅读更多
使用Ibatis作为数据库持久层的人都有体会,Ibatis 对NULL值的处理并不优雅.本文讨论常见的NULL值处理方案.jdbcType 应该是java.sql.Types 中所列举的类型中的一种.

1.String为NULL的处理:拿SQL Server 来说,其中与String对应的类型有很多种,如VARCHAR,NVARCHAR,TEXT...如果存入数据库中的值有可能为NULL的时候,我们只要在插入或者更新的时候指定它的类型为VARCHAR,或者LONGVARCHAR,对应TEXT类型,(注意不能为NVARCHAR,和LONGNVARCHAR):如下

<update id="update">
   UPDATE [ArtT_user]
   SET [ArtT_sUserName] = #userName#
      ,[ArtT_sUserPwd] = #password#
      ,[ArtT_sUserEmail] = #userEmail:VARCHAR#
      ,[ArtT_sUserDescription] = #description:LONGVARCHAR#
     WHERE [ArtT_iUserId] = #userId#
  </update>

如果属性userEmail,description为空时,Ibatis把NULL存入数据库.

数据库取出值为NULL,对应的属性为String类型的时候,无需作特别处理,Ibatis会把相应属性设置为空.

2.date ,datetime的处理:与String的处理相类似,插入或者更新数据时,应该指定日期的类型,DATE 或者TIMESTAMP,如下:

<update id="update">
   UPDATE [ArtT_user]
   SET [ArtT_sUserName] = #userName#
      ,[ArtT_sUserPwd] = #password#
      ,[ArtT_dLastLoginTime] = #lastLoginTime:TIMESTAMP#
      ,[ArtT_sCreateDate] = #createDate:DATE#
WHERE [ArtT_iUserId] = #userId#
  </update>

同时,从数据库中取出值时,在resultMap中也应该指定明确的类型,DATE 或者DATETIME,如下:

<result property="lastLoginTime"column="ArtT_dLastLoginTime" columnIndex="12"jdbcType="TIMESTAMP"/>
<result property="createDate" column="ArtT_sCreateDate" columnIndex="13" jdbcType="DATE"/>

3.int,double,float的处理:根据Ibatis 官方文档介绍,因为在javaBean中如果属性为int ,double, float 时,不允许设置为NULL,可以采用一个"神奇数字"来代替属性中的NULL,如-9999.

数据存入数据库时,当检测到属性值为-9999时,Ibatis把空值存入数据库中.

数据从数据库中取出时,当数据库中该字段为NULL时,Ibatis给javaBean中的属性赋值为-9999.

因此,在XML映射文件中,应该同时在存入与取出处指定nullValue='-9999',否则容易导致数据库的不一致.

这种做法虽然保证了数据库的一致性,但对程序来说并不雅观,在程序中如果要判断该属性是否为空,只要判断它是否等于"神奇数字",不得已而为之.
分享到:
评论

相关推荐

    Ibatis 事务处理

    描述中提到的“NULL”可能表示这篇博文详细讨论了如何在Ibatis中集成Spring进行事务管理。Spring框架提供了一种声明式事务管理方式,开发者只需在服务层的方法上添加@Transactional注解,Spring就会自动管理事务的...

    ibatis sql语句对条件中特殊字符% # 处理

    ### ibatis SQL语句对条件中特殊字符% # 处理 在开发过程中,经常会遇到SQL查询时需要处理字符串中的特殊字符的情况。特别是在使用类似`LIKE`这样的操作符时,如果用户输入的数据中含有`%`、`_`或`#`等特殊字符,...

    ibatis批量处理

    ### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。iBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...

    ibatis常用sql语句

    同时,为了避免数组为空或为null时引发的SQL语法错误,iBATIS还提供了`&lt;isNotNull&gt;`和`&lt;dynamic&gt;`标签进行条件判断,确保了代码的健壮性和安全性。 ### 传递参数只含有一个数组 最后,当参数只包含一个数组时,...

    ibatis应对批量update

    为了解决这个问题,ibatis(现已更名为MyBatis)提供了一种支持批量更新的机制,能够显著提高数据处理的速度。 #### 批量Update背景与问题 在实际应用中,经常会遇到需要批量更新数据库中的数据的情况,例如:商品...

    ibatis的dynamicSQL中,关于prepend的使用

    ### 关于ibatis动态SQL中的`prepend` #### 1. 动态SQL元素 在ibatis中,`&lt;dynamic&gt;`标签是用来构建动态SQL的核心元素之一。当使用`&lt;dynamic&gt;`标签时,可以将一系列条件组合起来,根据参数的不同值来决定是否加入到...

    ibatis拼接字符串

    在本篇文章中,我们将深入探讨如何使用 Java 编程...通过以上分析,我们可以看出 iBatis 在处理动态 SQL 方面具有很大的灵活性和扩展性。在实际开发过程中,合理利用 iBatis 可以极大地提高开发效率和系统的可维护性。

    struts+ibatis登录

    通过理解Struts的请求处理流程和iBatis的SQL映射机制,开发者可以更好地掌握Java Web开发中的业务逻辑处理和数据库交互。这个实例是一个很好的学习起点,可以帮助初学者理解MVC架构和数据库操作在实际应用中的运用。

    ibatis2.0中文API

    比如使用`nullValue`属性处理空值,或者通过优化SQL语句来提高查询速度。同时,对于复杂的业务场景,iBATIS支持动态SQL,使得在映射文件中可以编写条件语句,根据对象状态动态生成执行的SQL片段。 最后,iBATIS 2.0...

    Spring与iBATIS的集成

    3. **异常处理**:Spring框架中的异常处理机制可以很好地与iBATIS相结合,统一处理数据库操作过程中可能出现的各种异常情况。 4. **DAO支持**:Spring为DAO(Data Access Object)提供了丰富的支持,包括DAO抽象层...

    ibatis 支持枚举类型

    以下将详细解释如何在Ibatis中处理枚举类型。 首先,我们需要定义枚举类。枚举类通常包含若干枚举常量,每个常量对应一个特定的业务含义。例如,一个状态枚举类可以如下所示: ```java public enum Status { ...

    ibatis.util包

    6. **Strings**: 类似于Java的`java.lang.String`,`ibatis.util.Strings`提供了一些字符串处理的辅助方法,如格式化字符串,检查是否为空等。 7. **TypeHandlerRegistry**: 这是Ibatis的核心组件之一,负责管理...

    ibatis开发过程取值问题

    在描述中提到的“##”是Ibatis中的一个特殊占位符,它的主要功能是在拼接SQL字符串时处理参数。与常用的“#{}”占位符不同,“##”处理的是SQL的关键词或表名,它会将占位符及其内的内容原样输出到SQL语句中,而不是...

    ibatis.rar

    同时,讲解了如何处理查询结果为null的情况,避免空指针异常。 4. **iBatis的优点**: - **简洁高效**:相比传统的JDBC,iBatis消除了大量手动设置参数和获取结果集的代码,提高了开发效率。 - **灵活的SQL**:...

    ibatis批处理.doc

    return null; } }); } ``` 这种回调函数的方式同样在事务内执行,保持了批处理的特性。 在进行批处理时,还需要注意以下几点: - **错误处理**:如果批处理中的某个操作失败,通常可以选择回滚整个事务,以...

    ibatis的错误总结

    ibatis在处理SQL语句时,其灵活性和强大功能也伴随着易犯的错误。确保`parameterClass`和`resultClass`属性与实际参数类型和返回类型相匹配,正确使用动态SQL标签如`&lt;isNotNull&gt;`,并注意`#`和`{}`之间的区别,这些...

    iBATIS动态标签

    这在处理IN语句或者需要对列表中的每个元素进行操作时非常有用。 ### 其他标签 1. `&lt;isParameterPresent&gt;`:检查是否存在非null的参数对象。 2. `&lt;isNotParameterPresent&gt;`:检查参数对象是否为null。 通过这些...

    ibatis UPDATE 动态XML与insert

    标题 "ibatis UPDATE 动态XML与insert" 涉及到的是MyBatis框架中对数据库数据进行更新(UPDATE)和插入(INSERT)操作的动态XML配置方式。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...

    ibatis实现分页技术

    为了简化代码,我们还可以自定义一个Ibatis分页插件,自动处理分页逻辑。例如,使用PageHelper插件,只需在配置中启用并设置相关参数,就可以自动实现分页。 四、总结 Ibatis实现分页技术主要依赖于SQL语句中的分页...

    ibatis-generator.zip

    在这个配置文件中,你可以指定多个`&lt;table&gt;`标签来处理不同的数据库表,每个表都会生成相应的Model、Mapper XML和DAO接口。 生成的代码中,Model类通常包含表的所有字段作为属性,DAO接口则提供了CRUD(Create、...

Global site tag (gtag.js) - Google Analytics