MyBatis-spring和spring JDBC批量插入Mysql的效率比较

工具框架用spring-batch,数据库是mysql(未做特殊优化)。

比较数据框架mybatis和spring jdbc的插入效率。

 

Mybatis三种实现:

1、mybatis的官方写法

Java代码    收藏代码
  1. public void batchInsert1(List<Poi> poilist) throws Exception {  
  2.     SqlSession sqlSession = sqlSessionFactory.getObject().openSession(ExecutorType.BATCH);  
  3.     PoiMapper pmapper = sqlSession.getMapper(PoiMapper.class);  
  4.     try {  
  5.         for (Poi poi : poilist) {  
  6.             pmapper.insertPoi(poi);  
  7.         }  
  8.         sqlSession.commit();  
  9.     } finally {  
  10.         sqlSession.close();  
  11.     }  
  12. }  

 其中Poi是一个bean。

 PoiMapper定义:

Java代码    收藏代码
  1. public interface PoiMapper {  
  2.   
  3.     @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}) ")  
  4.     public void insertPoi(Poi poi);  
  5. }  

 

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

Java代码    收藏代码
  1. public void batchInsert2(List<Poi> poilist) throws Exception {  
  2.     SqlSession sqlSession = sqlSessionFactory.getObject().openSession(ExecutorType.BATCH);  
  3.     try {  
  4.         sqlSession.insert("com.emg.trans.mapper.batchMapper.batchInsert", poilist);  
  5.         sqlSession.commit();  
  6.     } finally {  
  7.         sqlSession.close();  
  8.     }  
  9. }  

 

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

Xml代码    收藏代码
  1. <mapper namespace="com.emg.trans.mapper.batchMapper">  
  2.   <insert id="batchInsert" parameterType="List">  
  3.     insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values  
  4.     <foreach collection="list" item="poi" index="index" separator="," >  
  5.          (#{poi.tag}, GeomFromText(#{poi.point}), #{poi.poiid}, #{poi.meshid}, #{poi.owner}, #{poi.featcode}, #{poi.sortcode}, #{poi.namec}, #{poi.namee}, #{poi.namep}, #{poi.names})  
  6.     </foreach>  
  7.   </insert>  
  8. </mapper>  

 

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

Java代码    收藏代码
  1. @Transactional("dbTransaction")  
  2. public void batchInsert3(List<Poi> poilist) throws Exception {  
  3.     for (Poi poi : poilist) {  
  4.         apmapper.insertPoi(poi);  
  5.     }  
  6. }  

 apmapper是PoiMapper的实例,用@Autowired配置。

 

 

Spring-JDBC的三种实现:

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

Java代码    收藏代码
  1. @Transactional("dbTransaction")  
  2. public void batchInsertJDBC1(List<Poi> poilist) throws DataAccessException {  
  3.     String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)";  
  4.     for (Poi poi : poilist) {  
  5.         Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec(),  
  6.                 poi.getNamee(), poi.getNamep(), poi.getNames()};  
  7.         jdbcTemplate.update(sql, args);   
  8.     }  
  9. }  

 

B、用spring事务和springjdbc的batchUpdate

Java代码    收藏代码
  1. @Transactional("dbTransaction")  
  2. public void batchInsertJDBC2(List<Poi> poilist) throws DataAccessException {  
  3.     String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)";  
  4.     List<Object[]> batchArgs = new ArrayList<Object[]>();  
  5.     for (Poi poi : poilist) {  
  6.         Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec(),  
  7.                 poi.getNamee(), poi.getNamep(), poi.getNames()};  
  8.         batchArgs.add(args);  
  9.     }  
  10.     jdbcTemplate.batchUpdate(sql, batchArgs);  
  11. }  

 

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

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

 

测试一:每次处理100条,共600条。

测试二:每次处理1000条,共9000条。

直接上结论:

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

转载:http://toplchx.iteye.com/blog/1988254

 

你可能感兴趣的:(spring,jdbc)