博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis批量更新和插入数据
阅读量:6711 次
发布时间:2019-06-25

本文共 5068 字,大约阅读时间需要 16 分钟。

  hot3.png

batchUpdate

第一种方式

update aa set a=#{fptm}, b=#{csoftrain} where c in
#{item}

但是这种方式修改的字段值都是一样的。

第二种方式

修改数据库连接配置:&allowMultiQueries=true

比如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true

update test
test=${item.test}+1
where id = ${item.id}

这种方式,可以一次执行多条SQL语句

batchInsert

1、mybatis的官方写法

public void batchInsert1(List
poilist) throws Exception { SqlSession sqlSession = sqlSessionFactory.getObject().openSession(ExecutorType.BATCH); PoiMapper pmapper = sqlSession.getMapper(PoiMapper.class); try { for (Poi poi : poilist) { pmapper.insertPoi(poi); } sqlSession.commit(); } finally { sqlSession.close(); } }

 其中Poi是一个bean。PoiMapper定义:

public interface PoiMapper {        @Insert("insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (#{tag}, GeomFromText(#{point}), #{poiid}, #{meshid}, #{owner}, #{featcode}, #{sortcode}, #{namec}, #{namee}, #{namep}, #{names}) ")      public void insertPoi(Poi poi);  }

2、利用mysql特性,拼写insert sql。

public void batchInsert2(List
poilist) throws Exception { SqlSession sqlSession = sqlSessionFactory.getObject().openSession(ExecutorType.BATCH); try { sqlSession.insert("com.emg.trans.mapper.batchMapper.batchInsert", poilist); sqlSession.commit(); } finally { sqlSession.close(); } }

 “com.emg.trans.mapper.batchMapper.batchInsert”在mybatis的xml中定义的sql,定义如下:

insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values
(#{poi.tag}, GeomFromText(#{poi.point}), #{poi.poiid}, #{poi.meshid}, #{poi.owner}, #{poi.featcode}, #{poi.sortcode}, #{poi.namec}, #{poi.namee}, #{poi.namep}, #{poi.names})

3、利用spring的事务,直接执行插入操作。

@Transactional("dbTransaction")  public void batchInsert3(List
poilist) throws Exception { for (Poi poi : poilist) { apmapper.insertPoi(poi); } }

推荐 2 > 3 > 1

Spring-JDBC的三种实现

A、用spring事务执行插入操作

@Transactional("dbTransaction")  public void batchInsertJDBC1(List
poilist) throws DataAccessException { String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)"; for (Poi poi : poilist) { Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec(), poi.getNamee(), poi.getNamep(), poi.getNames()}; jdbcTemplate.update(sql, args); } }

B、用spring事务和springjdbc的batchUpdate

@Transactional("dbTransaction")  public void batchInsertJDBC2(List
poilist) throws DataAccessException { String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)"; List
batchArgs = new ArrayList
(); for (Poi poi : poilist) { Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec(), poi.getNamee(), poi.getNamep(), poi.getNames()}; batchArgs.add(args); } jdbcTemplate.batchUpdate(sql, batchArgs); }

C、用spring事务,利用mysql特性,拼写insert sql

@Transactional("dbTransaction")  public void batchInsertJDBC3(List
poilist) throws DataAccessException { StringBuffer sqlbuf = new StringBuffer() .append("insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values "); MessageFormat form = new MessageFormat("(''{0}'', GeomFromText(''{1}''), ''{2}'', ''{3}'', ''{4}'', ''{5}'', ''{6}'', ''{7}'', ''{8}'', ''{9}'', ''{10}''),"); for (Poi poi : poilist) { Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec().replaceAll("'", "\\\\'"), poi.getNamee().replaceAll("'", "\\\\'"), poi.getNamep().replaceAll("'", "\\\\'"), poi.getNames().replaceAll("'", "\\\\'")}; sqlbuf.append(form.format(args)); } String sql = sqlbuf.toString(); sql = sql.substring(0, sql.length()-1); jdbcTemplate.update(sql); }

mybatis.1最慢。而且慢很多,很多。

mybatis.2很快。是mybatis中最快的。
mybatis.3比2慢一点。
jdbc.A比B稍快,两者差不多,和mybatis.3也在伯仲之间。
jdbc.C最快,比其他5种都快。

大排行,从用时少到用时多:jdbc.C < mybatis.2 < jdbc.A < jdbc.B , mybatis.3 << mybatis.1

转载于:https://my.oschina.net/mywiki/blog/1542520

你可能感兴趣的文章
Spring Boot cache backed redis
查看>>
有趣的编程----控制自己电脑的CPU
查看>>
linux的目录结构
查看>>
Java中创建对象的5种不同方法
查看>>
Supervisor安装
查看>>
自建框架知识点一命名空间和自动加载
查看>>
21_css布局2_浮动布局.html
查看>>
DateUtils 单元下的公用函数目录
查看>>
构建高效安全的Nginx Web服务器
查看>>
单播,多播,广播的区分
查看>>
jQuery 练习[二]: 获取对象(1) - 基本选择与层级
查看>>
WinAPI: EqualRect、EqualSid、EqualPrefixSid - 判断一个矩形(或其他结构)是否相等
查看>>
ETag
查看>>
【Kafka】《Kafka权威指南》——提交和偏移量
查看>>
GNS3桥接真机网卡
查看>>
Web服务之LNMMP架构及动静分离实现
查看>>
centos6.4搭建zabbix
查看>>
Nginx+Keepalived实现
查看>>
安装python的easy_install和pip
查看>>
android SQLite
查看>>