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

最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式;
 结合网上资料,写了个小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

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

(0)

相关推荐

  • oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

    最近做项目遇到一个挺纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰. 先来看一下最终我是怎么实现的: <insert id="batchInsertLine" parameterType="HashMap"> <![CDATA[ INSERT INTO tg_fcst_lines(${lineColumn}) select result.*,sq_fcst_lines.next

  • Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

    最近做一个批量导入的需求,将多条记录批量插入数据库中. 解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入.期间遇到了"SQL 命令未正确结束 "的错误,最终解决,记录下来供以后查阅和学习. 首先,在网上参考了有关Mybatis的foreach insert的资料,具体如下: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach

  • 深入浅析mybatis oracle BLOB类型字段保存与读取

    一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用来存储大量二进制数据的:CLOB用来存储大量文本数据.BLOB通常用来保存图片.文件等二进制类型的数据. 二.使用mybatis操作blob 1.表结构如下: create table BLOB_FIELD ( ID VARCHAR2(64 BYTE) not null, TAB_NAME VARC

  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    Oracle和MySQL数据库的批量update在mybatis中配置不太一样: oracle数据库: <code class="hljs tcl" style=""><<span class="hljs-keyword" style="">update</span> id=<span class="hljs-string" style=""

  • MyBatis Oracle 自增序列的实现方法

    mybatis oracle 自增序列的代码如下所示: <insert id=" insert " useGeneratedKeys="true" keyProperty="s_id" parameterType="xxxx" > <selectKey resultType="int" order="BEFORE" keyProperty="s_id"

  • MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)

    一.mybatis批量插入数据到Oracle中的两种方式: 第一种: <insert id="addList" parameterType="java.util.List" useGeneratedKeys="false"> INSERT ALL <foreach item="item" index="index" collection="list"> INTO

  • Java实现mybatis批量插入数据到Oracle

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式:  结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO CREATE TABLE ACCOUNT_INFO ( "ID" NUMBER(12) NOT NULL , "USERNAME" VARCHAR2(64 BYTE) NULL , &q

  • mybatis foreach批量插入数据:Oracle与MySQL区别介绍

    下面给大家介绍mybatis foreach批量插入数据:Oracle与MySQL不同点: •主要不同点在于foreach标签内separator属性的设置问题: •separator设置为","分割时,最终拼接的代码形式为:insert into table_name (a,b,c) values (v1,v2,v3) ,(v4,v5,v6) ,... •separator设置为"union all"分割时,最终拼接的代码形式为:insert into table

  • MyBatis批量插入数据的三种方法实例

    目录 前言 准备工作 1.循环单次插入 2.MP 批量插入 ① 控制器实现 ② 业务逻辑层实现 ③ 数据持久层实现 MP 性能测试 MP 源码分析 3.原生批量插入 ① 业务逻辑层扩展 ② 数据持久层扩展 ③ 添加 UserMapper.xml 原生批量插入性能测试 缺点分析 解决方案 总结 前言 批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 MyBat

  • MyBatis批量插入数据过程解析

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

  • java实现jdbc批量插入数据

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

  • 详解MyBatis批量插入数据Mapper配置文件的写法

    对于MyBatis配置文件的用法一直不是很熟悉,之前一直是使用注解来开发的,但是注解也有不好的地方就是如果数据库的表结构发生变化在代码中修改起来很麻烦. 其实批量插入很简单,这里做些简要的说明.请看配置文件的写法: <insert id="insertAll" parameterType="java.util.List" useGeneratedKeys="true"> <selectKey resultType="l

  • Mybatis批量插入数据返回主键的实现

    响应效果(id为主键): { "data": [ {"studentName": "张三","classNo": "一班","id": 111}, {"studentName": "李四","classNo": "二班","id": 112}, {"studentName&quo

  • 如何在mybatis中向BLOB字段批量插入数据

    最近接手一个需求,需要用xxl-job定时任务同步三方库中新增的数据,粗略一看挺得意,以为一两小时就搞定了,但事与愿违,编码两小时却被一个BLOB字段玩了一下午. 每次获取50条数据过来,每条数据中有一个字段是BLOB类型的图片,需求也要将图片放入数据库(个人不建议这么玩,生产上千万的数据会造成数据库很臃肿,建议放到ftp或者minio上比较好),字段中的图片过来时已经被转换成了base64的格式,在往数据库批量插入时,数据库BLOB字段对应的实体使用byte[],程序执行时报了如下错误: or

  • Mybatis批量插入Oracle数据的方法实例

    目录 基本环境 需求 方案 改进 带自增 id 的批量插入 插入完成之后返回 sessionId 注意事项 总结 Reference 基本环境 语言:Java 8 数据库:Oracle ORM 框架:MyBatis 3.4.5 需求 批量插入数据,数据需要有自增 id.每次插入有一个唯一的 sessionId 来标记这些记录,插入完成之后返回这个 sessionId. 方案 循环插入单条记录,伪代码: int sessionId = dao.querySessionId(); for (Reco

随机推荐