Java将MySQL建表语句转换为SQLite的建表语句

打印 上一主题 下一主题

主题 900|帖子 900|积分 2710

Java将MySQL建表语句转换为SQLite的建表语句

源代码
  1. package com.fxsen.platform.core.util;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. /**
  7. * mysql转SQLite
  8. *@Author: <a target="_blank" href="https://www.cnblogs.com/mailto:fxsen@foxmail.com">Fxsen</a>
  9. *@CreateTime: 2023年08月22日  15:46
  10. */
  11. public class MysqlToSqLiteUtil {
  12.     public static final Map<String, String> FIELD_TYPE_MAP = new HashMap<>();
  13.     static {
  14.         FIELD_TYPE_MAP.put("int", "INTEGER");
  15.         FIELD_TYPE_MAP.put("bigint", "INTEGER");
  16.         FIELD_TYPE_MAP.put("tinyint", "INTEGER");
  17.         FIELD_TYPE_MAP.put("smallint", "INTEGER");
  18.         FIELD_TYPE_MAP.put("mediumint", "INTEGER");
  19.         FIELD_TYPE_MAP.put("float", "REAL");
  20.         FIELD_TYPE_MAP.put("double", "REAL");
  21.         FIELD_TYPE_MAP.put("decimal", "NUMERIC");
  22.         FIELD_TYPE_MAP.put("varchar", "TEXT");
  23.         FIELD_TYPE_MAP.put("char", "TEXT");
  24.         FIELD_TYPE_MAP.put("text", "TEXT");
  25.         FIELD_TYPE_MAP.put("enum", "TEXT");
  26.         FIELD_TYPE_MAP.put("datetime", "TEXT");
  27.         FIELD_TYPE_MAP.put("timestamp", "TEXT");
  28.         FIELD_TYPE_MAP.put("date", "TEXT");
  29.         FIELD_TYPE_MAP.put("time", "TEXT");
  30.         FIELD_TYPE_MAP.put("blob", "BLOB");
  31.         FIELD_TYPE_MAP.put("bit", "TEXT");
  32.         FIELD_TYPE_MAP.put("boolean", "INTEGER");
  33.         FIELD_TYPE_MAP.put("set", "TEXT");
  34.         FIELD_TYPE_MAP.put("json", "TEXT");
  35.         FIELD_TYPE_MAP.put("geometry", "BLOB");
  36.         FIELD_TYPE_MAP.put("point", "BLOB");
  37.         FIELD_TYPE_MAP.put("linestring", "BLOB");
  38.         FIELD_TYPE_MAP.put("polygon", "BLOB");
  39.         FIELD_TYPE_MAP.put("multipoint", "BLOB");
  40.         FIELD_TYPE_MAP.put("multilinestring", "BLOB");
  41.         FIELD_TYPE_MAP.put("multipolygon", "BLOB");
  42.         FIELD_TYPE_MAP.put("geometrycollection", "BLOB");
  43.     }
  44.     public static void main(String[] args) {
  45.         String createTableStatement = "CREATE TABLE `t_enterprise_info` (\n" +
  46.                 "  `id` varchar(32) NOT NULL COMMENT '主键ID',\n" +
  47.                 "  `category_id` text COMMENT '企业类别ID',\n" +
  48.                 "  `name` varchar(255) DEFAULT NULL COMMENT '企业名称',\n" +
  49.                 "  `social_credit_code` varchar(255) DEFAULT NULL COMMENT '社会信用代码',\n" +
  50.                 "  `org_code` varchar(255) DEFAULT NULL COMMENT '组织机构代码',\n" +
  51.                 "  `address` varchar(255) DEFAULT NULL COMMENT '街(村)、门牌号(实际经营地)',\n" +
  52.                 "  `register_address` varchar(255) DEFAULT NULL COMMENT '单位注册地',\n" +
  53.                 "  `legal_person` varchar(255) DEFAULT NULL COMMENT '单位法人',\n" +
  54.                 "  `open_date` varchar(50) DEFAULT NULL COMMENT '开业时间',\n" +
  55.                 "  PRIMARY KEY (`id`) USING BTREE\n" +
  56.                 ") ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='企业基本信息表';";
  57.         System.out.println(convertMysqlToSQLite(createTableStatement));
  58.     }
  59.     public static String convertMysqlToSQLite(String mysqlStatement) {
  60.         // 删除COMMENT
  61.         String reg = "COMMENT\\s*'.*?'";
  62.         Pattern pattern = Pattern.compile(reg);
  63.         Matcher matcher = pattern.matcher(mysqlStatement);
  64.         String result = matcher.replaceAll("")
  65.                 .replaceAll("\\).*?;", ");")
  66.                 .replaceAll("USING BTREE","")
  67.                 .replaceAll("`",""");
  68.         // 替换 MySQL 建表语句中的数据类型和关键字为 SQLite 的等价语句
  69.         for (String key : FIELD_TYPE_MAP.keySet()) {
  70.             // 生成正则表达式,匹配字段类型
  71.             String regex = "\\b" + key + "\\b";
  72.             Pattern pattern2 = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  73.             Matcher matcher2 = pattern2.matcher(result);
  74.             // 执行替换
  75.             result = matcher2.replaceAll(FIELD_TYPE_MAP.get(key));
  76.         }
  77.         // 返回替换后的 SQLite 建表语句
  78.         return result;
  79.     }
复制代码
转换前
  1. CREATE TABLE `t_enterprise_info` (
  2.   `id` varchar(32) NOT NULL COMMENT '主键ID',
  3.   `category_id` text COMMENT '企业类别ID',
  4.   `name` varchar(255) DEFAULT NULL COMMENT '企业名称',
  5.   `social_credit_code` varchar(255) DEFAULT NULL COMMENT '社会信用代码',
  6.   `org_code` varchar(255) DEFAULT NULL COMMENT '组织机构代码',
  7.   `address` varchar(255) DEFAULT NULL COMMENT '街(村)、门牌号(实际经营地)',
  8.   `register_address` varchar(255) DEFAULT NULL COMMENT '单位注册地',
  9.   `legal_person` varchar(255) DEFAULT NULL COMMENT '单位法人',
  10.   `open_date` varchar(50) DEFAULT NULL COMMENT '开业时间',
  11.   PRIMARY KEY (`id`) USING BTREE
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='企业基本信息表';
复制代码
转换后
  1. CREATE TABLE "t_enterprise_info" (
  2.   "id" TEXT(32) NOT NULL ,
  3.   "category_id" TEXT ,
  4.   "name" TEXT(255) DEFAULT NULL ,
  5.   "social_credit_code" TEXT(255) DEFAULT NULL ,
  6.   "org_code" TEXT(255) DEFAULT NULL ,
  7.   "address" TEXT(255) DEFAULT NULL ,
  8.   "register_address" TEXT(255) DEFAULT NULL ,
  9.   "legal_person" TEXT(255) DEFAULT NULL ,
  10.   "open_date" TEXT(50) DEFAULT NULL ,
  11.   PRIMARY KEY ("id")
  12. );
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表