SoFunction
Updated on 2025-03-02

Mybatis-flex integrated Dameng database implementation example

1. Preface:

Under the trend of domestic production, Dameng Database, as a representative of relational databases, occupies a place in domestic databases. Okay, I won’t flatter you anymore. I believe that many people, like me, use the domestic database only if they require the China Soft Cup competition or do information creation projects.

-flex overview:

Mybatis-flex is a framework created for Mybatis enhancement. On the basis of maintaining Mybatis' original advantages, it significantly improves development efficiency and performance by providing more flexible QueryWrapper, supporting multi-table query, join query, subquery and other advanced functions, as well as management and optimization of multiple data sources.

3. Environmental preparation:

3.1 Dameng database installation

refer to:Docker installation | Dameng technical documentation ()

3.2 MySQL migration to dream

refer to:Migrating from MySQL to DM | Dameng Technical Documentation ()

4. Integration steps:

4.1 Add dependencies

Dameng database driver version: 8.1.2.141

            <dependency>
                <groupId></groupId>
                <artifactId>DmJdbcDriver18</artifactId>
                <version>8.1.2.141</version>
            </dependency>

            <dependency>
                <groupId>-flex</groupId>
                <artifactId>mybatis-flex-processor</artifactId>
                <version>1.8.9</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>-flex</groupId>
                <artifactId>mybatis-flex-codegen</artifactId>
                <version>1.8.9</version>
            </dependency>

4.2 Configuring the code generator

public class Codegen {

   static class MyDialect extends AbstractJdbcDialect {

//Add double quotes       @Override
       protected String forBuildColumnsSql(String schema, String tableName) {
           return "SELECT * FROM " + ((schema) ? schema + ".\"" : "") + tableName + "\" WHERE 1 = 2";
       }
    }

    public static void main(String[] args) {
        //Configure data source        HikariDataSource dataSource = new HikariDataSource();
        ("");
        //url
        ("jdbc:dm://192.168.123.80:30236");
        //username        ("SYSDBA");
        //password        ("SYSDBA001");


        //Create configuration content, both styles are OK.        GlobalConfig globalConfig = createGlobalConfigUseStyle1();
        ("RC");
        //Create code generators through datasource and globalConfig        Generator generator = new Generator(dataSource, globalConfig,new MyDialect());
        //The name of the database schema        ("RC");

        //Generate code        ();
    }

    public static GlobalConfig createGlobalConfigUseStyle1() {
        //Create configuration content        GlobalConfig globalConfig = new GlobalConfig();
       
        //Set the root package        ()
                .setBasePackage("");
        //Set the generated entity and enable Lombok        ()
                .setWithLombok(true)
                .setWithBasePackage("po")
                .setJdkVersion(17);
        ();
        ();
        ();
        //The address generated by the code        ("F:\\Java\\rural-classroom\\rc-pojo\\src\\main\\java");
        return globalConfig;
    }
}

4. Configuration

Remember to change url, username, password to your own

spring:
  datasource:
    driver-class-name: 
    url: jdbc:dm://10.2.17.218:30236?clobAsString=1
    username: SYSDBA
    password: SYSDBA001

4.4 Configuring database dialect

For example, the keywords such as order, comment, and user are subject to keywords that need to be escaped in double quotes.

