首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

关于mybatis批量安插和传统的jdbc操作的比较

2012-08-24 
关于mybatis批量插入和传统的jdbc操作的比较今天 在网站上看到了一篇博客,说的是mybatis批量插入的有一些

关于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&amp;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&amp;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   仅供参考,真正在项目中自己去权衡!

热点排行