设为首页 收藏本站
查看: 1017|回复: 0

[经验分享] mybatis 批量操作

[复制链接]

尚未签到

发表于 2016-11-25 07:02:59 | 显示全部楼层 |阅读模式
MyBatis  批量操作
       记录下常用的批量操作,增删改,处理模式一致。
   
         一.批量新增
            1.采用union all  拼接sql,导致问题sql过长,耗时,性能不好,且达到一定量会超出sql长度限制,不推荐
                一般20字段以内的表新增,数据2000条以内可用,经过测试。
      dao层:         

      /***
* 批量新增方法一
*    sql拼接
* @return
*/
public boolean insertMethodOne(List<Map<String,Object>> list){
return sqlSessionTemplate.insert(super.nameSpaces+"insertMethodOne",list)==1;
}
      mapper文件:        

<!-- 批量新增   方法一 (sql内做循环,拼接sql,但sql会越来越长,一定量之后会抛出长度限制的错误,性能也不好,大致是适用2000条以内)-->
<insert id="insertMethodOne" parameterType="List">
insert into gdgk_test_user(id,name,password)
(
<foreach collection="list" item="item" index="index" separator="union all">
select #{item.id,jdbcType=VARCHAR},#{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR}
from dual
</foreach>
)
</insert>
            很多时候我们采用的id是通过序列得到的,所以我们拼接的sql是这样子


<insert id="insertMethodOne" parameterType="List">
<selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="id">
SELECT SLA_SEQUENCE.NEXTVAL FROM DUAL
</selectKey>
insert into gdgk_test_user(id,name,password)
(
<foreach collection="list" item="item" index="index" separator="union all" >
select #{id,jdbcType=DECIMAL},#{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR}
from dual
</foreach>
)
</insert>
             这样问题就出来了,如果数据库做了主键唯一约束,这里就违反了,每次批量新增的时候id不变,永远是第一次从序列里面拿到的,所以解决如下:

<insert id="insertMethodOne" parameterType="List">
insert into gdgk_test_user(id,name,password)
select SLA_SEQUENCE.NEXTVAL,A.* from
(
<foreach collection="list" item="item" index="index" separator="union all" >
select #{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR}
from dual
</foreach>
) A
</insert>
              首先把id放进去,实体里面的东西 不需要带入id的任何属性
             2.采用dao层循环,得到sqlsession  统一commit,推荐
              dao层:        

      /***
* 批量新增方法二
*    dao循环,获取session 统一commit
* @return
*/
public boolean insertMethodTwo(List<Map<String,Object>> list){
SqlSession session = sqlSessionTemplate.getSqlSessionFactory()
.openSession(ExecutorType.BATCH, false);
for (Map<String,Object> rec : list)
sqlSessionTemplate.insert(super.nameSpaces+"insertMethodTwo", rec);
session.commit();
return true;
}
          
            mapper文件:
            

    <!--批量新增   方法二(dao层做循环,推荐)  -->
<insert id="insertMethodTwo" parameterType="Map">
insert into gdgk_test_user(id,name,password)
values (#{id,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR})
</insert>
      
          3.Test类:
           

        @Test
@SuppressWarnings("all")
public void test() {
ApplicationContext con = new ClassPathXmlApplicationContext(
"base.xml", TestMssiSql.class);
UserDaouserDao = con.getBean(UserDao.class);
List<Map<String,Object>> listOne = new ArrayList<>();
for(int i=10;i<14;i++){
Map<String,Object> mapOne = new HashMap<>();
mapOne.put("id", i);
mapOne.put("name", "新增方法一");
mapOne.put("password", "123");
listOne.add(mapOne);
}
userDao.insertMethodOne(listOne);
logger.info("批量新增调用第一个方法完成");
List<Map<String,Object>> listTwo = new ArrayList<>();
for(int i=14;i<18;i++){
Map<String,Object> mapTwo = new HashMap<>();
mapTwo.put("id", i);
mapTwo.put("name", "新增方法二");
mapTwo.put("password", "123");
listTwo.add(mapTwo);
}
userDao.insertMethodTwo(listTwo);
logger.info("批量新增调用第二个方法完成");
}
   
               批量修改一致,可用dao层循环那种法子,批量删除略为不同,每次带入id进行删除,也可采用in的方式拼接sql
        
              dao: 

      /***
* 批量删除
*   只循环id  sql in方式拼接
* @param list
* @return
*/
public boolean deleteBatch(List<String> list){
return sqlSessionTemplate.delete(super.nameSpaces+"deleteBatch",list)==1;
}
       
            mapper文件:    

<!-- 批量删除   -->
<delete id="deleteBatch" parameterType="List">
delete gdgk_test_user
where id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</delete>
        
            Test:

             List<String>  ids = new ArrayList<>();
for(int i=10;i<20;i++){
ids.add(String.valueOf(i));
}
userDao.deleteBatch(ids);
logger.info("批量删除方法完成");
   
    记录一下,方便温习……
             

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305075-1-1.html 上篇帖子: springmvc+mybatis异常 下篇帖子: Mybatis系列(三)简单示例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表