spring批量写入mysql数据库_MyBatis-spring和spring JDBC批量插入Mysql的效率比较
工具框架用spring-batch,數(shù)據(jù)庫(kù)是mysql(未做特殊優(yōu)化)。
比較數(shù)據(jù)框架mybatis和spring jdbc的插入效率。
Mybatis三種實(shí)現(xiàn):
1、mybatis的官方寫法
Java代碼
publicvoidbatchInsert1(List?poilist)throwsException?{
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是一個(gè)bean。
PoiMapper定義:
Java代碼
publicinterfacePoiMapper?{
("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})?")
publicvoidinsertPoi(Poi?poi);
}
2、利用mysql特性,拼寫insert sql。
Java代碼
publicvoidbatchInsert2(List?poilist)throwsException?{
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,定義如下:
Xml代碼
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的事務(wù),直接執(zhí)行插入操作。
Java代碼
@Transactional("dbTransaction")
publicvoidbatchInsert3(List?poilist)throwsException?{
for(Poi?poi?:?poilist)?{
apmapper.insertPoi(poi);
}
}
apmapper是PoiMapper的實(shí)例,用@Autowired配置。
Spring-JDBC的三種實(shí)現(xiàn):
A、用spring事務(wù)執(zhí)行插入操作
Java代碼
@Transactional("dbTransaction")
publicvoidbatchInsertJDBC1(List?poilist)throwsDataAccessException?{
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事務(wù)和springjdbc的batchUpdate
Java代碼
@Transactional("dbTransaction")
publicvoidbatchInsertJDBC2(List?poilist)throwsDataAccessException?{
String?sql?=?"insert?into?tb_poi?(tag,?poi,?poiid,?meshid,?owner,?featcode,?sortcode,?namec,?namee,?namep,?names)?values?(?,?GeomFromText(?),??,??,??,??,??,??,??,??,??)";
List?batchArgs?=?newArrayList();
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事務(wù),利用mysql特性,拼寫insert sql。
Java代碼
@Transactional("dbTransaction")
publicvoidbatchInsertJDBC3(List?poilist)throwsDataAccessException?{
StringBuffer?sqlbuf?=?newStringBuffer()
.append("insert?into?tb_poi?(tag,?poi,?poiid,?meshid,?owner,?featcode,?sortcode,?namec,?namee,?namep,?names)?values?");
MessageFormat?form?=?newMessageFormat("(''{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);
}
測(cè)試一:每次處理100條,共600條。
測(cè)試二:每次處理1000條,共9000條。
直接上結(jié)論:
mybatis.1最慢。而且慢很多,很多。
mybatis.2很快。是mybatis中最快的。
mybatis.3比2慢一點(diǎn)。
jdbc.A比B稍快,兩者差不多,和mybatis.3也在伯仲之間。
jdbc.C最快,比其他5種都快。
大排行,從用時(shí)少到用時(shí)多:
jdbc.C < mybatis.2 < jdbc.A < jdbc.B , mybatis.3 << mybatis.1
總結(jié)
以上是生活随笔為你收集整理的spring批量写入mysql数据库_MyBatis-spring和spring JDBC批量插入Mysql的效率比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IDEA——常用基础设置
- 下一篇: 金额转换java_java金额转换