Java将MySQL建表语句转换为SQLite的建表语句
阅读原文时间:2023年08月23日阅读:5

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

源代码

package com.fxsen.platform.core.util;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * mysql转SQLite
 *@Author: <a href="mailto:fxsen@foxmail.com">Fxsen</a>
 *@CreateTime: 2023年08月22日  15:46
 */
public class MysqlToSqLiteUtil {

    public static final Map<String, String> FIELD_TYPE_MAP = new HashMap<>();

    static {
        FIELD_TYPE_MAP.put("int", "INTEGER");
        FIELD_TYPE_MAP.put("bigint", "INTEGER");
        FIELD_TYPE_MAP.put("tinyint", "INTEGER");
        FIELD_TYPE_MAP.put("smallint", "INTEGER");
        FIELD_TYPE_MAP.put("mediumint", "INTEGER");
        FIELD_TYPE_MAP.put("float", "REAL");
        FIELD_TYPE_MAP.put("double", "REAL");
        FIELD_TYPE_MAP.put("decimal", "NUMERIC");
        FIELD_TYPE_MAP.put("varchar", "TEXT");
        FIELD_TYPE_MAP.put("char", "TEXT");
        FIELD_TYPE_MAP.put("text", "TEXT");
        FIELD_TYPE_MAP.put("enum", "TEXT");
        FIELD_TYPE_MAP.put("datetime", "TEXT");
        FIELD_TYPE_MAP.put("timestamp", "TEXT");
        FIELD_TYPE_MAP.put("date", "TEXT");
        FIELD_TYPE_MAP.put("time", "TEXT");
        FIELD_TYPE_MAP.put("blob", "BLOB");
        FIELD_TYPE_MAP.put("bit", "TEXT");
        FIELD_TYPE_MAP.put("boolean", "INTEGER");
        FIELD_TYPE_MAP.put("set", "TEXT");
        FIELD_TYPE_MAP.put("json", "TEXT");
        FIELD_TYPE_MAP.put("geometry", "BLOB");
        FIELD_TYPE_MAP.put("point", "BLOB");
        FIELD_TYPE_MAP.put("linestring", "BLOB");
        FIELD_TYPE_MAP.put("polygon", "BLOB");
        FIELD_TYPE_MAP.put("multipoint", "BLOB");
        FIELD_TYPE_MAP.put("multilinestring", "BLOB");
        FIELD_TYPE_MAP.put("multipolygon", "BLOB");
        FIELD_TYPE_MAP.put("geometrycollection", "BLOB");
    }

    public static void main(String[] args) {
        String createTableStatement = "CREATE TABLE `t_enterprise_info` (\n" +
                "  `id` varchar(32) NOT NULL COMMENT '主键ID',\n" +
                "  `category_id` text COMMENT '企业类别ID',\n" +
                "  `name` varchar(255) DEFAULT NULL COMMENT '企业名称',\n" +
                "  `social_credit_code` varchar(255) DEFAULT NULL COMMENT '社会信用代码',\n" +
                "  `org_code` varchar(255) DEFAULT NULL COMMENT '组织机构代码',\n" +
                "  `address` varchar(255) DEFAULT NULL COMMENT '街(村)、门牌号(实际经营地)',\n" +
                "  `register_address` varchar(255) DEFAULT NULL COMMENT '单位注册地',\n" +
                "  `legal_person` varchar(255) DEFAULT NULL COMMENT '单位法人',\n" +
                "  `open_date` varchar(50) DEFAULT NULL COMMENT '开业时间',\n" +
                "  PRIMARY KEY (`id`) USING BTREE\n" +
                ") ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='企业基本信息表';";
        System.out.println(convertMysqlToSQLite(createTableStatement));
    }

    public static String convertMysqlToSQLite(String mysqlStatement) {

        // 删除COMMENT
        String reg = "COMMENT\\s*'.*?'";
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(mysqlStatement);
        String result = matcher.replaceAll("")
                .replaceAll("\\).*?;", ");")
                .replaceAll("USING BTREE","")
                .replaceAll("`","\"");
        // 替换 MySQL 建表语句中的数据类型和关键字为 SQLite 的等价语句
        for (String key : FIELD_TYPE_MAP.keySet()) {
            // 生成正则表达式,匹配字段类型
            String regex = "\\b" + key + "\\b";
            Pattern pattern2 = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
            Matcher matcher2 = pattern2.matcher(result);

            // 执行替换
            result = matcher2.replaceAll(FIELD_TYPE_MAP.get(key));
        }

        // 返回替换后的 SQLite 建表语句
        return result;
    }

转换前

CREATE TABLE `t_enterprise_info` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `category_id` text COMMENT '企业类别ID',
  `name` varchar(255) DEFAULT NULL COMMENT '企业名称',
  `social_credit_code` varchar(255) DEFAULT NULL COMMENT '社会信用代码',
  `org_code` varchar(255) DEFAULT NULL COMMENT '组织机构代码',
  `address` varchar(255) DEFAULT NULL COMMENT '街(村)、门牌号(实际经营地)',
  `register_address` varchar(255) DEFAULT NULL COMMENT '单位注册地',
  `legal_person` varchar(255) DEFAULT NULL COMMENT '单位法人',
  `open_date` varchar(50) DEFAULT NULL COMMENT '开业时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='企业基本信息表';

转换后

CREATE TABLE "t_enterprise_info" (
  "id" TEXT(32) NOT NULL ,
  "category_id" TEXT ,
  "name" TEXT(255) DEFAULT NULL ,
  "social_credit_code" TEXT(255) DEFAULT NULL ,
  "org_code" TEXT(255) DEFAULT NULL ,
  "address" TEXT(255) DEFAULT NULL ,
  "register_address" TEXT(255) DEFAULT NULL ,
  "legal_person" TEXT(255) DEFAULT NULL ,
  "open_date" TEXT(50) DEFAULT NULL ,
  PRIMARY KEY ("id")
);