Java实现mybatis批量插入数据到Oracle_java

最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式;
 结合网上资料,写了个小demo,文章末尾附上demo下载地址 

1、新建项目:项目目录结构如下图所示,添加相应的jar包

2、新建数据库表:ACCOUNT_INFO

CREATE TABLE ACCOUNT_INFO (
 "ID" NUMBER(12) NOT NULL ,
 "USERNAME" VARCHAR2(64 BYTE) NULL ,
 "PASSWORD" VARCHAR2(64 BYTE) NULL ,
 "GENDER" CHAR(1 BYTE) NULL ,
 "EMAIL" VARCHAR2(64 BYTE) NULL ,
 "CREATE_DATE" DATE NULL
)

3、创建AccountInfo实体类:

package com.oracle.entity;

import java.sql.Date;

public class AccountInfo {
 private Long id;
 private String userName;
 private String password;
 private String gender;
 private String email;
 private Date createDate;

 public Long getId() {
 return id;
 }

 public void setId(Long id) {
 this.id = id;
 }

 public String getUserName() {
 return userName;
 }

 public void setUserName(String userName) {
 this.userName = userName;
 }

 public String getPassword() {
 return password;
 }

 public void setPassword(String password) {
 this.password = password;
 }

 public String getGender() {
 return gender;
 }

 public void setGender(String gender) {
 this.gender = gender;
 }

 public String getEmail() {
 return email;
 }

 public void setEmail(String email) {
 this.email = email;
 }

 public Date getCreateDate() {
 return createDate;
 }

 public void setCreateDate(Date createDate) {
 this.createDate = createDate;
 }

 @Override
 public String toString() {
 return "AccountInfo [id=" + id + ", userName=" + userName
 + ", password=" + password + ", gender=" + gender + ", email="
 + email + ", createDate=" + createDate + "]";
 }

}

4、新建接口映射类:AccountInfoMapper.java

package com.oracle.mapper;

import java.util.List;

import com.oracle.entity.AccountInfo;

public interface AccountInfoMapper {
 /**
 * 查询所有的数据
 * @return
 */
 List<AccountInfo> queryAllAccountInfo();

 /**
 * 批量插入数据
 *
 * @param accountInfoList
 * @return
 */
 int batchInsertAccountInfo(List<AccountInfo> accountInfoList);
}

5、创建mybatis配置文件:mybatis-configuration.xml 

<?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>
 <environments default="development">
 <environment id="development">
 <transactionManager type="JDBC" />
 <dataSource type="POOLED">
 <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
 <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
 <property name="username" value="xxx" />
 <property name="password" value="xxx" />
 </dataSource>
 </environment>
 </environments>
 <mappers>
 <mapper resource="config/AccountInfoMapper.xml" />
 </mappers>
</configuration>

6、创建接口映射配置文件:AccountInfoMapper.xml
 Oracle的批量插入数据库跟MySQL不一样,
 MySQL:
 

复制代码 代码如下:

 INSERT INTO ACCOUNT_INFO(ID, USERNAME,PASSWORD,GENDER, EMAIL,CREATE_DATE)values(,,,,,,)(,,,,,,,)

Oracle:
 
复制代码 代码如下:

INSERT INTO ACCOUNT_INFO(ID, USERNAME,PASSWORD,GENDER, EMAIL,CREATE_DATE) (select 1,,,,,, from dual union all select 1,,,,,, from dual)
 

<?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">
<mapper namespace="com.oracle.mapper.AccountInfoMapper"><!-- 接口的全类名 -->
 <!-- type:实体类的全类名 -->
 <resultMap id="BaseResultMap" type="com.oracle.entity.AccountInfo">
 <id column="ID" property="id" jdbcType="DECIMAL" />
 <result column="USERNAME" property="userName" jdbcType="VARCHAR" />
 <result column="PASSWORD" property="password" jdbcType="VARCHAR" />
 <result column="GENDER" property="gender" jdbcType="CHAR" />
 <result column="EMAIL" property="email" jdbcType="VARCHAR" />
 <result column="CREATE_DATE" property="createDate" jdbcType="DATE" />
 </resultMap>
 <!-- id 跟接口中的方法名称保持一致 -->
 <select id="queryAllAccountInfo" resultMap="BaseResultMap">
 select ID,
 USERNAME,PASSWORD,
 GENDER, EMAIL, CREATE_DATE from ACCOUNT_INFO
 </select>
 <insert id="batchInsertAccountInfo" parameterType="java.util.List">
 INSERT INTO ACCOUNT_INFO(ID, USERNAME,PASSWORD,GENDER, EMAIL,CREATE_DATE)
 (
 <foreach collection="list" index="" item="accountInfo"
 separator="union all">
 select
 #{accountInfo.id},
 #{accountInfo.userName},
 #{accountInfo.password},
 #{accountInfo.gender},
 #{accountInfo.email},
 #{accountInfo.createDate}
 from dual
 </foreach>
 )
 </insert>
</mapper>

7、编写测试类:

package com.oracle.test;

import java.io.InputStream;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.oracle.entity.AccountInfo;
import com.oracle.mapper.AccountInfoMapper;

