`

ibatis list 作入参的一些问题

 
阅读更多

ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用

(List<Integer>)getSqlMapClientTemplate().queryForList("sqlName", paraName);

并经类型转换即可,做入参还需要稍微调整下,本文主要讲list做入参碰到的几个小问题

 

做入参主要有两种方法一种是以list直接作为入参,另一种是将list作为map的元素之一为入参,个人觉得第一种明显优势,就一个list为入参,还用map包装一层多蛋疼。下面的介绍都以这个sql为例

	<select id="getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"
		parameterClass="java.util.ArrayList">
		<![CDATA[
		SELECT id 
		FROM cic_job 
		WHERE last_buildid <> 'NULL'
		]]>
		<iterate  prepend="AND" open="(" close=")" conjunction="or">
			CRID=#projectIdList[]#
			</iterate>
	</select>

以上是正确的写法,意义大家不用关注,重点放在倒数2到4行,表示以list为入参,其中projectIdList为dao层传入的参数名。主要写法就是parameterClass="java.util.ArrayList",然后加上

  		<iterate  prepend="AND" open="(" close=")" conjunction="or">
			CRID=#projectIdList[]#
			</iterate>

意思就是迭代器循环projectIdList,并用or拼接形成sql,拼接完后用()括起来,在加上前缀and

 

1、iterate property的问题

网上很多写法是

<iterate property="projectIdList" prepend="AND" open="(" close=")" conjunction="or">

即多了一个property,这个时候ibatis会从参数中寻找属性为projectIdList的对象,而list是一个对象没有属性就会报

Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1

异常,解决方法就是去掉property="projectIdList"

其实这种写法是相对第二种以map为参数而言的,你可以使用map传入参数设置属性为 property对应名即可

 

2、<![CDATA[的问题

大家注意到上面sql添加有<![CDATA[ ]]>,它的作用是对一些字符进行转移,具体可以参见http://renren.it/a/JAVAbiancheng/iBATIS/20111105/139874.html

但上面sql如果写成

	<select id="getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"
		parameterClass="java.util.ArrayList">
		<![CDATA[
		SELECT id 
		FROM cic_job 
		WHERE last_buildid <> 'NULL'
		<iterate prepend="AND" open="(" close=")" conjunction="or">
			CRID=#projectIdList[]#
			</iterate>
		]]>
	</select>

即扩大转义范围会出现如下错误

com.ibatis.common.beans.ProbeException: There is no READABLE property named 'projectIdList[]' in class 'java.util.ArrayList'

解决方法,就是缩小 CDATA的范围。原因是CDATA导致系统无法识别动态判断部分

 

分享到:
评论
3 楼 wangjinbo 2013-12-11  
YES   
2 楼 Kent_Mu 2013-09-07  
good!
1 楼 lpknkhh 2012-04-26  
gioodd

相关推荐

    ibatis入门与ibatis迭代的用法

    **ibatis入门** iBatis,一款轻量级的Java持久层框架,是MyBatis的前身,由美国华人开发团队开发。它提供了一个SQL、Java和XML的映射框架,将SQL语句与Java代码分离,使得开发者可以更加灵活地处理数据库操作,避免...

    ibatis list

    在IT领域的数据库操作中,iBatis框架提供了一种强大的数据映射机制,使得开发者能够更灵活地控制SQL语句的生成与执行。在本文中,我们将深入探讨iBatis框架中的“ibatis批量”功能,特别是如何利用iBatis进行批量...

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    ibatis做连接查询 .doc

    在Java开发中,iBatis是一个流行的数据访问框架,它允许开发者将SQL语句与Java代码分离,提供了一种更灵活的方式来处理数据库操作。本文将详细介绍如何使用iBatis进行连接查询。 首先,我们需要理解iBatis的工作...

    解决IBatis缓存动态字段问题

    ### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,从而更好地管理数据库操作。Ibatis的出现,解决了传统JDBC中手动编写SQL和结果集映射的繁琐工作,...

    ibatis应对批量update

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

    ibatis开发过程取值问题

    本篇文章将深入探讨Ibatis在开发过程中遇到的取值问题,以及“##”符号在其中的作用。 首先,让我们了解Ibatis的核心概念。Ibatis的主要目标是解决对象关系映射(ORM)的问题,它允许开发者编写XML或注解形式的SQL...

    Ibatis入门例子,Ibatis教程

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注JDBC代码的编写。Ibatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    《深入解析iBatis源码》 iBatis,一个优秀的Java持久层框架,以其轻量级、灵活的特性在众多ORM(Object-Relational Mapping)框架中独树一帜。iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,...

    ibatis api,ibatis文档,ibatis说明文档

    Ibatis文档是学习和解决问题的重要资源,它包含了详细的API参考、配置指南、最佳实践和常见问题解答。通过阅读文档,你可以了解如何配置Ibatis、创建Mapper接口和XML映射文件,以及如何处理复杂的查询和关联。 在...

    Ibatis

    **Ibatis 指南** Ibatis 是一个优秀的开源持久层框架,它允许开发者将 SQL 查询与 Java 代码分离,从而避免了传统的 JDBC 编程中的大量模板代码。作为一个轻量级的框架,Ibatis 提供了灵活的映射机制,使得 XML 或...

    ibatis教程 输入参数详解

    部分内容:这段部分提供了ibatis用户指南的警告,关于从文档复制代码的问题,以及ibatis的概述、如何开始使用ibatis、构建SqlSessionFactory的方法(包括通过XML和不使用XML的方式)、获取SqlSession的过程、探索...

    ibatis教程,ibatis帮助文档

    iBATIS是一个由Clinton Begin创建,目前由Apache基金会支持的持久化框架,它专注于数据库查询的简化,尤其在JDBC编程方面提供了极大的便利。相对于全自动化ORM解决方案如Hibernate,iBATIS被称为“半自动化”ORM实现...

    ibatis基本操作数据库

    iBatis并不鼓励直接复制SQL字符串到数据库管理系统(DBMS)进行执行,因为这样会丧失iBatis的一些核心优势,如参数绑定、动态SQL和结果映射等。在iBatis中,我们通常通过XML配置文件或者注解来定义SQL语句,并使用...

    ibatis2指南及ibatis包

    ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南

    Ibatis3手册 Ibatis3参考手册

    ### Ibatis3手册知识点概述 Ibatis3作为一款流行的持久层框架,在软件开发领域具有重要的地位。本篇文章基于“Ibatis3手册 Ibatis3参考手册”的标题及描述,深入解析Ibatis3的核心概念、架构特点以及如何进行实际...

    ibatis入门

    **Ibatis 入门教程** Ibatis 是一个优秀的 Java ORM(对象关系映射)框架,它允许程序员将数据库操作与业务逻辑分离,提供灵活的 SQL 配置和映射机制,使得开发人员能够自由地编写 SQL 而不被 ORM 的复杂性所束缚。...

    ibatis

    1. SQL映射:Ibatis 允许开发者在XML文件中直接编写SQL语句,这既保留了SQL的灵活性,又避免了硬编码SQL在Java代码中的问题。此外,通过动态SQL,开发者可以根据条件灵活地修改查询,比如使用`&lt;if&gt;`、`&lt;choose&gt;`、`...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`ResultMap`用于处理查询结果的映射,以及`Cache`机制,用于缓存查询结果,提高系统性能。这些工具类使得开发者能够更方便地进行...

Global site tag (gtag.js) - Google Analytics