MyBatis-spring和spring JDBC批量插入Mysql的效率比较
来源:互联网 发布:linux 启动 编辑:程序博客网 时间:2024/06/06 10:40
工具框架用spring-batch,数据库是mysql(未做特殊优化)。
比较数据框架mybatis和spring jdbc的插入效率。
Mybatis三种实现:
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);
- }
- }
apmapper是PoiMapper的实例,用@Autowired配置。
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);
- }
测试一:每次处理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
0 0
- MyBatis-spring和spring JDBC批量插入Mysql的效率比较
- MyBatis-spring和spring JDBC批量插入Mysql的效率比较
- MyBatis-spring和spring JDBC批量插入Mysql的效率比较
- MyBatis-spring和spring JDBC批量插入Mysql的效率比较
- MyBatis-spring和spring JDBC批量插入Mysql的效率比较
- mysql 批量插入与单条插入 的效率比较
- maven下Spring,Spring mvc整合MyBatis的配置总结和批量操作的效率测试
- Spring Jdbc Template 与 MyBatis 的比较 开发效率与优缺点
- 关于mybatis批量插入和传统的jdbc操作的比较
- Spring整合MyBatis批量插入
- spring jdbc 批量插入或者批量更新
- MySQL数据库批量插入(Spring Boot+Mybatis)
- JDBC/Spring/MyBatis性能比较
- JDBC / Spring / MyBatis 性能比较
- spring mybatis组合下对oracle的批量插入
- mybatis在spring中使用批量插入
- spring springmvc mybatis 整合批量操作,批量更新,批量插入
- spring--jdbc的批量操作
- 用map实现邮箱地址分离
- 饮食——食物
- jsoup数据抓取学习
- activity堆栈式管理
- Oracle数据库中对null值的排序及mull与空字符串的区别
- MyBatis-spring和spring JDBC批量插入Mysql的效率比较
- leetcode 198.213.337 House Robber
- JavaScript 语法简单描述
- transitionend animationend 事件兼容问题
- MySQL(基础篇)之存储过程
- How do I add new state and change the workflow of Purchase Order?
- List合并具有相同属性的对象
- Android开发中混淆代码总结
- 杭电OJ 2136 Largest prime factor