public class MyDmDialect extends CommonsDialectImpl {
    public static final Set&lt;String&gt; keywords = (
            "ACCESS", "ELSE", "MODIFY", "START", "ADD", "EXCLUSIVE", "NOAUDIT", "SELECT",
            "ALL", "EXISTS", "NOCOMPRESS", "SESSION", "ALTER", "FILE", "NOT", "SET", "AND", "FLOAT",
            "NOTFOUND", "SHARE", "ANY", "FOR", "NOWAIT", "SIZE", "ARRAYLEN", "FROM", "NULL", "SMALLINT",
            "AS", "GRANT", "NUMBER", "SQLBUF", "ASC", "GROUP", "OF", "SUCCESSFUL", "AUDIT", "HAVING",
            "OFFLINE", "SYNONYM", "BETWEEN", "IDENTIFIED", "ON", "SYSDATE", "BY", "IMMEDIATE", "ONLINE",
            "TABLE", "CHAR", "IN", "OPTION", "THEN", "CHECK", "INCREMENT", "OR", "TO", "CLUSTER", "INDEX",
            "ORDER", "TRIGGER", "COLUMN", "INITIAL", "PCTFREE", "UID", "COMMENT", "INSERT", "PRIOR",
            "UNION", "COMPRESS", "INTEGER", "PRIVILEGES", "UNIQUE", "CONNECT", "INTERSECT", "PUBLIC",
            "UPDATE", "CREATE", "INTO", "RAW", "USER", "CURRENT", "IS", "RENAME", "VALIDATE", "DATE", "LEVEL",
            "RESOURCE", "VALUES", "DECIMAL", "LIKE", "REVOKE", "VARCHAR", "DEFAULT", "LOCK", "ROW", "VARCHAR2",
            "DELETE", "LONG", "ROWID", "VIEW", "DESC", "MAXEXTENTS", "ROWLABEL", "WHENEVER", "DISTINCT", "MINUS",
            "ROWNUM", "WHERE", "DROP", "MODE", "ROWS", "WITH", "ADMIN", "CURSOR", "FOUND", "MOUNT", "AFTER", "CYCLE",
            "FUNCTION", "NEXT", "ALLOCATE", "DATABASE", "GO", "NEW", "ANALYZE", "DATAFILE", "GOTO", "NOARCHIVELOG",
            "ARCHIVE", "DBA", "GROUPS", "NOCACHE", "ARCHIVELOG", "DEC", "INCLUDING", "NOCYCLE", "AUTHORIZATION",
            "DECLARE", "INDICATOR", "NOMAXVALUE", "AVG", "DISABLE", "INITRANS", "NOMINVALUE", "BACKUP", "DISMOUNT",
            "INSTANCE", "NONE", "BEGIN", "DOUBLE", "INT", "NOORDER", "BECOME", "DUMP", "KEY", "NORESETLOGS", "BEFORE",
            "EACH", "LANGUAGE", "NORMAL", "BLOCK", "ENABLE", "LAYER", "NOSORT", "BODY", "END", "LINK", "NUMERIC", "CACHE",
            "ESCAPE", "LISTS", "OFF", "CANCEL", "EVENTS", "LOGFILE", "OLD", "CASCADE", "EXCEPT", "MANAGE", "ONLY", "CHANGE",
            "EXCEPTIONS", "MANUAL", "OPEN", "CHARACTER", "EXEC", "MAX", "OPTIMAL", "CHECKPOINT", "EXPLAIN", "MAXDATAFILES",
            "OWN", "CLOSE", "EXECUTE", "MAXINSTANCES", "PACKAGE", "COBOL", "EXTENT", "MAXLOGFILES", "PARALLEL", "COMMIT",
            "EXTERNALLY", "MAXLOGHISTORY", "PCTINCREASE", "COMPILE", "FETCH", "MAXLOGMEMBERS", "PCTUSED", "CONSTRAINT",
            "FLUSH", "MAXTRANS", "PLAN", "CONSTRAINTS", "FREELIST", "MAXVALUE", "PLI", "CONTENTS", "FREELISTS", "MIN",
            "PRECISION", "CONTINUE", "FORCE", "MINEXTENTS", "PRIMARY", "CONTROLFILE", "FOREIGN", "MINVALUE", "PRIVATE",
            "COUNT", "FORTRAN", "MODULE", "PROCEDURE", "PROFILE", "SAVEPOINT", "SQLSTATE", "TRACING", "QUOTA", "SCHEMA",
            "STATEMENT_ID", "TRANSACTION", "READ", "SCN", "STATISTICS", "TRIGGERS", "REAL", "SECTION", "STOP", "TRUNCATE",
            "RECOVER", "SEGMENT", "STORAGE", "UNDER", "REFERENCES", "SEQUENCE", "SUM", "UNLIMITED", "REFERENCING", "SHARED",
            "SWITCH", "UNTIL", "RESETLOGS", "SNAPSHOT", "SYSTEM", "USE", "RESTRICTED", "SOME", "TABLES", "USING", "REUSE",
            "SORT", "TABLESPACE", "WHEN", "ROLE", "SQL", "TEMPORARY", "WRITE", "ROLES", "SQLCODE", "THREAD", "WORK", "ROLLBACK",
            "SQLERROR", "TIME", "ABORT", "BETWEEN", "CRASH", "DIGITS", "ACCEPT", "BINARY_INTEGER", "CREATE", "DISPOSE", "ACCESS",
            "BODY", "CURRENT", "DISTINCT", "ADD", "BOOLEAN", "CURRVAL", "DO", "ALL", "BY", "CURSOR", "DROP", "ALTER", "CASE", "DATABASE",
            "ELSE", "AND", "CHAR", "DATA_BASE", "ELSIF", "ANY", "CHAR_BASE", "DATE", "END", "ARRAY", "CHECK", "DBA", "ENTRY", "ARRAYLEN",
            "CLOSE", "DEBUGOFF", "EXCEPTION", "AS", "CLUSTER", "DEBUGON", "EXCEPTION_INIT", "ASC", "CLUSTERS", "DECLARE", "EXISTS",
            "ASSERT", "COLAUTH", "DECIMAL", "EXIT", "ASSIGN", "COLUMNS", "DEFAULT", "FALSE", "AT", "COMMIT", "DEFINITION", "FETCH",
            "AUTHORIZATION", "COMPRESS", "DELAY", "FLOAT", "AVG", "CONNECT", "DELETE", "FOR", "BASE_TABLE", "CONSTANT", "DELTA", "FORM",
            "BEGIN", "COUNT", "DESC", "FROM", "FUNCTION", "NEW", "RELEASE", "SUM", "GENERIC", "NEXTVAL", "REMR", "TABAUTH",
            "GOTO", "NOCOMPRESS", "RENAME", "TABLE", "GRANT", "NOT", "RESOURCE", "TABLES", "GROUP", "NULL", "RETURN", "TASK", "HAVING",
            "NUMBER", "REVERSE", "TERMINATE", "IDENTIFIED", "NUMBER_BASE", "REVOKE", "THEN", "IF", "OF", "ROLLBACK", "TO", "IN", "ON",
            "ROWID", "TRUE", "INDEX", "OPEN", "ROWLABEL", "TYPE", "INDEXES", "OPTION", "ROWNUM", "UNION", "INDICATOR", "OR", "ROWTYPE",
            "UNIQUE", "INSERT", "ORDER", "RUN", "UPDATE", "INTEGER", "OTHERS", "SAVEPOINT", "USE", "INTERSECT", "OUT", "SCHEMA", "VALUES",
            "INTO", "PACKAGE", "SELECT", "VARCHAR", "IS", "PARTITION", "SEPARATE", "VARCHAR2", "LEVEL", "PCTFREE", "SET", "VARIANCE",
            "LIKE", "POSITIVE", "SIZE", "VIEW", "LIMITED", "PRAGMA", "SMALLINT", "VIEWS", "LOOP", "PRIOR", "SPACE", "WHEN", "MAX", "PRIVATE",
            "SQL", "WHERE", "MIN", "PROCEDURE", "SQLCODE", "WHILE", "MINUS", "PUBLIC", "SQLERRM", "WITH", "MLSLABEL", "RAISE", "START",
            "WORK", "MOD", "RANGE", "STATEMENT", "XOR", "MODE", "REAL", "STDDEV", "NATURAL", "RECORD", "SUBTYPE", "GEN", "KP", "L",
            "NA", "NC", "ND", "NL", "NM", "NR", "NS", "NT", "NZ", "TTC", "UPI", "O", "S", "XA"

    );

    public MyDmDialect() {
        this();
    }

    public MyDmDialect(LimitOffsetProcessor limitOffsetProcessor) {
        // When the above keywords appear, add ""        this(new KeywordWrap(false, true, keywords, "\"", "\""), limitOffsetProcessor);
    }

    public MyDmDialect(KeywordWrap keywordWrap, LimitOffsetProcessor limitOffsetProcessor) {
        super(keywordWrap, limitOffsetProcessor);
    }
}

Set to flex

@Configuration
public class FlexConfig implements ConfigurationCustomizer {
    public FlexConfig(){
        (,new MyDmDialect());
        ().setDbType();
    }
}

Here you can be cruded as before

5 possible problems and solutions.

5.1 does not support data processing of LocalDateTime class.

The old version of Dameng does not support converting timestamps to LocalDateTime. The 8.1.2.141 used here is OK, but if you use the lower version for special reasons, you can write a TypeHandler to convert the data by yourself.

5.2 Problems with long text display

Long text types such as text type Dameng driver will encapsulate it with Clob type instead of String type. At this time, you need to configure clobAsString=1 on the url.

This is the article about the implementation example of Mybatis-flex integration Dameng database. For more related contents of Mybatis-flex integration Dameng database, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!