我决定尝试使用mybatis进行一个新项目.我非常熟悉sql,而且我最近对hibernate有一些不好的经历,所以我正在寻找一个更低级别的DAO方法.

似乎相当不错,除了一件事,那就是处理集合.

我有两个POJO,组和用户,它们是多对多的.我已经决定了一个设计理念,一个拥有集合的POJO只能在保存时更新表之间的M-M关系.因此,例如,当我保存具有用户集合的组对象时,设计原理决定了用户应该已经被保存,并且我只需要在数据库中保存组和group_user关系.

所以,对于接口中的saveGroup函数,我为mybatis做了这个XML映射:

<insert id="saveGroup" keyColumn="id"
    parameterType="se.myapp.domain.Group">
    <choose>
        <when test="id == null">
        INSERT INTO myapp_group (name,description)
        VALUES
        (#{username},#{password});
        </when>
        <otherwise>
        UPDATE myapp_group set name=#{name},description=#{description}
        where id=#{id};
        </otherwise>
    </choose>

    <if test="users != null">
        create temporary table tmpnewgroups (group_id integer,user_id integer);

        insert into tmpnewgroups (group_id,user_id) values (
        <foreach collection="users" item="user" open="" close="" separator="),()">
             #{id},#{user.id}
        </foreach>
        );

        insert into myapp_user_group(group_id,user_id) 
        select tmp.group_id,tmp.user_id 
        from tmpnewgroups tmp 
        left outer join myapp_user_group ug 
            on ug.group_id = tmp.group_id and ug.user_id = tmp.user_id
        where ug.group_id is null;

        delete from myapp_user_group 
        where group_id = #{id} and user_id not in (select user_id from tmpnewgroups);
    </if>

</insert>

这将按照预期的方式工作(插入/更新组,将用户的集合保存为数据库中的关系).但是我并不觉得这是最好的做法.应用程序是为了使我可以切换到休眠状态,如果需要,所以最好保存收集的逻辑应该在数据库层.在mybatis有没有一些“魔法”,我不知道可以简化这样的操作吗?

有什么想法如何改善这个?或者我应该重新思考应用程序设计,并将集合的处理进一步放在模型中?

解决方法

您的saveGroup数据映射操作的第二部分确实是重新思考您的应用程序设计的一个原因.将内存中的用户集合持久化到临时表以将其与持久化的用户对象进行比较,以便插入和删除三角形是一个相当繁重的操作,如果只需要更新组的名称或描述,则根本不需要,即当没有三角洲时.这种情况是否可以由数据库服务器(您当前的解决方案)或数据库客户端(您的应用程序)决定.

除了组和可能的用户需要首次插入的情况外,如果希望应用程序决定是否需要更新链接表,那么您的应用程序需要知道用户集合是否已更改,因为它从数据库中检索.不幸的是,MyBatis不会帮助你的应用程序.

看到,与Hibernate相比,MyBatis在MyBatis完成工作后幸免地不了解你的对象和他们携带的状态,这是数据映射,而不是对象关系映射. Hibernate可以自动检测所谓的脏状态的对象,MyBatis不能,因为这不是其作业描述的一部分.所以你会留给自己的设备.

一个超简单的方法是在选择之后存储用户的哈希码,并检查该哈希码是否使用称为isUserDirty()的方法进行更改.您可以使用< if test =“isUserDirty”>从映射中简单地测试该条件.这当然不是一个非常通用的方法,而是依赖于一个体面的hashCode()实现.看一下leonbloy的answer类似的一个更通用的方法的问题.当然这可能还是太简单了,特别是因为我们谈论了很多关系.哪种方法最好取决于你的情况.

现在你应该知道该怎么做祝你好运!

PS而不是插入和删除增量我会建议一个简单的覆盖:删除所有然后插入所有在一个事务.您的临时表策略是一个优化策略,实际上可能实际上不会提高数据库的性能,实际上我的猜测是可能会更糟.如果您对此策略进行了正确的分析,并且知道您正在做什么,您可能会忽略此后记.

java – 用mybatis保存/更新集合,常见的做法是什么?的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. AmazeUI 折叠面板的实现代码

    这篇文章主要介绍了AmazeUI 折叠面板的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  7. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. html5唤起app的方法

    这篇文章主要介绍了html5唤起app的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5拍照和摄像机功能实战详解

    这篇文章主要介绍了HTML5拍照和摄像机功能实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部