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<String> 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!