批处理数据主要有三种方式:
1.传统jdbc处理 2.mybatis批处理插入 3.使用executortype处理
jdbc 处理
1.通过 for循环插入 main方法如下所示: Connection comm=null; PreparedStatement preparedStatement=null; conn=JdbcUtil.getConnection(); JdbcUtil.begin(conn); String sql="insert into t_user(username,password) values(?,?)"; preparedStatement=conn.preparedStatement(sql); for (int i=0;i<1000;i++) { preparedStatement.setString(1, "hello"+(i+1)); preparedStatement.setString(2, "world"+(i+1)); preparedStatement.executeUpdate(); } JdbcUtil.commit(conn); }
这样就可以进行批量插入
第二种是使用addbatch方法
main方法如下所示: Connection comm=null; PreparedStatement preparedStatement=null; conn=JdbcUtil.getConnection(); JdbcUtil.begin(conn); String sql="insert into t_user(username,password) values(?,?)"; preparedStatement=conn.preparedStatement(sql); for (int i=0;i<1000;i++) { preparedStatement.setString(1, "hello"+(i+1)); preparedStatement.setString(2, "world"+(i+1)); if((i+1)%1000==0){ preparedStatement.addBatch(); preparedStatement.executeBatch(); preparedStatement.clearBatch(); } } JdbcUtil.commit(conn); }
两者差距在效果上后者更好一些。
传统的jdbc对数据的批处理有一些缺点 :比如一直使用的是for循环,会浪费大量的时间在session的连接上,而且java代码和sql语句耦合度很大。
mybatis 在处理数据的时候有两种方式,第一种是使用foreach标签,另一种是使用allowMultiQueries=true来完成。
第一种使用foreach
xml文件内容如下: insert into person(username,email,gender) VALUES <foreach collection="persons" item="person" separator=","> (#{person.username},#{person.email},#{person.gender}) </foreach> java文件如下 SqlSession sqlSession=this.getSqlSessionFactory.opensession(); PerSonMapper personMapper=sqlSession.getMapper(PersonMapper.class); List<Person> persons=new ArrayList<Person>(); for(int i=0;i<5;i++){ Person person=new Person("tom"+i,"email@"+i,"F"); persons.add(person); } personMapper.addPersons(persons) sqlSession.commit(); }
另外一种需要配置文件声明allowMultiQueries=true 然后更改 xml文件中, 为;就可以了
最后一种批量操作的方法是 executortype的方式
1. xml语句
insert into person(username,email,gender) values (#{username},#{email},#{gender})
java语句
SqlSession sqlSession=this.getSqlSessionFactory.opensession(ExecutorType.BATCH); PerSonMapper personMapper=sqlSession.getMapper(PersonMapper.class); for(int i=0;i<5;i++){ personMapper.addPerson(new Person("wang","email@123.com","F")); }