zoukankan      html  css  js  c++  java
  • Java通过Mybatis实现批量插入数据到Oracle中

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式;

    结合网上资料,写了个小demo,文章末尾附上demo下载地址

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

          

    2、新建数据库表:ACCOUNT_INFO

      

    复制代码
    1 CREATE TABLE ACCOUNT_INFO (
    2     "ID" NUMBER(12) NOT NULL ,
    3     "USERNAME" VARCHAR2(64 BYTE) NULL ,
    4     "PASSWORD" VARCHAR2(64 BYTE) NULL ,
    5     "GENDER" CHAR(1 BYTE) NULL ,
    6     "EMAIL" VARCHAR2(64 BYTE) NULL ,
    7     "CREATE_DATE" DATE NULL 
    8 )
    复制代码

    3、创建AccountInfo实体类:

    复制代码
     1 package com.oracle.entity;
     2 
     3 import java.sql.Date;
     4 
     5 public class AccountInfo {
     6     private Long id;
     7     private String userName;
     8     private String password;
     9     private String gender;
    10     private String email;
    11     private Date createDate;
    12 
    13     public Long getId() {
    14         return id;
    15     }
    16 
    17     public void setId(Long id) {
    18         this.id = id;
    19     }
    20 
    21     public String getUserName() {
    22         return userName;
    23     }
    24 
    25     public void setUserName(String userName) {
    26         this.userName = userName;
    27     }
    28 
    29     public String getPassword() {
    30         return password;
    31     }
    32 
    33     public void setPassword(String password) {
    34         this.password = password;
    35     }
    36 
    37     public String getGender() {
    38         return gender;
    39     }
    40 
    41     public void setGender(String gender) {
    42         this.gender = gender;
    43     }
    44 
    45     public String getEmail() {
    46         return email;
    47     }
    48 
    49     public void setEmail(String email) {
    50         this.email = email;
    51     }
    52 
    53     public Date getCreateDate() {
    54         return createDate;
    55     }
    56 
    57     public void setCreateDate(Date createDate) {
    58         this.createDate = createDate;
    59     }
    60 
    61     @Override
    62     public String toString() {
    63         return "AccountInfo [id=" + id + ", userName=" + userName
    64                 + ", password=" + password + ", gender=" + gender + ", email="
    65                 + email + ", createDate=" + createDate + "]";
    66     }
    67 
    68 }
    复制代码

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

    复制代码
     1 package com.oracle.mapper;
     2 
     3 import java.util.List;
     4 
     5 import com.oracle.entity.AccountInfo;
     6 
     7 public interface AccountInfoMapper {
     8     /**
     9      * 查询所有的数据
    10      * @return
    11      */
    12     List<AccountInfo> queryAllAccountInfo();
    13     
    14     /**
    15      * 批量插入数据
    16      * 
    17      * @param accountInfoList
    18      * @return
    19      */
    20     int batchInsertAccountInfo(List<AccountInfo> accountInfoList);
    21     
    22     /**
    23      * 批量插入数据,使用Oracle的序列获取唯一键
    24      * 
    25      * @param accountInfoList
    26      * @return
    27      */
    28     int batchInsertAccountInfoUseSeq(List<AccountInfo> accountInfoList);
    29     
    30     /**
    31      * 插入数据,使用Oracle的序列获取唯一键
    32      * 
    33      * @param accountInfoList
    34      * @return
    35      */
    36     int insertOne(AccountInfo accountInfo);
    37 }
    复制代码

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

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
     3 <configuration>
     4     <environments default="development">
     5         <environment id="development">
     6             <transactionManager type="JDBC" />
     7             <dataSource type="POOLED">
     8                 <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
     9                 <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
    10                 <property name="username" value="xxx" />
    11                 <property name="password" value="xxx" />
    12             </dataSource>
    13         </environment>
    14     </environments>
    15     <mappers>
    16         <mapper resource="config/AccountInfoMapper.xml" />
    17     </mappers>
    18 </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)

     

    复制代码
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 <mapper namespace="com.oracle.mapper.AccountInfoMapper"><!--  接口的全类名 -->
     4     <!-- type:实体类的全类名 -->
     5     <resultMap id="BaseResultMap" type="com.oracle.entity.AccountInfo">
     6         <id column="ID" property="id" jdbcType="DECIMAL" />
     7         <result column="USERNAME" property="userName" jdbcType="VARCHAR" />
     8         <result column="PASSWORD" property="password" jdbcType="VARCHAR" />
     9         <result column="GENDER" property="gender" jdbcType="CHAR" />
    10         <result column="EMAIL" property="email" jdbcType="VARCHAR" />
    11         <result column="CREATE_DATE" property="createDate" jdbcType="DATE" />
    12     </resultMap>
    13     <!-- id 跟接口中的方法名称保持一致 -->
    14     <select id="queryAllAccountInfo" resultMap="BaseResultMap">
    15         select ID,
    16         USERNAME,PASSWORD,
    17         GENDER, EMAIL, CREATE_DATE from ACCOUNT_INFO
    18     </select>
    19     <insert id="batchInsertAccountInfo" parameterType="java.util.List">
    20         INSERT INTO ACCOUNT_INFO(ID, USERNAME,PASSWORD,GENDER, EMAIL,CREATE_DATE)
    21         (
    22         <foreach collection="list" index="" item="accountInfo"
    23             separator="union all">
    24             select
    25             #{accountInfo.id},
    26             #{accountInfo.userName},
    27             #{accountInfo.password},
    28             #{accountInfo.gender},
    29             #{accountInfo.email},
    30             #{accountInfo.createDate}
    31             from dual
    32         </foreach>
    33         )
    34     </insert>
    35     
    36     <insert id="batchInsertAccountInfoUseSeq" parameterType="java.util.List">
    37         <selectKey resultType="long" keyProperty="id" order="BEFORE"> 
    38             SELECT ACCOUNT_SEQ.NEXTVAL FROM dual
    39         </selectKey> 
    40         INSERT INTO ACCOUNT_INFO(ID, USERNAME,PASSWORD,GENDER, EMAIL,CREATE_DATE)
    41         SELECT ACCOUNT_SEQ.NEXTVAL, m.* FROM(
    42         <foreach collection="list" index="" item="accountInfo"
    43             separator="union all">
    44             select
    45             #{accountInfo.userName},
    46             #{accountInfo.password},
    47             #{accountInfo.gender},
    48             #{accountInfo.email},
    49             sysdate
    50             from dual
    51         </foreach>
    52         ) m
    53     </insert>
    54     
    55     <insert id="insertOne" parameterType="com.oracle.entity.AccountInfo">
    56         <selectKey resultType="long" keyProperty="id" order="BEFORE"> 
    57             SELECT ACCOUNT_SEQ.NEXTVAL FROM dual
    58         </selectKey> 
    59         INSERT INTO ACCOUNT_INFO(ID, USERNAME,PASSWORD,GENDER, EMAIL,CREATE_DATE)
    60         values(
    61             #{id},
    62             #{userName},
    63             #{password},
    64             #{gender},
    65             #{email},
    66             sysdate
    67         )
    68     </insert>
    69 </mapper>
    复制代码

    7、编写测试类:

    复制代码
     1 package com.oracle.test;
     2 
     3 import java.io.InputStream;
     4 import java.sql.Date;
     5 import java.util.ArrayList;
     6 import java.util.List;
     7 
     8 import org.apache.ibatis.io.Resources;
     9 import org.apache.ibatis.session.SqlSession;
    10 import org.apache.ibatis.session.SqlSessionFactory;
    11 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    12 
    13 import com.oracle.entity.AccountInfo;
    14 import com.oracle.mapper.AccountInfoMapper;
    15 
    16 public class MybatisTest {
    17     public static void main(String[] args) throws Exception {
    18         String resource = "config/mybatis-configuration.xml";
    19         InputStream inputStream = Resources.getResourceAsStream(resource);
    20         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
    21                 .build(inputStream);
    22         SqlSession session = sessionFactory.openSession();
    23         AccountInfoMapper mapper = session.getMapper(AccountInfoMapper.class);
    24         List<AccountInfo> accountInfoList = mapper.queryAllAccountInfo();
    25         if (accountInfoList == null) {
    26             System.out.println("The result is null.");
    27         } else {
    28             for (AccountInfo personInfo : accountInfoList) {
    29                 System.out.println(personInfo);
    30             }
    31         }
    32         mapper.batchInsertAccountInfoUseSeq(accountList);
    33         session.commit();
    34     }
    35     
    36     static List<AccountInfo> generateData(){
    37         List<AccountInfo> result = new ArrayList<AccountInfo>();
    38         AccountInfo account = new AccountInfo();
    39         account.setId(3L);
    40         account.setUserName("zhangsanfeng");
    41         account.setPassword("123456");
    42         account.setGender("1");
    43         account.setEmail("zhangsanfeng@wudang.com");
    44         account.setCreateDate(new Date(System.currentTimeMillis()));
    45         result.add(account);
    46         
    47         account = new AccountInfo();
    48         account.setId(4L);
    49         account.setUserName("zhouzhiruo");
    50         account.setPassword("zhangwuji");
    51         account.setGender("0");
    52         account.setEmail("zhouzhiruo@emei.com");
    53         account.setCreateDate(new Date(System.currentTimeMillis()));
    54         result.add(account);
    55         
    56         account = new AccountInfo();
    57         account.setId(5L);
    58         account.setUserName("zhaomin");
    59         account.setPassword("zhangwuji");
    60         account.setGender("0");
    61         account.setEmail("zhaomin@yuan.com");
    62         account.setCreateDate(new Date(System.currentTimeMillis()));
    63         result.add(account);
    64         return result;
    65     }
    66 }
    复制代码

     项目下载地址:https://github.com/lanqingchen/oracle

  • 相关阅读:
    The Mac Application Environment 不及格的程序员
    Xcode Plugin: Change Code In Running App Without Restart 不及格的程序员
    The property delegate of CALayer cause Crash. 不及格的程序员
    nil localizedTitle in SKProduct 不及格的程序员
    InApp Purchase 不及格的程序员
    Safari Web Content Guide 不及格的程序员
    在Mac OS X Lion 安装 XCode 3.2 不及格的程序员
    illustrate ARC with graphs 不及格的程序员
    Viewing iPhoneOptimized PNGs 不及格的程序员
    What is the dSYM? 不及格的程序员
  • 原文地址:https://www.cnblogs.com/telwanggs/p/7485332.html
Copyright © 2011-2022 走看看