`
grandboy
  • 浏览: 124880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

导入导出MYSQL数据库到SQL文件

阅读更多
自己工作中要用这个功能,就自己写了一个。 自己也测试了,没有发现问题,现在发上来,看看别人有没有人用得着的。
导出测试方法:
public static void main(String[] args) throws SQLException, IOException {
   Export export = new ExportMySQL();
   export.exportData("c:/sql.sql", "userrole;method;policy;audit", ConnectionManager.getConnection(), true);
}

exportData方法如下:
public void exportData(String fileName, String tables, Connection conn, boolean withDeleteSQL) throws SQLException, IOException;
参数说明:
fileName: 导出到哪个文件;
tables: 要导出哪些数据表,多个数据表名以分号(;)分隔;
conn: 数据库连接;
withDeleteSQL: true,表示要生成delete所有数据的SQL, 如果为false, 则不生成。


导入测试方法:
public static void main(String[] args) throws SQLException, IOException {
   Import import_ = new ImportMySQL();
   import_.importFile("c:/sql.sql", ConnectionManager.getConnection());
}

importFile方法如下:
public void importFile(String fileName, Connection conn) throws IOException;
参数说明:
fileName: 导入的文件;
conn: 数据库连接;

代码如下:
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

public interface Export {

    public void exportData(String fileName, String tables, Connection conn, boolean withDeleteSQL) throws SQLException, IOException;
}


import java.io.IOException;
import java.sql.Connection;

public interface Import {
    public void importFile(String fileName, Connection conn) throws IOException;
}


import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Formatter;
import java.util.StringTokenizer;

public class ExportMySQL implements Export {
    private Connection conn;

    private final String SELECT_TABLE = "SELECT * FROM %s;";
    private final String DELETE_TABLE = "DELETE FROM %s;\n";
    private final String INSERT_TABLE = "INSERT INTO `%s`(%s) VALUES\n%s;\n";
    private final String COUNT_TABLE = "SELECT COUNT(*) as totalcount FROM %s;";

    public void exportData(String fileName, String tables, Connection conn, boolean withDeleteSQL) throws SQLException, IOException {
        checkNull(fileName, "fileName");
        checkNull(tables, "tables");
        checkString(fileName, "fileName");
        checkString(tables, "tables");
        checkNull(conn, "conn");

        this.conn = conn;
        try {
            StringBuffer allsql = new StringBuffer();
            StringTokenizer s = new StringTokenizer(tables, ";");
            while (s.hasMoreTokens()) {
                String table = s.nextToken();
                Formatter formatter = new Formatter();
                formatter.format(COUNT_TABLE, table);
                ResultSet rs = conn.createStatement().executeQuery(formatter.toString());
                int count = 0;
                if (rs.next()) {
                    count = rs.getInt(1);
                }
                if (count > 0) {
                    if (withDeleteSQL) {
                        formatter = new Formatter();
                        formatter.format(DELETE_TABLE, table);
                        allsql.append(formatter.toString());
                    }
                    allsql.append(generateInsertSQL(table));
                }
            }
            if (!isEmpty(allsql.toString().trim())) {
                FileWriter fw = null;
                try {
                    fw = new FileWriter(fileName);
                    fw.write(allsql.toString());
                } finally {
                    if (null != fw)
                        fw.close();
                }
            }
        } finally {
            DBUtil.closeConnection(conn);
        }
    }

    private String generateInsertSQL(String table) {
        Formatter formatter = new Formatter();
        formatter.format(SELECT_TABLE, table);
        ResultSet rs = null;
        Statement stmt = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(formatter.toString());
            ResultSetMetaData rsmd = rs.getMetaData();
            int cols = rsmd.getColumnCount();
            if (0 == cols) {
                return "";
            }
            String fields = getFields(rsmd);
            String allvalue = getValues(rs);
            formatter = new Formatter();
            formatter.format(INSERT_TABLE, table, fields, allvalue);
            String result = formatter.toString();
            return result;
        } catch (SQLException ex) {
            ex.printStackTrace(System.out);
            return "";
        } finally {
            DBUtil.closeResultSet(rs);
            DBUtil.closeStatement(stmt);
        }

    }

    private String getValues(ResultSet rs) {
        checkNull(rs, "rs");
        try {
            ResultSetMetaData rsmd = rs.getMetaData();
            int cols = rsmd.getColumnCount();
            if (0 == cols) {
                return "";
            }
            StringBuffer values = new StringBuffer();
            boolean isFirst = true;
            while (rs.next()) {
                StringBuffer value = new StringBuffer();
                for (int i = 1; i <= cols; i++) {
                    if (null != rs.getString(i))
                        if (rsmd.getColumnType(i) == Types.VARCHAR || rsmd.getColumnType(i) == Types.DATE || rsmd.getColumnType(i) == Types.TIME
                                || rsmd.getColumnType(i) == Types.TIMESTAMP || rsmd.getColumnType(i) == Types.CHAR
                                || rsmd.getColumnType(i) == Types.LONGVARCHAR || rsmd.getColumnType(i) == Types.NCHAR
                                || rsmd.getColumnType(i) == Types.NVARCHAR || rsmd.getColumnType(i) == Types.LONGNVARCHAR
                                || rsmd.getColumnType(i) == Types.SQLXML)
                            value.append("'" + rs.getString(i) + "'");
                        else
                            value.append(rs.getString(i));
                    else
                        value.append("NULL");
                    if (i < cols) {
                        value.append(",");
                    }
                }
                if (isFirst) {
                    values.append("(" + value + ")");
                    isFirst = false;
                } else
                    values.append(",\n(" + value + ")");
            }
            return values.toString();
        } catch (SQLException ex) {
            ex.printStackTrace(System.out);
            return "";
        }

    }

    private String getFields(ResultSetMetaData rsmd) {
        try {
            int cols = rsmd.getColumnCount();
            if (0 == cols) {
                return "";
            }
            StringBuffer fields = new StringBuffer();
            for (int i = 1; i <= cols; i++) {
                if (i == cols)
                    fields.append(rsmd.getColumnName(i));
                else
                    fields.append(rsmd.getColumnName(i) + ",");
            }

            return fields.toString();

        } catch (SQLException ex) {
            ex.printStackTrace(System.out);
            return "";
        }
    }

    public static void main(String[] args) throws SQLException, IOException {
        Export export = new ExportMySQL();
        export.exportData("c:/sql.sql", "userrole;method;policy;audit", ConnectionManager.getConnection(), true);
    }

}

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

public class ImportMySQL implements Import {
    public void importFile(String fileName, Connection conn) throws IOException {
        checkNull(fileName, "fileName");
        checkNull(conn, "conn");

        StringBuffer buffer = new StringBuffer();
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(fileName));
            String next = "";
            while (null != next ) {
                next = br.readLine();
                buffer.append(next);
                if (null != next && next.endsWith(";")) {// just means a whole sql                   
                    DBUtil.executeSQL(buffer.toString(), null);
                    buffer = new StringBuffer();
                }
            }
        } finally {
            if (null != br)
                br.close();
            DBUtil.closeConnection(conn);
        }

    }
    public static void main(String[] args) throws SQLException, IOException {
        Import import_ = new ImportMySQL();
        import_.importFile("c:/sql.sql", ConnectionManager.getConnection());
    }

}


代码比较长,也不想加附件了。  有什么问题,大家说一下。谢谢。

其他的代码:
import java.security.InvalidParameterException;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import java.util.UUID;

public class StringUtil {
    static ResourceBundle resourceBundle = DaoResourceBundle.getResourceBundle();
    public static String changeNull(String n) {
        if (null == n) {
            return "";
        }
        return n.trim();
    }
    public static void checkString(String string, String name) {
        if (StringUtil.isEmpty(string)) {
            String pattern = resourceBundle.getString("dao.exception.invalidparameterexception");
            String message = MessageFormat.format(pattern, new String(name));
            throw new InvalidParameterException(message);
        }
    }

    public static void checkNull(Object object, String name) {
        if (null == object) {
            String pattern = resourceBundle.getString("dao.exception.nullpointerexception");//需要一个properties文件,也可以直接hardcode
            String message = MessageFormat.format(pattern, new String(name));
            throw new NullPointerException(message);
        }
    }
}

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public final class DBUtil {
    static Log logger = LogFactory.getLog(DBUtil.class);

    public static void executeSQL(String sql, final List<Object> paramsList) {
        Connection conn = ConnectionManager.getConnection();
        PreparedStatement stmt = null;
        try {
            stmt = conn.prepareStatement(sql);
            //setParameters(paramsList, stmt);//在这个功能里应该用不到,所以就尽量少的提供代码。
            stmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("ERROR_CAUSE" + ex.getCause() + "   MSG: " + ex.getMessage());
            //throw new DBException(ex);
        } finally {
            closeStatement(stmt);
        }
    }

    public static void closeStatement(final Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException ex) {
                logger.error("ERROR_CAUSE" + ex.getCause() + "   MSG: " + ex.getMessage());
                //throw new DBException(ex);
            }
        }
    }

    public static void closeResultSet(final ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                logger.error("ERROR_CAUSE" + ex.getCause() + "   MSG: " + ex.getMessage());
                //throw new DBException(ex);
            }
        }
    }
    
    public static void closeConnection(final Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException ex) {
                logger.error("ERROR_CAUSE" + ex.getCause() + "   MSG: " + ex.getMessage());
                //throw new DBException(ex);
            }
        }
    }
}


其中DBUtil里用到CoonectionManager, 大家都知道通常会用到一些配置文件,还有一些第三方连接池,提供出来有点乱。这个写起来应该不是什么难事,就自己写吧。
分享到:
评论
5 楼 every 2009-12-01  
我还以为是可以到处表结构的呢……
4 楼 grandboy 2009-12-01  
every 写道
checkNull(fileName, "fileName");
checkNull(tables, "tables");
checkString(fileName, "fileName");
checkString(tables, "tables");
checkNull(conn, "conn");
checkNull(rs, "rs");
这两个函数
以及数据库连接池
DBUtil


我提供了剩下的类,但是你还得自己写一个ConnectionMananger, 这个很容易,一般应用程序里都有,直接考一个就行了。希望你顺利。
3 楼 every 2009-11-30  
checkNull(fileName, "fileName");
checkNull(tables, "tables");
checkString(fileName, "fileName");
checkString(tables, "tables");
checkNull(conn, "conn");
checkNull(rs, "rs");
这两个函数
以及数据库连接池
DBUtil

2 楼 grandboy 2009-11-26  
every 写道
看到这篇日志,感觉很受用,代码中应用了其它工具类,能否也共享一下,谢谢


这就是完整的代码。 没有用到其他的工具类啊,如果你编译不过去的话,可以把详细情况说一下。
1 楼 every 2009-11-26  
看到这篇日志,感觉很受用,代码中应用了其它工具类,能否也共享一下,谢谢

相关推荐

    linux下导入导出mysql数据库及其导出数据命令大汇总

    Linux 下 MySQL 数据库导入导出命令大汇总 Linux 作为一个广泛应用于服务器操作系统的平台,MySQL 作为一个流行的关系数据库管理系统,在 Linux 下的使用非常广泛。因此,掌握 Linux 下 MySQL 数据库的导入导出命令...

    MYSQL 数据库导入导出命令

    MySQL 数据库导入导出命令是数据库管理员和开发者经常使用的命令,用于将 MySQL 数据库导出到文件中,以便备份、还原或迁移到其他服务器。下面将详细介绍 MySQL 数据库导入导出的命令和方法。 数据库备份 数据库...

    java调用mysql命令 导入导出数据库

    1. `mysqldump`:这是一个用于备份数据库的实用程序,它能够将MySQL数据库结构和数据导出为SQL文件。这个文件可以被用来在另一台服务器上重新创建相同的数据库,或者在本地恢复数据。 2. `mysql`:这是MySQL的...

    如何导入导出mysql数据库

    ### 如何导入导出MySQL数据库 #### 1. 概述 MySQL数据库是目前非常流行的开源关系型数据库管理系统,广泛应用于各种规模的应用程序中。在实际应用过程中,常常需要进行数据库的备份与恢复操作,例如迁移数据库、...

    如何导入导出MySQL数据库

    首先,我们来看**SQL脚本形式**的导入导出方法,这是推荐的方式,因为它能确保在不同环境下保持兼容性。 **导出SQL脚本**: 1. 使用`phpMyAdmin`工具:在工具的导出选项中,确保选择“结构”和“数据”,避免勾选...

    mariadb导入导出mysql数据库的脚本:无需手动创建数据库,直接新建数据库+导入表结构+插入记录

    标题中的“mariadb导入导出mysql数据库的脚本”是指使用特定的脚本来实现MySQL或MariaDB数据库的导入和导出操作。这种脚本的优点在于可以自动化处理数据库的创建、表结构导入以及数据记录的插入,从而节省手动操作的...

    mysql导入导出sql文件.docx

    mysqldump 命令和 source 命令是MySQL数据库导入导出 SQL 文件的两个重要工具。mysqldump 命令可以将数据库的数据和表结构导出到一个 SQL 文件中,而 source 命令可以将 SQL 文件导入到数据库中。

    PowerDesigner导出的SQL带列注释,导入到MySQL中列注释不见了的处理方法

    在使用 PowerDesigner 导出 SQL 文件时,如果包含列注释,可能会在导入到 MySQL 数据库中时丢失。这是因为 PowerDesigner 导出的 SQL 文件的编码格式可能不是 UTF-8,而 MySQL 数据库的编码格式是 UTF-8,导致中文...

    运行cmd状态下MySQL导入导出.sql文件

    ### MySQL在CMD状态下的导入与导出操作详解 ...以上步骤详细介绍了如何在CMD环境下进行MySQL的导入导出操作,并解决了导入文件大小限制的问题。这些操作对于数据库管理来说是非常实用且重要的技能。

    mysql数据库的导入导出

    综上所述,MySQL数据库的导入导出操作,涉及到mysqldump工具和source命令的熟练使用,以及SQL语法中ALTER TABLE命令用于调整表结构。在操作过程中,还需要注意字符集的匹配问题,以及在多表查询时为派生表添加别名以...

    sql 数据库导入 mysql数据库的工具 sql 转化mysql

    总结,将SQL数据库的数据导入到MySQL数据库,涉及到多个环节,包括数据的导出、转换和导入,以及在此过程中需要注意的数据一致性、权限管理、备份恢复和性能优化。通过使用如`mss2sql`这样的专业工具,可以简化这个...

    如何用SQLyog备份及导入mysql数据库

    2. 在导出到文件处填入您想要存入备份文件的路径和文件名。 3. 点击“导出”按钮,等待备份完成。 五、导入数据库 导入数据库是将备份的数据库文件恢复到原来的状态。在SQLyog中,可以使用“执行脚本”功能来导入...

    mysql 导入导出 sql文件

    本文将详细介绍如何在不同操作系统环境下进行MySQL数据库的导入导出操作,特别是针对SQL文件的操作。 #### 二、MySQL导入导出的基本概念 1. **导出**: 将数据库中的数据以SQL脚本的形式导出到文件中,方便备份或...

    mysql导入导出.sql文件.pdf

    ### MySQL 数据库的导入与导出操作详解 #### 一、MySQL命令行模式的设置 ...以上步骤覆盖了MySQL数据库的基本导入导出操作以及处理大文件的一些常见问题。通过这些方法,可以有效地管理和维护MySQL数据库。

    导入导出mysql数据

    与导出类似,MySQL 提供了 `mysql` 工具用于将 SQL 脚本文件导入到数据库中,从而实现数据的恢复。在 Java 程序中,同样可以通过调用系统命令的方式来执行 `mysql` 命令。 #### Java 实现 在 `DBBackupHelper` 类中...

    mysql导入导出sql.rar

    导入SQL文件允许用户将包含创建表、插入数据等指令的文本文件应用到MySQL数据库中,而导出则相反,它将数据库中的内容转换为SQL脚本,以便存储或转移到其他系统。 这个名为"mysql导入导出sql"的工具提供了以下功能...

    全国地区数据库 mysql导出的sql文件 可导入mssql

    全国地区数据库 mysql导出的sql文件 可导入mssql

    在linux命令下导出导入.sql文件的方法

    本文讲述了在linux命令下导出导入.sql文件的方法。分享给大家供大家参考,具体如下: 一、导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1、导出数据和表结构: mysqldump -u用户名 -p密码 ...

Global site tag (gtag.js) - Google Analytics