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

猜你喜欢

转载自simon-9527.iteye.com/blog/2337939