首先大概浅谈一下数据库区别的(方便新人去大概了解数据库),mongodb介于关系型数据库和非关系型数据库之间,扩展以及效率都非常可观,平时进行业务拓展操作简便很多(个人感觉写sql可能麻烦一些),mysql应该是大家用的最多的了,就不多描述了。。。。对了,需要注意一点的是mysql的编码方式utf-8以及utf-8mb4的区别,最直观的就是可以存储一些特殊符号,当然,我发现这个问题是因为两个一样长的id报了错误(小白没有仔细研究,但是一开始表示很奇怪,明明一样长的id怎么会编码错误),百度一下是因为字符集导致的错误。后面修改了配置解决了问题。

场景:我们是两地分公司,网路连接也不好,几百万的数据量直接连接操作可能导致出现很多问题,所以尽量把数据库导入本地后进行清洗,然后再进行相关操作,导入本地,然后联系运维,或者自己去导入即可,代码还是比较简单的,主要是思想吧,= =当然思想也很简单啦,主要给一些需要快捷解决问题的朋友或者萌新提供一些思路,没有任何花里胡哨。
pom.xml:

<dependencies>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20170516</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>bson</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.4.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
</dependencies>

代码:
值得提的一下 rewriteBatchedStatements参数设置成true,保证5.1.13以上版本的驱动,能实现高性能的批量插入,想具体了解可以去搜索一下资料,MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。(这里一句话是参考一位兄弟的,表示感谢。)

private String driver = "";
    private String dbURL = "";
    private String user = "";
    private String password = "";
    private static MySQLConnections connection = null;

    private MySQLConnections() throws Exception {
        driver = "com.mysql.cj.jdbc.Driver";
        dbURL = "jdbc:mysql://localhost/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&rewriteBatchedStatements=true";
        user = "root";
        password = "123456";
        System.out.println("dbURL:" + dbURL);
    }

    public static Connection getConnection() {
        Connection conn = null;
        if (connection == null) {
            try {
                connection = new MySQLConnections();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        try {
            Class.forName(connection.driver);
            conn = DriverManager.getConnection(connection.dbURL,
                    connection.user, connection.password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    private void doStore(List<Document> list, Connection conn,String sql) throws ClassNotFoundException, SQLException {
        conn.setAutoCommit(false); // 设置手动提交
        PreparedStatement psts = conn.prepareStatement(sql);
        for (int i=0;i<list.size();i++){
                if(list.get(i).containsKey("ci") && !"".equals(list.get(i).get("ci")+"") && !"".equals(list.get(i).get("metadata")+"")
                ){
                    psts.setString(1, list.get(i).containsKey("ci")?list.get(i).get("ci").toString():"" );
                    psts.setString(2, list.get(i).containsKey("name")?list.get(i).get("name").toString():"" );
                    psts.setString(3, list.get(i).containsKey("origin")?list.get(i).get("origin").toString():"" );
                    psts.setInt(4, list.get(i).containsKey("register") && !"".equals(list.get(i).get("register"))?Integer.parseInt(list.get(i).get("register").toString()):-1 );
                    psts.setString(5, list.get(i).containsKey("type")?list.get(i).get("type").toString():"" );
                    psts.setString(6, list.get(i).containsKey("category")?list.get(i).get("category").toString():"" );
                    psts.setString(7, list.get(i).containsKey("obligee")?list.get(i).get("obligee").toString():"" );
                    psts.setString(8, list.get(i).containsKey("date")?list.get(i).get("date").toString():"" );
                    psts.setString(9, list.get(i).containsKey("metadata") && Document.parse(list.get(i).get("metadata").toString()).containsKey("登记日期")?Document.parse(list.get(i).get("metadata").toString()).getString("登记日期"):"");
                    psts.setString(10,list.get(i).containsKey("metadata") && Document.parse(list.get(i).get("metadata").toString()).containsKey("创作完成日期")?Document.parse(list.get(i).get("metadata").toString()).getString("创作完成日期"):"");
                    psts.setString(11,list.get(i).containsKey("metadata") && Document.parse(list.get(i).get("metadata").toString()).containsKey("首次发表日期")?Document.parse(list.get(i).get("metadata").toString()).getString("首次发表日期"):"");
                    psts.addBatch();
                }

        }
        psts.executeBatch(); // 执行批量处理
        psts.close();
        conn.commit();  // 提交
        System.out.println("All down : " );
    }



    public static void main(String[] args) throws Exception {

        System.out.println(999889 +737632 +587784+ 115271);
        String sql = "INSERT copyright values(NULL,?,?,?,?,?,?,?,?,?,?,?)";
        List<Document> d = new ArrayList<Document>();
        d.add(new Document());
        MySQLConnections m = new MySQLConnections();

        MongoCollection<Document> md = mongodb.getConnect().getCollection("csv");
        List<Document> s = new ArrayList<Document>();
        //3200000 150电脑配置很低很卡....一次倒容易出问题分多批是最稳定的,资源使用后都关闭了,之前测试大概200w会内存溢出。
        //1000000  2000000
        //2000000  2600000
        //2600000  3200000
        System.out.println();
        int count=0;
        for (int i =2600000 ; i < 3200000; i += 100000) {
            FindIterable<Document> find = md.find().skip(i).limit(100000);
            find.into(s);
     /*       m.doStore(s, MySQLConnections.getConnection(), sql);*/
            for (int j=0;j<s.size();j++){
                if(s.get(j).containsKey("ci") && !"".equals(s.get(j).get("ci")+"") && !"".equals(s.get(j).get("metadata")+"")){
                count++;
                }
            }
            s.clear();
        }
        System.out.println(count);
        //处理乱码测试
      /*  Document doc=new Document();
        doc.put("ci","渝作登字-2014-A-00081030");
        FindIterable<Document> find = md.find(doc);
        find.into(s);
        System.out.println(s.get(0));
        m.doStore(s, MySQLConnections.getConnection(), sql);
        s.clear();*/
//999889  737632 587784  115271

        /*MySQLConnections.getConnection().close();*/
        System.out.println("执行完毕");
    }

好了,这样就解决了,不过这样两种数据库导入真的好气好气,一种有规则,一种无规则数据库,各种规则的数据只能一直试调