MyBatis中批量更新的错误

blackleech 2017-08-14 08:36:48
实现 批量删除 在Mybatis中写了这样的一句 语句

<!--批量删除-->
<update id="batchDeletionByListId" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";">
UPDATE t_skin
<set>
is_delete = 1
</set>
WHERE
skin_id = #{item.skinId}
/* WHERE skin_id = #{skinId}*/
</foreach>
</update>


java代码部分是这样的

@Path("XXXXXXXXX")
@POST
public IServiceResponse batchDeletionGameSkinAction(String skinId, @Context HttpServletRequest request) {
JSONObject jsonObject = JSONObject.fromObject(skinId);
JSONArray jsonArray = JSONArray.fromObject(jsonObject);
List<BatchDeletionRequest> listArray = (List<BatchDeletionRequest>)
JSONArray.toCollection(jsonArray, BatchDeletionRequest.class);

Integer result = skinManager.batchDeletionByListID(list);
}


java代码执行到
Integer result = skinManager.batchDeletionByListID(list);
这一行是出现

==> Preparing: UPDATE t_skin SET is_delete = 1 WHERE skin_id = ? /* WHERE skin_id = ?*/ ; UPDATE t_skin SET is_delete = 1 WHERE skin_id = ? /* WHERE skin_id = ?*/


ERROR c.m.f.c.s.mapper.JsonThrowableMapper [Logger.java:276] - nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named '' in 'class java.lang.String'

SQL语句在编译中运行能够运行 但在这里就会出现这种错误
我还注意到,这里没有显示传递的参数,是这个List集合死了问题,我的List<String>没有错啊 ,SQL中skin_Id也是varchar类型,如果我的想法是对的,我就不知道怎么修改了
还请大家帮帮忙
...全文
489 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackleech 2017-08-17
  • 打赏
  • 举报
回复
是个是编号 的字段
ligen320 2017-08-16
  • 打赏
  • 举报
回复
skinId 什么意思
strong_mz 2017-08-15
  • 打赏
  • 举报
回复
foreach 循环整个sql是有问题的吧 我感觉你应该写一个语句 然后在Java代码中循环的遍历集合 调用更新方法
blackleech 2017-08-14
  • 打赏
  • 举报
回复

        JSONObject jsonObject = JSONObject.fromObject(skinId);
        JSONArray jsonArray = JSONArray.fromObject(jsonObject);
        ArrayList<BatchDeletionRequest> listArray = (ArrayList<BatchDeletionRequest>)
                JSONArray.toCollection(jsonArray, BatchDeletionRequest.class);

        List<String> list = null;
        for (int i = 0;i < listArray.size();i++){
            list = listArray.get(i).getSkinId();
        }

        Integer result = skinManager.batchDeletionByListID(list);
上述是我在Action成中接受参数将,数组形式的json转化成list形式,我的JavaBean也就是BatchDeletionRequest封装类中的成员变量是

public class BatchDeletionRequest extends AbstractServiceResponse {
    private List<String> skinId;

    public List<String> getSkinId() {
        return skinId;
    }

    public void setSkinId(List<String> skinId) {
        this.skinId = skinId;
    }
}
这样转化成ArrayList集合后,就需要获取集合中的封装类中集合中的String类型的skinId debug模式中传递到Dao成中list集合参数中的内容是我想考的skinid数据,但在Mapper.xml中就会出现这样的错误,我也不知道这是因为什么,有点迷了 希望能得到大家帮助 感谢
qq_32154711 2017-08-14
  • 打赏
  • 举报
回复
写个语句,在java里面反复调用
blackleech 2017-08-14
  • 打赏
  • 举报
回复
参数怎么会是这个样子
blackleech 2017-08-14
  • 打赏
  • 举报
回复
再一次调试

 <!--批量删除-->
    <update id="batchDeletionByListId" parameterType="java.util.List">
        <foreach collection="list" item="item" index="index" separator=";">
            UPDATE t_skin
            <set>
                is_delete = 1
            </set>
            WHERE
            <if test="_parameter!=null and _parameter!=''">
                skin_id = #{_parameter}
            </if>

        </foreach>
    </update>
得到结果

2017-08-14 21:35:31.409 [http-bio-8081-exec-6] DEBUG java.sql.Connection [Slf4jImpl.java:43] - ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@745fef9e]
2017-08-14 21:35:31.413 [http-bio-8081-exec-6] DEBUG java.sql.Connection [Slf4jImpl.java:43] - ==>  Preparing: UPDATE t_skin SET is_delete = 1 WHERE skin_id = ? ; UPDATE t_skin SET is_delete = 1 WHERE skin_id = ? 
2017-08-14 21:35:31.494 [http-bio-8081-exec-6] DEBUG java.sql.PreparedStatement [Slf4jImpl.java:43] - ==> Parameters: {list=[skin201708092, skin201708091]}(StrictMap), {list=[skin201708092, skin201708091]}(StrictMap)
2017-08-14 21:35:35.675 [http-bio-8081-exec-6] INFO  o.a.c.i.LoggingOutInterceptor [AbstractLoggingInterceptor.java:253] - Outbound Message
blackleech 2017-08-14
  • 打赏
  • 举报
回复
注释都拼接起来 可能是底层ognal的原因吧 你是说
<update id="batchDeletionByListId" parameterType="java.util.List">
应该是listArray对吗
xiaovhao 2017-08-14
  • 打赏
  • 举报
回复

  Integer result = skinManager.batchDeletionByListID(list);
这里不是应该是listArray嘛,还有我很好奇为啥连注释也一起循环拼接上去了
blackleech 2017-08-14
  • 打赏
  • 举报
回复
这个条件是存在的 mybatis中的语句是这样的

<!--批量删除-->
    <update id="batchDeletionByListId" parameterType="java.util.List">
        <foreach collection="list" item="item" index="index" separator=";">
            UPDATE t_skin
            <set>
                is_delete = 1
            </set>
            WHERE
            <if test="_parameter != null">
                skin_id = #{_parameter}
            </if>

        </foreach>
    </update>
blackleech 2017-08-14
  • 打赏
  • 举报
回复
但我 把 Mapper.xml中的批量删除语句修改 成

 <!--批量删除-->
    <update id="batchDeletionByListId" parameterType="java.util.List">
        <foreach collection="list" item="item" index="index" separator=";">
            UPDATE t_skin
            <set>
                is_delete = 1
            </set>
            WHERE
            <if test="_parameter != null">
                skin_id = #{_parameter}
            </if>

        </foreach>
    </update>
将原有的
skin_id = #{item.skinId}
修改为
skin_id = #{_parameter}
,这样后,运行时没有什么提示错误的信息,当数据库中的数据也不进行改动了 不知道怎么正确执行了
天涯若风 2017-08-14
  • 打赏
  • 举报
回复
mybatis批量操作数据库SQL写的有问题。在条件那里。

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