`

iBatis对于空值的处理

    博客分类:
  • Java
阅读更多

 

使用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',否则容易导致数据库的不一致.

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

 

转自:http://blog.sina.com.cn/s/blog_520998920100b4d3.html

分享到:
评论

相关推荐

    ibatis2.0中文API

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

    ibatis2.0开发指南

    - **参数传递**:通过`#{}`语法传递参数值,支持类型转换和空值处理。 3. **事务管理** - **基于JDBC的事务管理机制**:直接使用JDBC事务,适用于简单的事务管理需求。 - **基于JTA的事务管理机制**:支持分布式...

    ibatis+jar包.rar

    它可以处理一对一、一对多、多对一等复杂关系,以及自动类型转换和空值处理。 5. **Dynamic SQL**:iBATIS允许在SQL语句中使用动态条件,使得开发者可以根据需要构建灵活的查询,而不必编写大量的硬编码SQL。 6. *...

    Ibatis_in_action

    使用Ibatis时,应当遵循一些最佳实践,如合理划分SQL映射文件,避免过度复杂的映射关系,保持SQL语句的清晰简洁,以及正确处理空值和异常情况。 通过阅读《Ibatis_in_action》这本书,开发者能够全面掌握Ibatis的...

    ibatis开发指南

    此外,iBatis还支持自动类型转换和空值处理,减少了手动处理数据的繁琐工作。 5. 事务管理 在iBatis中,事务可以通过SqlSession对象进行管理。开发者可以控制SqlSession的begin、commit和rollback方法,实现事务的...

    ibatis3.0中文文档和英文文档

    13. **最佳实践**:在实际使用中,应遵循一些最佳实践,如合理设计Mapper接口,避免过于复杂的动态SQL,正确处理空值,以及及时关闭SqlSession以释放资源。 Ibatis3.0中文文档和英文文档是学习和理解这个框架的重要...

    testIbatis

    3. **异常处理**:测试异常情况,如空值、类型不匹配等,确保映射过程能够优雅地处理这些问题。 4. **性能测试**:评估映射过程对系统性能的影响,优化映射配置以提高数据处理速度。 5. **集成测试**:在实际...

    ibatis学习文档

    在使用Ibatis处理数组参数时,需要注意以下几点: - 数组中的元素类型应当与数据库中对应的字段类型相匹配。 - 使用`&lt;iterate&gt;`标签时,确保正确设置其属性,以生成正确的SQL语法。 - 数组为空时,`&lt;iterate&gt;`标签...

    系统常见问题说明

    最后,关于列表分页查询中可能出现的数据显示问题,尤其是在使用`ORDER BY`进行排序时,需特别注意字段的空值处理。如果排序字段存在空值,可能导致分页逻辑失效。因此,建议在执行排序前检查字段状态,对于空值字段...

    Spring in Action(第2版)中文版

    2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第...

    Spring in Action(第二版 中文高清版).part2

    2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean ...

    Spring in Action(第二版 中文高清版).part1

    2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean ...

    mybatis官方文档PDF_中英文版

    12. **Best Practices**:文档还会介绍最佳实践,如避免使用 SELECT *,合理设计映射文件,正确处理空值等,以提升开发效率和代码质量。 通过阅读这两份官方文档,你可以深入理解 MyBatis 的工作原理、配置方法以及...

    Mybatis-Study.rar

    使用MyBatis时,应遵循一些最佳实践,如合理设计数据库表结构,避免全表扫描,合理设置事务隔离级别,以及正确处理空值和异常情况等。 这个"Mybatis-Study"的学习资源包将涵盖以上各个方面,通过学习,我们可以...

    AppFramework_V1.0

    &lt;br&gt; &lt;br&gt;AppFramework数据库访问组件针对IBatisNet的种种缺陷提出相应的解决方案,相比之下有如下优势: &lt;br&gt;1、 从扩展基础数据类型入手,解决了空值问题和默认值问题; &lt;br&gt;2、 提供了内置的数据库...

    自整理Java关于基础和框架的面试题

    - **唯一索引**:可以应用于多个列,并允许空值。 ##### Preparedstatement和statement的区别 - **PreparedStatement**:预编译的SQL语句,提高性能。 - **Statement**:直接执行SQL语句。 ##### 数据库三范式 - ...

    AppFramework_V1.0_New

    &lt;br&gt; &lt;br&gt;AppFramework数据库访问组件针对IBatisNet的种种缺陷提出相应的解决方案,相比之下有如下优势: &lt;br&gt;1、 从扩展基础数据类型入手,解决了空值问题和默认值问题; &lt;br&gt;2、 提供了内置的数据库...

    手把手教你 SpringBoot整合MybatisPlus 代码生成器(csdn)————程序.pdf

    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 输出 SQL 到控制台 typeAliasesPackage: com.example.study.model.entity # 实体类的包名 global-config: db-config: id-type: auto # 主键策略,...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    &lt;br&gt; &lt;br&gt;AppFramework数据库访问组件针对IBatisNet的种种缺陷提出相应的解决方案,相比之下有如下优势: &lt;br&gt;1、 从扩展基础数据类型入手,解决了空值问题和默认值问题; &lt;br&gt;2、 提供了内置的数据库...

    mybatis中的setting配置详解

    默认值为 org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver。 callSettersOnNulls:该配置控制的是 MyBatis 中是否在结果集中值为 null 的时候调用 setter 方法。默认值为 false。 MyBatis 中的 ...

Global site tag (gtag.js) - Google Analytics