java生成mysql數(shù)據(jù)庫建表語句、字段、字段類型、字段注釋,可實現(xiàn)不用mysqldump備份數(shù)據(jù)庫

      網(wǎng)友投稿 1057 2022-05-29

      使用 mysqldump 備份數(shù)據(jù)庫也是可行的,因為每次備份的時候都需要mysqldump這個文件, 我在windows備份時沒問題,但是放到linux上面時,centos系統(tǒng)死活不認(rèn)這個文件,但又不想裝mysql,一氣之下自己研究了個不需要mysqldump就可以備份的程序,

      如果看了以下代碼還有不懂的地方,這個網(wǎng)站有我的聯(lián)系方式http://www.huashuku.top/about.htm, 站長就是我本人

      廢話不多說,直接上代碼

      添加jdbc驅(qū)動 和httpClient的 maven依賴

      org.apache.httpcomponents

      httpclient

      4.1.2

      org.apache.httpcomponents

      httpclient-cache

      4.1.2

      org.apache.httpcomponents

      httpmime

      4.1.2

      mysql

      mysql-connector-Java

      5.1.15

      runtime

      備份程序

      package com.mysql.bak;

      import java.math.BigDecimal;

      import java.sql.Connection;

      import java.sql.DatabaseMetaData;

      import java.sql.DriverManager;

      import java.sql.PreparedStatement;

      import java.sql.ResultSet;

      import java.sql.ResultSetMetaData;

      import java.sql.SQLException;

      import java.text.SimpleDateFormat;

      import java.util.ArrayList;

      import java.util.List;

      import com.utils.FileUtils;

      /**

      * 利用jdbc備份MySql數(shù)據(jù)庫--不用mysqldump

      *

      */

      public class BakDateBase {

      private String DRIVER = "com.mysql.jdbc.Driver";

      private String URL = null; // "jdbc:mysql://182.xxx.xxx.xxx:3306/xd_love_dev?useUnicode=true&characterEncoding=utf8";

      private String USERNAME = null;// "root";

      private String PASSWORD = null;//"woaini";

      // 備份的文件地址

      private String filePath;

      private Connection conn = null;

      private String SQL = "SELECT * FROM ";// 數(shù)據(jù)庫操作

      /**

      *

      * <構(gòu)造函數(shù)>

      *

      * @param ip

      * 數(shù)據(jù)庫ip地址

      * @param database

      * 數(shù)據(jù)庫名稱

      * @param userName

      * 數(shù)據(jù)庫用戶名

      * @param password

      * 密碼

      * @param bakFilePath

      * 備份的地址

      */

      public BakDateBase(String ip, String database, String userName, String password, String bakFilePath) {

      try {

      Class.forName(this.DRIVER);

      this.URL = String.format("jdbc:mysql://%s:3306/%s?useUnicode=true&characterEncoding=utf8", ip, database);

      this.USERNAME = userName;

      this.PASSWORD = password;

      SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-ddHH時mm分ss秒");

      String datetime = tempDate.format(new java.util.Date());

      //自動加上時間戳

      datetime = datetime + "_數(shù)據(jù)庫名稱:" + database ;

      if(bakFilePath.indexOf(".") != -1) {

      bakFilePath = bakFilePath.replace(".", datetime+".");

      } else {

      bakFilePath = datetime + ".sql";

      }

      this.filePath = bakFilePath;

      } catch (ClassNotFoundException e) {

      e.printStackTrace();

      System.err.println("can not load jdbc driver");

      }

      }

      /**

      * 獲取數(shù)據(jù)庫連接

      *

      * @return

      */

      private Connection getConnection() {

      try {

      if (null == conn) {

      conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);

      }

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("get connection failure");

      }

      return conn;

      }

      /**

      * 關(guān)閉數(shù)據(jù)庫連接

      *

      * @param conn

      */

      private void closeConnection(Connection conn) {

      if (conn != null) {

      try {

      conn.close();

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("close connection failure");

      }

      }

      }

      /**

      * 獲取數(shù)據(jù)庫下的所有表名

      */

      private List getTableNames() {

      List tableNames = new ArrayList();

      Connection conn = getConnection();

      ResultSet rs = null;

      try {

      // 獲取數(shù)據(jù)庫的元數(shù)據(jù)

      DatabaseMetaData db = conn.getMetaData();

      // 從元數(shù)據(jù)中獲取到所有的表名

      rs = db.getTables(null, null, null, new String[] { "TABLE" });

      while (rs.next()) {

      tableNames.add(rs.getString(3));

      }

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("getTableNames failure");

      } finally {

      try {

      if (null != rs) {

      rs.close();

      }

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("close ResultSet failure");

      }

      }

      return tableNames;

      }

      /**

      * 獲取表中所有字段名稱

      *

      * @param tableName

      * 表名

      * @return

      */

      private List getColumnNames(String tableName) {

      List columnNames = new ArrayList();

      // 與數(shù)據(jù)庫的連接

      Connection conn = getConnection();

      PreparedStatement pStemt = null;

      String tableSql = SQL + tableName;

      try {

      pStemt = conn.prepareStatement(tableSql);

      // 結(jié)果集元數(shù)據(jù)

      ResultSetMetaData rsmd = pStemt.getMetaData();

      // 表列數(shù)

      int size = rsmd.getColumnCount();

      for (int i = 0; i < size; i++) {

      columnNames.add(rsmd.getColumnName(i + 1));

      }

      } catch (SQLException e) {

      System.err.println("getColumnNames failure");

      e.printStackTrace();

      } finally {

      if (pStemt != null) {

      try {

      pStemt.close();

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("getColumnNames close pstem and connection failure");

      }

      }

      }

      return columnNames;

      }

      /**

      * 獲取表中所有字段類型

      *

      * @param tableName

      * @return

      */

      private List getColumnTypes(String tableName) {

      List columnTypes = new ArrayList();

      // 與數(shù)據(jù)庫的連接

      Connection conn = getConnection();

      PreparedStatement pStemt = null;

      String tableSql = SQL + tableName;

      try {

      pStemt = conn.prepareStatement(tableSql);

      // 結(jié)果集元數(shù)據(jù)

      ResultSetMetaData rsmd = pStemt.getMetaData();

      // 表列數(shù)

      int size = rsmd.getColumnCount();

      for (int i = 0; i < size; i++) {

      columnTypes.add(rsmd.getColumnTypeName(i + 1));

      }

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("getColumnTypes failure");

      } finally {

      if (pStemt != null) {

      try {

      pStemt.close();

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("getColumnTypes close pstem and connection failure");

      }

      }

      }

      return columnTypes;

      }

      /**

      *

      *

      * 生成建表語句

      *

      *

      * @param tableName

      * @return

      * @author 葉新東(18126064335) 2018年9月6日 上午9:35:49

      */

      private String generateCreateTableSql(String tableName) {

      String sql = String.format("SHOW CREATE TABLE %s", tableName);

      Connection conn = null;

      PreparedStatement pstmt = null;

      try {

      conn = getConnection();

      pstmt = (PreparedStatement) conn.prepareStatement(sql);

      ResultSet rs = pstmt.executeQuery();

      while (rs.next()) {

      // 返回建表語句語句,查詢結(jié)果的第二列是建表語句,第一列是表名

      return rs.getString(2);

      }

      } catch (Exception e) {

      e.printStackTrace();

      try {

      if (null != pstmt) {

      pstmt.close();

      }

      } catch (Exception e2) {

      e.printStackTrace();

      System.err.println("關(guān)閉流異常");

      }

      }

      return null;

      }

      /**

      * 獲取表中字段的所有注釋

      *

      * @param tableName

      * @return

      */

      java生成mysql數(shù)據(jù)庫建表語句、字段、字段類型、字段注釋,可實現(xiàn)不用mysqldump備份數(shù)據(jù)庫

      private List getColumnComments(String tableName) {

      // 與數(shù)據(jù)庫的連接

      Connection conn = getConnection();

      PreparedStatement pStemt = null;

      String tableSql = SQL + tableName;

      List columnComments = new ArrayList();// 列名注釋集合

      ResultSet rs = null;

      try {

      pStemt = conn.prepareStatement(tableSql);

      rs = pStemt.executeQuery("show full columns from " + tableName);

      while (rs.next()) {

      columnComments.add(rs.getString("Comment"));

      }

      } catch (SQLException e) {

      e.printStackTrace();

      } finally {

      if (rs != null) {

      try {

      rs.close();

      } catch (SQLException e) {

      e.printStackTrace();

      System.err.println("getColumnComments close ResultSet and connection failure");

      }

      }

      }

      return columnComments;

      }

      /**

      *

      *

      * 備份表數(shù)據(jù)

      *

      *

      * @param tableName

      * @return

      * @author () 2018年9月6日 上午10:18:07

      */

      private String bakTableData(String tableName) {

      Connection conn = null;

      PreparedStatement pstmt = null;

      try {

      // 備份建表語句

      String createTableSql = generateCreateTableSql(tableName);

      createTableSql = String.format(

      "\n\n\n/**\n * table name :<%s>\n *\n */\n%s\n",

      tableName, createTableSql);

      FileUtils.writeFileContent(filePath, createTableSql);

      // 獲取字段類型

      List columnTypes = getColumnTypes(tableName);

      // 獲取所有 字段

      List columnNames = getColumnNames(tableName);

      String columnArrayStr = null;

      for (String column : columnNames) {

      if (null == columnArrayStr) {

      columnArrayStr = "`" + column + "`";

      } else {

      columnArrayStr = columnArrayStr + "," + "`" + column + "`";

      }

      }

      String sql = String.format("select %s from %s", columnArrayStr, tableName);

      conn = getConnection();

      pstmt = (PreparedStatement) conn.prepareStatement(sql);

      ResultSet rs = pstmt.executeQuery();

      while (rs.next()) {

      String rowValues = getRowValues(rs, columnNames.size(), columnTypes);

      // 返回建表語句語句,查詢結(jié)果的第二列是建表語句,第一列是表名

      String insertSql = String.format("insert into %s (%s) values(%s);", tableName, columnArrayStr,

      rowValues);

      System.out.println(insertSql);

      insertSql = insertSql.replaceAll("\n", "
      ");

      insertSql = insertSql + "\n";

      FileUtils.writeFileContent(filePath, insertSql);

      }

      } catch (Exception e) {

      e.printStackTrace();

      try {

      if (null != pstmt) {

      pstmt.close();

      }

      } catch (Exception e2) {

      e.printStackTrace();

      System.err.println("關(guān)閉流異常");

      }

      }

      return null;

      }

      /**

      *

      *

      * 獲取表數(shù)據(jù)一行的所有值

      *

      *

      * @param rs

      * @param size

      * @author 2018年9月6日 上午11:03:05

      */

      private String getRowValues(ResultSet rs, int size, List columnTypeList) {

      try {

      String rowValues = null;

      for (int i = 1; i <= size; i++) {

      String columnValue = null;

      // 獲取字段值

      columnValue = getValue(rs, i, columnTypeList.get(i - 1));

      // 如果是空值不添加單引號

      if (null != columnValue) {

      columnValue = "'" + columnValue + "'";

      }

      // 拼接字段值

      if (null == rowValues) {

      rowValues = columnValue;

      } else {

      rowValues = rowValues + "," + columnValue;

      }

      }

      return rowValues;

      } catch (Exception e) {

      e.printStackTrace();

      System.out.println("獲取表數(shù)據(jù)一行的所有值異常");

      return null;

      }

      }

      /**

      *

      *

      * 根據(jù)類型獲取字段值

      *

      *

      * @param obj

      * @return

      * @author 2018年9月6日 上午11:16:00

      */

      private String getValue(ResultSet resultSet, Integer index, String columnType) {

      try {

      if ("int".equals(columnType) || "INT".equals(columnType)) {

      // 整數(shù)

      Object intValue = resultSet.getObject(index);

      if (null == intValue) {

      return null;

      }

      return intValue + "";

      } else if ("bigint".equals(columnType) || "BIGINT".equals(columnType)) {

      // 長整形

      Object value = resultSet.getObject(index);

      if (null == value) {

      return null;

      }

      return value + "";

      } else if ("smallint".equals(columnType) || "SMALLINT".equals(columnType)) {

      // 整數(shù)

      Object value = resultSet.getObject(index);

      if (null == value) {

      return null;

      }

      return value + "";

      } else if ("tinyint".equals(columnType) || "TINYINT".equals(columnType)) {

      // 整數(shù)

      Object value = resultSet.getObject(index);

      if (null == value) {

      return null;

      }

      return value + "";

      } else if ("mediumint".equals(columnType) || "MEDIUMINT".equals(columnType)) {

      // 長整形

      Object value = resultSet.getObject(index);

      if (null == value) {

      return null;

      }

      return value + "";

      } else if ("integer".equals(columnType) || "INTEGER".equals(columnType)) {

      // 整數(shù)

      Object value = resultSet.getObject(index);

      if (null == value) {

      return null;

      }

      return value + "";

      } else if ("float".equals(columnType) || "FLOAT".equals(columnType)) {

      // 浮點數(shù)

      Object value = resultSet.getObject(index);

      if (null == value) {

      return null;

      }

      return value + "";

      } else if ("double".equals(columnType) || "DOUBLE".equals(columnType)) {

      // 浮點數(shù)

      Object value = resultSet.getObject(index);

      if (null == value) {

      return null;

      }

      return value + "";

      } else if ("decimal".equals(columnType) || "DECIMAL".equals(columnType)) {

      // 浮點數(shù)-金額類型

      BigDecimal value = resultSet.getBigDecimal(index);

      if (null == value) {

      return null;

      }

      return value.toString();

      } else if ("char".equals(columnType) || "CHAR".equals(columnType)) {

      // 字符串類型

      String value = resultSet.getString(index);

      return value;

      } else if ("varchar".equals(columnType) || "VARCHAR".equals(columnType)) {

      // 字符串類型

      String value = resultSet.getString(index);

      return value;

      } else if ("tinytext".equals(columnType) || "TINYTEXT".equals(columnType)) {

      // 字符串類型

      String value = resultSet.getString(index);

      return value;

      } else if ("text".equals(columnType) || "TEXT".equals(columnType)) {

      // 字符串類型

      String value = resultSet.getString(index);

      return value;

      } else if ("mediumtext".equals(columnType) || "MEDIUMTEXT".equals(columnType)) {

      // 字符串類型

      String value = resultSet.getString(index);

      return value;

      } else if ("longtext".equals(columnType) || "LONGTEXT".equals(columnType)) {

      // 字符串類型

      String value = resultSet.getString(index);

      return value;

      } else if ("year".equals(columnType) || "YEAR".equals(columnType)) {

      // 時間類型:范圍 1901/2155 格式 YYYY

      String year = resultSet.getString(index);

      if (null == year) {

      return null;

      }

      // 只需要年的字符即可,

      return year.substring(0, 4);

      } else if ("date".equals(columnType) || "DATE".equals(columnType)) {

      // 時間類型:范圍 '1000-01-01'--'9999-12-31' 格式 YYYY-MM-DD

      return resultSet.getString(index);

      } else if ("time".equals(columnType) || "TIME".equals(columnType)) {

      // 時間類型:范圍 '-838:59:59'到'838:59:59' 格式 HH:MM:SS

      return resultSet.getString(index);

      } else if ("datetime".equals(columnType) || "DATETIME".equals(columnType)) {

      // 時間類型:范圍 '1000-01-01 00:00:00'--'9999-12-31 23:59:59' 格式 YYYY-MM-DD HH:MM:SS

      return resultSet.getString(index);

      } else if ("timestamp".equals(columnType) || "TIMESTAMP".equals(columnType)) {

      // 時間類型:范圍 1970-01-01 00:00:00/2037 年某時 格式 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

      return resultSet.getString(index);

      } else {

      return null;

      }

      } catch (Exception e) {

      e.printStackTrace();

      System.err.println("獲取數(shù)據(jù)庫類型值異常");

      return null;

      }

      }

      /**

      *

      * <開始備份>

      *

      * @author 2018年9月6日 下午3:30:43

      */

      public void startBak() {

      try {

      List tableNames = getTableNames();

      System.out.println("tableNames:" + tableNames);

      for (String tableName : tableNames) {

      bakTableData(tableName);

      // System.out.println(generateCreateTableSql(tableName));

      // System.out.println("ColumnNames:" + getColumnNames(tableName));

      // System.out.println("ColumnTypes:" + getColumnTypes(tableName));

      // System.out.println("ColumnComments:" + getColumnComments(tableName));

      }

      // 統(tǒng)一關(guān)閉連接

      closeConnection(conn);

      } catch (Exception e) {

      e.printStackTrace();

      }

      }

      public static void main(String[] args) {

      new BakDateBase("182.xxx.xxx.xxx", "xd_love_dev", "root", "woaini", "f:\\bak.sql").startBak();

      }

      }

      執(zhí)行 main 方法后會在磁盤指定位置生成 .sql? 的文件,內(nèi)容如下:

      Java MySQL 數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:一場由fork引發(fā)的超時,讓我們重新探討了Redis的抖動問題
      下一篇:ReactNative進(jìn)階(一):ReactNative學(xué)習(xí)資料匯總
      相關(guān)文章
      亚洲一本之道高清乱码| 亚洲精品无码人妻无码| MM1313亚洲国产精品| 91亚洲自偷在线观看国产馆| 亚洲av永久无码精品漫画| 中文字幕在线亚洲精品| 亚洲综合图色40p| 亚洲日本乱码在线观看| 亚洲日韩人妻第一页| 国产成人亚洲综合a∨| 全亚洲最新黄色特级网站| 国产成人亚洲精品无码AV大片| 亚洲欧美成人av在线观看| 精品亚洲AV无码一区二区| 亚洲av产在线精品亚洲第一站| 亚洲一级免费毛片| 亚洲人成电影院在线观看| 亚洲av乱码一区二区三区| 亚洲一区二区免费视频| 中文字幕在线观看亚洲日韩| 亚洲av无码片区一区二区三区| 亚洲国产av一区二区三区丶| 亚洲一区电影在线观看| 亚洲午夜一区二区三区| 亚洲国产午夜精品理论片在线播放 | 综合一区自拍亚洲综合图区 | 亚洲av无码专区首页| 亚洲变态另类一区二区三区| 精品亚洲视频在线| 亚洲片一区二区三区| 亚洲国产精品无码久久久秋霞2| 亚洲成年人在线观看| 亚洲最大黄色网址| 精品国产成人亚洲午夜福利| 亚洲色大成网站www久久九 | 亚洲国产精品久久| 亚洲精品美女久久久久| 亚洲AV男人的天堂在线观看| 亚洲欧洲av综合色无码| 爱爱帝国亚洲一区二区三区| 中文字幕亚洲综合久久男男|