ibatis iterate用法和ibatis 一对多查询

本文介绍了在使用MyBatis框架进行批量操作时的一些常见问题及解决方案,包括如何正确使用<iterate>标签来避免错误,以及一对多查询和插入的具体实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在用

<select id="aaa" parameterClass="java.util.List" resultMap="siteMap">

select * from table where a in

<iterate  open="(" close=")" conjunction=",">  
      #idList[]#
  </iterate>  

时一直报错,找了很长时间,看到一篇文章才知道原来参数是list 在iterate里面不能加property,去掉property就正常了。

////////////////////////////////////////////////////////////////////////

写道
<iterate property="" conjunction="" open="" close="" prepend="">
</iterate>
<!-- 批量删除对象的时候,iterate不要property属性 -->
<delete id="delStudybook" parameterClass="java.util.List">
delete FROM STUDYBOOK WHERE ID IN
<iterate conjunction="," open="(" close=")">
#bookList[]#

</iterate>
</delete>
注意要property的错误
Caused by: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1
//另外:如果parameterClass="java.util.List"类型不匹配的话
报错Caused by: java.sql.SQLException: Invalid parameter object type. Expected 'java.util.Map' but found 'java.util.ArrayList'.
===============================
<!--批量修改对象,iterate必须包括property属性-->
<update id="updateUsersIterate" parameterClass="java.util.Map">
update users set user_name=#userInfo.user_name# where user_id in
<iterate property="list" conjunction="," open="(" close=")">
#list[]#
</iterate>
</update>

注意不要property属性的错误
Cause: com.ibatis.sqlmap.client.SqlMapException: ParameterObject or property was not a Collection, Array or Iterator.
===============================
<!-- Iterate的使用,根据多个匹配条件查询,类似in(a,b,c)-->

<select id="selectByIterate" parameterClass="java.util.List" resultClass="user">

SELECT * FROM USERS WHERE USER_ID IN

<iterate conjunction="," open="(" close=")">
#ids[]#
</iterate>
</select>
注意:不要property属性,否则报错。String index out of range: -1
2. 但是,若参数有多个传入的一个是List,另一个不是, parameterClass为map时,需要property属性区分要遍历的 集合。

 

/////ibtais一对多查询用法,和一对多插入方法

写道
<resultMap id="voteMap" class="Vote">
<result property="voteId" column="vote_id" />
<result property="siteId" column="site_id" />
</resultMap>

<resultMap id="picVoteMap" class="PicVote" extends="voteMap" >
<result property="picOptions" column="vote_id" select="getVotePicOptionByVoteId" />
</resultMap>

<select id="getVotePicOptionByVoteId" parameterClass="int" resultMap="votePicOptionMap" >
select *
from OBS.FACE_EXT_VOTE_PIC_OPTION where vote_id = #value#
</select>

<select id="getPicVoteById" parameterClass="int" resultMap="picVoteMap" >
select *
from OBS.FACE_EXT_VOTE where vote_id = #value#
</select>

 用这种查询方式即可只调用getPicVoteById,就能将一对多对象进行查询操作。

一对多插入:

先插入主表,然后获取主表id,然后批量插入副表即可完成一对多的插入。

写道
<selectKey keyProperty="voteId" resultClass="int">
VALUES IDENTITY_VAL_LOCAL()
</selectKey>

 插入主表末尾插入这么一段就可返回插入主键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值