Mybatis与jdbc批量插入的比较 ---- 2016-11-14

主要测试批量插入是,jdbc与mybatis的速度差异。
mybatis测试代码

 

Xml代码  
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  4.   
  5.   
  6. <configuration>  
  7. <typeAliases>  
  8.         <typeAlias type="com.mybatis.config.User"  
  9.             alias="User" />  
  10.     </typeAliases>package com.mybatis.config;  
  11.     <environments default="development">  
  12.         <environment id="development">  
  13.             <transactionManager type="JDBC" /><!--事务管理驱动  -->  
  14.             <dataSource type="POOLED"><!-- 数据源配置 -->  
  15.                 <property name="driver" value="com.mysql.jdbc.Driver" />  
  16.                 <property name="url" value="jdbc:mysql://localhost:3306/mybatistest?useUnicode=true&amp;characterEncoding=UTF-8" />  
  17.                 <property name="username" value="root" />  
  18.                 <property name="password" value="123456" />  
  19.             </dataSource>  
  20.         </environment>  
  21.     </environments>  
  22.     <mappers>  
  23.         <mapper resource="UserDaoMapper.xml"/>  
  24.     </mappers>  
  25. </configuration>  
  26. <?xml version="1.0" encoding="UTF-8" ?>    
  27. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">   
  28.   
  29. <!-- mybatis 映射文件 -->  
  30. <mapper namespace="com.mybatis.config.UserDao">  
  31.      
  32.      <cache readOnly="true" />  
  33.        
  34.      <insert id="insert" parameterType="User" >  
  35.         insert into user(username,password,comment) values(#{username},#{password},#{comment})  
  36.     </insert>  
  37.       
  38.     
  39.       
  40. </mapper>  

 

 java测试代码:

 

Java代码  
  1. package com.mybatis.config;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.util.Iterator;  
  6. import java.util.List;  
  7.   
  8. import org.apache.ibatis.io.Resources;  
  9. import org.apache.ibatis.session.ExecutorType;  
  10. import org.apache.ibatis.session.SqlSession;  
  11. import org.apache.ibatis.session.SqlSessionFactory;  
  12. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  13. import org.apache.log4j.xml.DOMConfigurator;  
  14.   
  15.   
  16. /** 
  17.  * mybatis测试 
  18.  * @author CHENLEI 
  19.  * 
  20.  */  
  21. public class UserDaoTest {  
  22.       
  23.     public static void main(String[]args){  
  24.           
  25.         try {  
  26.             userDaoTest();  
  27.         } catch (Exception e) {  
  28.             // TODO Auto-generated catch block  
  29.             e.printStackTrace();  
  30.         }  
  31.           
  32.     }  
  33.   
  34.     public static void userDaoTest() throws Exception  
  35.     {  
  36.         DOMConfigurator.configure("res/log4j.xml");  
  37.         File file=Resources.getResourceAsFile("mybatisBase.xml");  
  38.         SqlSessionFactoryBuilder Factorybuilder = new SqlSessionFactoryBuilder();  
  39.         SqlSessionFactory factory=Factorybuilder.build(new FileInputStream(file));  
  40.          
  41.         SqlSession session1 = factory.openSession();//普通的操作  
  42.         SqlSession session2 = factory.openSession(ExecutorType.BATCH, false);//是否自动提交事务  
  43.           
  44.         UserDao userDao1 = session1.getMapper(UserDao.class);//  
  45.         UserDao userDao2 = session2.getMapper(UserDao.class);//  
  46.           
  47.         User user = new User();  
  48.         user.setUsername("test");  
  49.         user.setPassword("123456");  
  50.         user.setComment("comment");  
  51.         try{  
  52.               
  53.             long t1=System.currentTimeMillis();  
  54.             for(int i=0;i<1000;i++){  
  55.                  userDao2.insert(user);  
  56.             }  
  57.             System.out.println(System.currentTimeMillis()-t1+"ms");  
  58.               
  59.   
  60.                
  61.         }finally{  
  62. //           session1.commit();  
  63. //             session1.close();  
  64.         }  
  65.          
  66.     }  
  67.   
  68. }  

 运行结果:(结果来自三次测试的结果,取的一个范围,因为外界因素,下同)

 1000次:632---650ms

 

下面是传统的jdbc:

 

 

 

Java代码  
  1. package com.mybatis.config;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.SQLException;  
  7.   
  8. public class commonjdbcBatch {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      * @throws SQLException  
  13.      */  
  14.     public static void main(String[] args) throws SQLException {  
  15.         Connection con=null;  
  16.         PreparedStatement s=null;  
  17.         // TODO Auto-generated method stub  
  18.             try {  
  19.                 Class.forName("com.mysql.jdbc.Driver");  
  20.                  con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatistest?useUnicode=true&amp;characterEncoding=UTF-8", "root","123456");  
  21.                  con.setAutoCommit(false);//不自动提交  
  22.                  s=con.prepareStatement(" insert into user(username,password,comment) values(?,?,?)");  
  23.                 long t1=System.currentTimeMillis();  
  24.                  for(int i=0;i<1000;i++){  
  25.                     s.setString(1,"clinux"+i);  
  26.                     s.setString(2,"123456");  
  27.                     s.setString(3,"comment");  
  28.                     s.addBatch();  
  29.                 }  
  30.                  s.executeBatch();  
Java代码   收藏代码
  1.                          con.commit();  
  2.             System.out.println(System.currentTimeMillis()-t1+"ms");  
  3.                 s.clearBatch();  
  4.         } catch (ClassNotFoundException e) {  
  5.             // TODO Auto-generated catch block  
  6.             e.printStackTrace();  
  7.         }finally{  
  8.             con.close();  
  9.             s.close();  
  10.         }  
  11.           
  12. }  

 

 

测试1000次结果:

1000次:308---330ms

 

 

所以从上面的测试我们可以看出mybatis的插入速度不及传统的jdbc,用此类框架我们主要是搞j2ee,虽然在性能上面不及,但是稳定,所以这也是一个要权衡的问题;传统的是快,但是用mybatis我们在一些方面上可以不用在造轮子,节约开发时间,当然对于mybatis的用的地方,需要我们在实际的项目中权衡了(或许我们只用mybatis的Mapper,连接池的话我们可以用其他的,譬如bonecp,c3p0),以上仅供研究学习。

原文链接:http://13638363871-163-com.iteye.com/blog/1549465

### 回答1: Mybatis-Plus提供了多种方式进行批量插入优化,以下是几种常用的方法: 1. 使用Mybatis-Plus提供的BatchInsert方法进行批量插入,可以大大减少SQL语句的执行次数,提高插入效率。 2. 使用Mybatis-Plus提供的BatchInsertMappedStatement方法进行批量插入,可以将多个插入操作合并为一个SQL语句,减少数据库的IO操作,提高插入效率。 3. 使用Mybatis-Plus提供的BatchInsertSelective方法进行批量插入,可以只插入非空字段,减少插入的数据量,提高插入效率。 4. 使用Mybatis-Plus提供的BatchInsertOrUpdate方法进行批量插入或更新,可以根据主键进行判断,如果存在则更新,不存在则插入,提高插入效率。 总之,Mybatis-Plus提供了多种方式进行批量插入优化,可以根据具体的业务需求选择合适的方法进行优化,提高插入效率。 ### 回答2: Mybatis-Plus是一款优秀的ORM框架,通过简化SQL,并提供了便捷的CRUD操作,为Java开发者提供了方便快捷的开发体验。在数据量较大的情况下,批量插入优化是一个非常关键的技术点。下面我们来谈谈Mybatis-Plus如何进行批量插入的优化。 1、使用自增主键 - 我们可以将主键设置为自增类型,这样就可以通过Mybatis-Plus自动生成主键,避免在批量插入时多次查询主键。 2、使用BatchExecutor - Mybatis-Plus提供了BatchExecutor来执行批量插入操作,这样可以避免在单条插入过程中频繁的开启和关闭数据库连接,从而提高了效率。 3、使用JDBC Batch - 在使用BatchExecutor的时候,我们可以选择使用JDBC Batch机制,这样可以将多个SQL语句存放到一个批处理中,然后一次性执行。通过这种方式可以大大减少与数据库交互的次数。 4、使用Mybatis-Plus自带的批量插入方法 - Mybatis-Plus提供了一个批量插入方法,可以在一次SQL语句中同时插入多条数据。使用该方法会显著提高数据插入效率。 5、适当分批 - 如果我们需要插入的数据量巨大,即使使用了批量插入的方式,也会出现内存溢出等问题。这时候我们可以将数据集合分成若干个小批次,每次只处理部分数据,最后再合并成一条记录。这样既可以保证数据的完整性,还可以避免出现问题。 以上就是Mybatis-Plus批量插入优化的常见策略,通过优化可以大幅提升插入效率,并节省数据库资源。 ### 回答3: mybatis-plus是基于mybatis二次开发的一个ORM框架,提供了很多实用的增删改查方法,方便了开发人员的工作。其中一个常见的需求就是批量插入数据,因为单条插入数据效率低下,会导致数据库连接大量占用,影响系统性能。因此,如何优化mybatis-plus的批量插入就成为了开发人员需要关注的一个问题。 mybatis-plus提供了两种方式进行批量操作:insertBatch和insertBatchSomeColumn。insertBatch是完全插入,即将所有的属性都插入到数据库中,而insertBatchSomeColumn则可以选择要插入的属性,只将选择的属性插入到数据库中。下面我们具体介绍一下如何优化这两种批量插入方式。 对于insertBatch,我们可以通过三种方式进行优化: 1.使用JDBC批处理:在使用insertBatch方法时,mybatis-plus会为每一条数据都生成一条插入语句,这显然会消耗大量的数据库连接资源。因此我们可以通过JDBC批处理,批量生成插入语句,减少数据库连接的占用。 2.使用mybatis-plus的插件:mybatis-plus提供了一个BatchInsertPlugin插件,可以将多条插入语句合并为一条,从而减少数据库连接的占用。 3.调整批处理大小:mybatis-plus默认的批处理大小是1000,我们可以根据实际情况调整该值,从而达到更好的性能优化效果。 对于insertBatchSomeColumn,我们可以通过两种方式进行优化: 1.使用mybatis-plus的插件:mybatis-plus提供了一个BatchInsertColumnSomePlugin插件,可以将多条插入语句合并为一条,从而减少数据库连接的占用。 2.调整批处理大小:和insertBatch相同,我们也可以根据实际情况调整批处理大小,从而达到更好的性能优化效果。 综合来说,通过JDBC批处理、mybatis-plus插件和调整批处理大小等方式,可以有效地优化mybatis-plus的批量插入性能,提高系统的整体性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值