关于mybatis批量插入和传统的jdbc操作的比较
今天 在网站上看到了一篇博客,说的是mybatis批量插入的有一些问题,于是自己做了一个简单的demo,做了下测试
mybatis测试代码
?
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases> <typeAlias type="com.mybatis.config.User" alias="User" /> </typeAliases>package com.mybatis.config; <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /><!--事务管理驱动 --> <dataSource type="POOLED"><!-- 数据源配置 --> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatistest?useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <mapper resource="UserDaoMapper.xml"/> </mappers></configuration><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- mybatis 映射文件 --><mapper namespace="com.mybatis.config.UserDao"> <cache readOnly="true" /> <insert id="insert" parameterType="User" > insert into user(username,password,comment) values(#{username},#{password},#{comment}) </insert> </mapper>
?
?java测试代码:
?
package com.mybatis.config;import java.io.File;import java.io.FileInputStream;import java.util.Iterator;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.apache.log4j.xml.DOMConfigurator;/** * mybatis测试 * @author CHENLEI * */public class UserDaoTest {public static void main(String[]args){try {userDaoTest();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}} public static void userDaoTest() throws Exception { DOMConfigurator.configure("res/log4j.xml"); File file=Resources.getResourceAsFile("mybatisBase.xml"); SqlSessionFactoryBuilder Factorybuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory=Factorybuilder.build(new FileInputStream(file)); SqlSession session1 = factory.openSession();//普通的操作 SqlSession session2 = factory.openSession(ExecutorType.BATCH, false);//是否自动提交事务 UserDao userDao1 = session1.getMapper(UserDao.class);// UserDao userDao2 = session2.getMapper(UserDao.class);// User user = new User(); user.setUsername("test"); user.setPassword("123456"); user.setComment("comment"); try{ long t1=System.currentTimeMillis(); for(int i=0;i<1000;i++){ userDao2.insert(user); } System.out.println(System.currentTimeMillis()-t1+"ms"); }finally{// session1.commit();// session1.close(); } }}
?运行结果:(结果来自三次测试的结果,取的一个范围,因为外界因素,下同)
?1000次:632---650ms
?
下面是传统的jdbc:
?
?
?
package com.mybatis.config;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class commonjdbcBatch {/** * @param args * @throws SQLException */public static void main(String[] args) throws SQLException {Connection con=null;PreparedStatement s=null;// TODO Auto-generated method stubtry {Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatistest?useUnicode=true&characterEncoding=UTF-8", "root","123456"); con.setAutoCommit(false);//不自动提交 s=con.prepareStatement(" insert into user(username,password,comment) values(?,?,?)");long t1=System.currentTimeMillis(); for(int i=0;i<1000;i++){s.setString(1,"clinux"+i);s.setString(2,"123456");s.setString(3,"comment");s.addBatch();} s.executeBatch();
con.commit();System.out.println(System.currentTimeMillis()-t1+"ms"); s.clearBatch();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{con.close();s.close();}}}?
?
测试1000次结果:
1000次:308---330ms
?
?
所以从上面的测试我们可以看出mybatis的插入速度不及传统的jdbc,用此类框架我们主要是搞j2ee,虽然在性能上面不及,但是稳定,所以这也是一个要权衡的问题;传统的是快,但是用mybatis我们在一些方面上可以不用在造轮子,节约开发时间,当然对于mybatis的用的地方,需要我们在实际的项目中权衡了(或许我们只用mybatis的Mapper,连接池的话我们可以用其他的,譬如bonecp,c3p0),以上仅供研究学习。
?
?
?
?
1 楼 步青龙 2012-06-12 在数据量小的时候和数据量大的时候测试可能结果会反过来,不同的数据量,不同的xxx等,甚至相同的框架,相同的数据量在不同的时候,不同的机器都可能会不同 2 楼 季铵盐 2012-06-13 仅供参考,真正在项目中自己去权衡!