Mybatis批量更新和插入数据
2017-09-24 16:41
363 查看
batchUpdate
第一种方式
<update id="updateBatch" parameterType="Map"> update aa set a=#{fptm}, b=#{csoftrain} where c in <foreach collection="cs" index="index" item="item" pen="("separator=","close=")"> #{item} </foreach> </update>
但是这种方式修改的字段值都是一样的。
第二种方式
修改数据库连接配置:&allowMultiQueries=true比如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
<update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="" separator=";"> update test <set> test=${item.test}+1 </set> where id = ${item.id} </foreach> </update>
这种方式,可以一次执行多条SQL语句
batchInsert
1、mybatis的官方写法
public void batchInsert1(List<Poi> 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<Poi> 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,定义如下:
<mapper namespace="com.emg.trans.mapper.batchMapper"> <insert id="batchInsert" parameterType="List"> insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values <foreach collection="list" item="poi" index="index" separator="," > (#{poi.tag}, GeomFromText(#{poi.point}), #{poi.poiid}, #{poi.meshid}, #{poi.owner}, #{poi.featcode}, #{poi.sortcode}, #{poi.namec}, #{poi.namee}, #{poi.namep}, #{poi.names}) </foreach> </insert> </mapper>
3、利用spring的事务,直接执行插入操作。
@Transactional("dbTransaction") public void batchInsert3(List<Poi> poilist) throws Exception { for (Poi poi : poilist) { apmapper.insertPoi(poi); } }
推荐 2 > 3 > 1
Spring-JDBC的三种实现
A、用spring事务执行插入操作
@Transactional("dbTransaction") public void batchInsertJDBC1(List<Poi> 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<Poi> poilist) throws DataAccessException { String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)"; List<Object[]> batchArgs = new ArrayList<Object[]>(); 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<Poi> 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
相关文章推荐
- Mybatis批量更新和插入数据
- Mybatis批量插入更新数据
- java结合mybatis批量快速插入数据
- arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 (转)
- PreparedStatement 批量更新,插入数据到Oracle
- mysql 插入/更新数据
- Oracle存储过程实现同步表数据,若存在更新,不存在插入
- EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除
- MySQL学习之插入、删除、更新数据
- Scott Mitchell 的ASP.NET 2.0数据教程之49:用SqlDataSource控件插入、更新、删除数据
- Oracle查询优化-04插入、更新与删除数据
- php daodb插入、更新与删除数据
- mysql数据库中创建、删除、更新、插入数据、等语句
- C#中海量数据的批量插入和更新 [转]
- mysql如果数据不存在,则插入新数据,否则更新的实现方法
- mybatis批量插入数据
- MyBatis批量插入数据
- 《MySQL入门很简单》学习笔记(11)之第11章插入、更新与删除数据(关键词:数据库/MySQL/插入数据/更新数据/删除数据)
- 请问一下,我要向一个表插入数据,根据ID,重复的更新,没有的插入,不使用COUNT后判断,能做到吗?
- Hibernate 插入(更新)不了数据(或者插入(更新)失败)