list参数查询,据说ibatis官方是有例子,我没有看到,基本上就是通过iterator标签可以循环,拼出sql。 例如批量删除:
<select id="queryBatch" resultMap="resultMap" parameterClass="list">
select * from tableName where
ID in
<iterate open="(" close=")" conjunction=",">
#[]#
</iterate>
</select>
注意parameterClass 是java.utils.list 而iterate里面的属性直接写成#[]#,而这个时候查询方法的参数则是:list<Long>
如果还不明白为什么这么写,看下面的写法。
<select id="getProducts" parameterClass="Product"
resultClass="Product">
SELECT * FROM Products
<dynamic prepend="WHERE productType IN ">
<iterate property="productTypes"
open="(" close=")"
conjunction=",">
productType=#productType#
</iterate>
</dynamic>
</select>
这里的parameterClass是自己定义的一个对象,而对象里面是有一个list的productTypes的属性。而#productType#则是productType对象的一个属性(小声告诉你,这是我猜的,并且没有求证过~~~)
可以参考文章:iBatis: Support for Array or List Parameter with SQL IN Keyword
然而上面一种情况可能不会是我们常用的一种方式,我们可能参数直接就是list,在iterate中就无需写property属性了,就像第一个例子中,但是由于我们list中不是单一的long或者string,而是一个封装的对象,需要取里面具体的某个属性,
我在第一种方式的基础上,试验了很多种写法,如:#list[].id# , #[].id# , #id# , #id[]# 。很不幸都失败了。
于是我还是采用了和加property的方式完成。而这个时候注意parameterClass=“map”,其实是将list放到了map中传进来的,并且map的key就是personList。
<delete id="deletePerson" parameterClass="map">
delete from 表名 where sex=#sex#
<iterate prepend="and" property="personList" open="("
close=")" conjunction="or">
age=$personList[].age$
</iterate>
</delete>
具体细节,可以参考文章:ibatis中iterate的用法 iterator iter
而网上有一些文章说去掉iterator中的propetry的方式,由于没有写的很明确不知道是与这个类似,还是与第一个例子类似。想知道细节的可以看这个文章: ibatis中iterate问题的解决
当然我上面用到了对象,肯定不会是只查一个属性就ok的,肯定是要多个属性动态组合查询,否则我就直接用第一个例子好了,费下面这些事干嘛。而在组合动态查询的时候,也发现了一些问题:
select * from tableName where disabled = 0
<dynamic prepend="AND">
<iterate open="(" close=")" property="list" conjunction=" OR ">
(
<isNotNull property="list[].id">
ID = #list[].id# AND
</isNotNull>
<isNotNull property="list[].channel">
CHANNEL = #list[].channel# AND
</isNotNull>
<isNotEmpty property="list[].reservationId">
RESERVATION_ID = #list[].reservationId# AND
</isNotEmpty>
1=1
)
</iterate>
</dynamic>
上面的的第一个问题是:为啥 and要自己加,而不是在isNotNull中加prepend=“AND” 原因就是在iterator中,发现只有第一次循环:<isNotNull prepend="and" property="list[].id"> 中不会自动加and,第而次会自动加的。
再就是 $personList[].age$ 与 #list[].reservationId# 其实这两个是一样的,唯一区别在于,第一个是直接将值输出,第二个则会拼成?号,然后组装。
感觉写的有点乱,但是具体遇到这个问题的时候看看,肯定是可以明白的。
分享到:
相关推荐
### ibatis多参数查询解析 #### 一、引言 在使用ibatis(现称为MyBatis)进行数据库操作时,经常会遇到需要处理多个输入参数的情况。然而,默认情况下ibatis只支持单个输入参数,这在实际开发中往往难以满足需求。...
在处理查询结果时,iBatis提供了迭代的用法,可以方便地遍历查询结果集。以下是一个基本示例: ```java List<User> users = sqlSession.selectList("com.example.mapper.getUserList"); for (User user : users) { ...
标签:ibatis list 部分内容:这段部分提供了ibatis用户指南的警告,关于从文档复制代码的问题,以及ibatis的概述、如何开始使用ibatis、构建SqlSessionFactory的方法(包括通过XML和不使用XML的方式)、获取...
### 操作数据库iBATIS查询详解 #### 一、iBATIS中的LIKE查询技巧 iBATIS是一款优秀的Java持久层框架,它简化了基于SQL的程序编写,避免了程序员手动处理结果集和手工编写SQL语句。在进行数据库查询时,LIKE查询是...
### Ibatis多表查询知识点详解 #### 一、数据库表结构设计 为了演示Ibatis的多表查询功能,本文档采用了一个简单的例子:一个图书 (`book`) 表和一个用户 (`user`) 表,其中图书表与用户表之间存在一对多的关系。...
`#value#`是Ibatis的占位符,代表传递给SQL查询的参数。 `sqlMapConfig.xml`文件是Ibatis的全局配置,它引用了`book.xml`,并设置了一些Ibatis的配置选项,如缓存和动态代理的启用。 综上所述,Ibatis通过配置文件...
在本话题中,我们将探讨如何在使用iBatis框架与Oracle数据库时实现树形查询。 首先,iBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,提供了比传统JDBC更高级的抽象层,使得...
在动态查询条件中,iBatis 提供了多种判断参数的方法,例如 `isNotNull`、`isNotEmpty`、`isGreaterThan` 等,这些方法可以根据参数的值来生成不同的 SQL 语句。 下面是一个简单的示例,演示如何使用 iBatis 的动态...
根据提供的文档信息,我们可以深入探讨Ibatis框架中的一个具体应用场景:如何通过动态SQL查询特定条件下的ID列表。本文将从以下几个方面进行详细解析: ### 一、Ibatis简介 Ibatis是一个基于Java的持久层框架,它...
本教程聚焦于如何使用Ibatis查询指定ID的单个对象,这对于日常的数据检索工作尤为重要。 首先,理解Ibatis的基本架构。Ibatis不是一个完整的ORM(对象关系映射)框架,而是介于SQL和Java之间的桥梁,允许开发者编写...
对于带有输出参数的存储过程,我们需要使用`<select>`标签而不是通常用于查询的`<resultMap>`,并且使用`procedure`属性指定存储过程的名称,而不是SQL查询语句。例如: ```xml <!-- 这里可以添加输入参数 --> ...
在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...
以上内容详细介绍了 ibatis 中动态查询的基本原理及具体实现方法,包括模糊查询、多条件组合查询以及使用 Map 作为参数的高级用法。这些知识点对于深入理解 ibatis 的动态查询机制非常重要,可以帮助开发者更高效地...
- **Statement**: 可以执行静态SQL语句,但不支持参数化查询,每次执行都需要重新编译。 - **PreparedStatement**: 支持参数化查询,通过“?”作为占位符,预编译后可重复使用,提高了性能和安全性。 例如,使用`...
### iBatis 多表查询知识点详解 #### 一、iBatis简介 iBatis 是一款优秀的持久层框架,它将 SQL 映射到 Java 对象,简化了 JDBC 编程过程中的繁琐操作,提高了开发效率。iBatis 的核心功能包括 SQL 映射、动态 SQL...
1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...
本文将详细介绍如何使用iBatis进行连接查询。 首先,我们需要理解iBatis的工作原理。iBatis并不是像Hibernate那样完全自动管理数据库操作,而是将SQL语句的编写权交给开发者,这样可以更好地控制查询性能和复杂性。...
开发者可以在SQL Map中定义一个模板SQL,然后在Java代码中传入参数,iBatis会自动替换SQL中的占位符,生成实际的查询语句。这种方式既避免了硬编码SQL,又保持了SQL的灵活性。 例如,对于一个简单的用户查询场景,...
在本教程"07_ibatis教程_模糊查询实体对象"中,我们将深入学习如何使用iBatis这个流行的Java持久层框架进行模糊查询操作,尤其是在处理实体对象时。iBatis作为一个轻量级的ORM(Object-Relational Mapping)工具,它...