public class MybatisTest {
 public static void main(String[] args) throws Exception {
 String resource = "config/mybatis-configuration.xml";
 InputStream inputStream = Resources.getResourceAsStream(resource);
 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
 .build(inputStream);
 SqlSession session = sessionFactory.openSession();
 AccountInfoMapper mapper = session.getMapper(AccountInfoMapper.class);
 List<AccountInfo> accountInfoList = mapper.queryAllAccountInfo();
 if (accountInfoList == null) {
 System.out.println("The result is null.");
 } else {
 for (AccountInfo personInfo : accountInfoList) {
 System.out.println(personInfo);
 }
 }
 mapper.batchInsertAccountInfo(generateData());
 session.commit();
 }

 static List<AccountInfo> generateData(){
 List<AccountInfo> result = new ArrayList<AccountInfo>();
 AccountInfo account = new AccountInfo();
 account.setId(3L);
 account.setUserName("zhangsanfeng");
 account.setPassword("123456");
 account.setGender("1");
 account.setEmail("zhangsanfeng@wudang.com");
 account.setCreateDate(new Date(System.currentTimeMillis()));
 result.add(account);

 account = new AccountInfo();
 account.setId(4L);
 account.setUserName("zhouzhiruo");
 account.setPassword("zhangwuji");
 account.setGender("0");
 account.setEmail("zhouzhiruo@emei.com");
 account.setCreateDate(new Date(System.currentTimeMillis()));
 result.add(account);

 account = new AccountInfo();
 account.setId(5L);
 account.setUserName("zhaomin");
 account.setPassword("zhangwuji");
 account.setGender("0");
 account.setEmail("zhaomin@yuan.com");
 account.setCreateDate(new Date(System.currentTimeMillis()));
 result.add(account);
 return result;
 }
}

源码下载:http://xiazai.jb51.net/201606/yuanma/java-oracle(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, oracle
, mybatis
批量
oracle mybatis 批量、mybatis实现批量删除、mybatis实现批量更新、java mybatis批量更新、java oracle 批量更新,以便于您获取更多的相关知识。

时间: 2024-07-29 16:57:09

Java实现mybatis批量插入数据到Oracle_java的相关文章

使用mybatis批量插入数据的问题

问题描述 使用mybatis批量插入数据的问题 mybatis配置文件如下:插入的为集合中的数据,当集合中只有一条数据时可以插入进去,但是当一条以上数据时将会报错 <insert id="batchInsert" parameterType="java.util.List"> <selectKey keyProperty="waybillNo" order="BEFORE" resultType="

mybatis sql-参数list对象结果如何使用mybatis批量插入数据

问题描述 参数list对象结果如何使用mybatis批量插入数据 使用mybatis oracle,当传来的参数是list对象结果集,如何批量插入数据 解决方案 解决方案二: <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> <!-- 表的序列查询 --> select TABLE_SEQ.NEXTVAL from

java实现jdbc批量插入数据_java

首先介绍三种JDBC批量插入编程方法,进行比较,具体内容如下 JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一:使用PreparedStatement加批量的方法 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(o_url, userName, pass

mybatis 带序列批量插入数据

问题描述 mybatis 带序列批量插入数据 我的mybatis批量插入,报oracle 的未明确列错误,求大神帮忙看看,以下是mybatis的配置文件 insert into ( container_id, parent_id, container_name, total_well_count, empty_well_count, sort, is_box, xNumber, yNumber, remarks, creat_time, creator, last_modify_person,

MyBatis批量插入(insert)数据操作_java

在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来. 实体类TrainRecord结构如下: public class TrainRecord implements Serializable { private static final long serialVersionUID = -12069604621179

Mybatis批量插入唯一索引冲突解决方法

问题描述 Mybatis批量插入唯一索引冲突解决方法 这个问题是批量插入的时候的防重处理,Spring MVC+myIbatis做批量数据插入,因为 需要插入的表的数据量很大,而且要插入的数据很多,要分很多批次进行插入,且为了追求效率,所以不可能对每一条都做是否在数据库中存在唯一键是否存在的校验处理,有没有相关的处理方案可供分析? 解决方案 如果输mysql数据库就直接插入不指定主键就ok了吧,oracle就使用序列 解决方案二: 不指定主键呢?需要主键么 解决方案三: 唯一键是否存在的校验处理

mysql使用mybatis批量添加数据,返回主键

问题描述 mysql使用mybatis批量添加数据,返回主键 mysql使用mybatis批量添加,使用各种方法都无法返回对应的主键,请兄弟们不吝赐教 解决方案 该功能无法实现,只能分步骤来,先插入在查询 解决方案二: 批量添加还要返回主键??这个不太可能吧.最多也就返回插入的条数.如果返回主键,那不是了返回一个list然后里面放主键?一条一条插入倒是可以返回主键 解决方案三: 分步骤来,先插入在查询

Mybatis批量删除数据操作方法_java

MyBatis的作用我想不用多说,今天说说MyBatis中的批量删除操作.废话不多说,先给大家一段代码片段!  <delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id in <foreach collection="array" item="standardId" open="(" close=&qu

codeigniter框架批量插入数据

 本文介绍codeigniter框架批量插入数据的实例,优化了其中的插入算法,大家参考使用吧   代码如下: $sub_form = array();   $loop = 0;   $ins_loop = 0;   $sum = count($form_datas);   $this->logger->info('insert data total:'.$sum);   //使用事物批量导入有助于提高插入效率   $callStartTime = microtime(true);   $thi