Mybatis-flex整合達(dá)夢(mèng)數(shù)據(jù)庫的實(shí)現(xiàn)示例
1.前言:
國產(chǎn)化趨勢(shì)下,達(dá)夢(mèng)數(shù)據(jù)庫作為作為關(guān)系型數(shù)據(jù)庫的代表,在國產(chǎn)數(shù)據(jù)庫中占據(jù)一席之地。好了,不拍馬屁了相信很多人和我一樣是中軟杯賽項(xiàng)要求或者做信創(chuàng)項(xiàng)目才會(huì)用國產(chǎn)數(shù)據(jù)庫的??。
2.Mybatis-flex概述:
Mybatis-flex是一個(gè)為Mybatis增強(qiáng)而生的框架,它在保持Mybatis原有優(yōu)勢(shì)的基礎(chǔ)上,通過提供更靈活的QueryWrapper、支持多表查詢、聯(lián)接查詢、子查詢等高級(jí)功能,以及對(duì)多數(shù)據(jù)源的管理和優(yōu)化,顯著提升了開發(fā)效率和性能。
3.環(huán)境準(zhǔn)備:
3.1達(dá)夢(mèng)數(shù)據(jù)庫安裝
參考:Docker安裝 | 達(dá)夢(mèng)技術(shù)文檔 (dameng.com)
3.2mysql遷移達(dá)夢(mèng)、
參考:從 MySQL 移植到 DM | 達(dá)夢(mèng)技術(shù)文檔 (dameng.com)
4.整合步驟:
4.1添加依賴
達(dá)夢(mèng)數(shù)據(jù)庫驅(qū)動(dòng)版本:8.1.2.141
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.2.141</version>
</dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-processor</artifactId>
<version>1.8.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-codegen</artifactId>
<version>1.8.9</version>
</dependency>4.2配置代碼生成器
public class Codegen {
static class MyDialect extends AbstractJdbcDialect {
//添加雙引號(hào)
@Override
protected String forBuildColumnsSql(String schema, String tableName) {
return "SELECT * FROM " + (StringUtil.isNotBlank(schema) ? schema + ".\"" : "") + tableName + "\" WHERE 1 = 2";
}
}
public static void main(String[] args) {
//配置數(shù)據(jù)源
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName("dm.jdbc.driver.DmDriver");
//url
dataSource.setJdbcUrl("jdbc:dm://192.168.123.80:30236");
//用戶名
dataSource.setUsername("SYSDBA");
//密碼
dataSource.setPassword("SYSDBA001");
//創(chuàng)建配置內(nèi)容,兩種風(fēng)格都可以。
GlobalConfig globalConfig = createGlobalConfigUseStyle1();
globalConfig.setGenerateSchema("RC");
//通過 datasource 和 globalConfig 創(chuàng)建代碼生成器
Generator generator = new Generator(dataSource, globalConfig,new MyDialect());
//數(shù)據(jù)庫模式的名稱
dataSource.setSchema("RC");
//生成代碼
generator.generate();
}
public static GlobalConfig createGlobalConfigUseStyle1() {
//創(chuàng)建配置內(nèi)容
GlobalConfig globalConfig = new GlobalConfig();
//設(shè)置根包
globalConfig.getPackageConfig()
.setBasePackage("com.rc.pojo.po");
//設(shè)置生成 entity 并啟用 Lombok
globalConfig.enableEntity()
.setWithLombok(true)
.setWithBasePackage("po")
.setJdkVersion(17);
globalConfig.enableController();
globalConfig.enableTableDef();
globalConfig.enableMapper();
//代碼生成的地址
globalConfig.setSourceDir("F:\\Java\\rural-classroom\\rc-pojo\\src\\main\\java");
return globalConfig;
}
}
4.3application.yml配置
url、username、password記得改成自己的
spring:
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://10.2.17.218:30236?clobAsString=1
username: SYSDBA
password: SYSDBA0014.4配置數(shù)據(jù)庫方言
例如order、comment、user這些詞在達(dá)夢(mèng)中屬于關(guān)鍵字需要用雙引號(hào)轉(zhuǎn)義
public class MyDmDialect extends CommonsDialectImpl {
public static final Set<String> keywords = CollectionUtil.newHashSet(
"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(LimitOffsetProcessor.MYSQL);
}
public MyDmDialect(LimitOffsetProcessor limitOffsetProcessor) {
//出現(xiàn)以上關(guān)鍵字時(shí),添加 ""
this(new KeywordWrap(false, true, keywords, "\"", "\""), limitOffsetProcessor);
}
public MyDmDialect(KeywordWrap keywordWrap, LimitOffsetProcessor limitOffsetProcessor) {
super(keywordWrap, limitOffsetProcessor);
}
}設(shè)置到flex中
@Configuration
public class FlexConfig implements ConfigurationCustomizer {
public FlexConfig(){
DialectFactory.registerDialect(DbType.DM,new MyDmDialect());
FlexGlobalConfig.getDefaultConfig().setDbType(DbType.DM);
}
}
到這里就可以像以前一樣crud了
5可能遇到的問題和解決方案。
5.1不支持LocalDateTime類的數(shù)據(jù)處理。
舊版本達(dá)夢(mèng)處理不支持將時(shí)間戳轉(zhuǎn)為L(zhǎng)ocalDateTime,這里用的8.1.2.141是可以的,但是如果因?yàn)樘厥庠蚴褂玫桶姹究梢宰约簩懸粋€(gè)TypeHandler把數(shù)據(jù)轉(zhuǎn)一下
5.2長(zhǎng)文本顯示問題
長(zhǎng)文本類型如text類型達(dá)夢(mèng)驅(qū)動(dòng)會(huì)把它用Clob類型封裝而不是String類型,這時(shí)候需要在url上配置clobAsString=1
到此這篇關(guān)于Mybatis-flex整合達(dá)夢(mèng)數(shù)據(jù)庫的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Mybatis-flex整合達(dá)夢(mèng)數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Flex實(shí)現(xiàn)分頁查詢的示例代碼
- Spring Boot整合MyBatis-Flex全過程
- SpringBoot使用MyBatis-Flex實(shí)現(xiàn)靈活的數(shù)據(jù)庫訪問
- mybatis-flex實(shí)現(xiàn)鏈?zhǔn)讲僮鞯氖纠a
- mybatis-flex實(shí)現(xiàn)多數(shù)據(jù)源操作
- MyBatis-Flex實(shí)現(xiàn)多表聯(lián)查(自動(dòng)映射)
- Springboot集成Mybatis-Flex的示例詳解
- mybatis-flex與springBoot整合的實(shí)現(xiàn)示例
- MyBatis-Flex 邏輯刪除的用法小結(jié)
相關(guān)文章
Spring?容器初始化?register?與?refresh方法
這篇文章主要介紹了Spring?容器初始化?register?與?refresh方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
SpringBoot應(yīng)用監(jiān)控帶郵件警報(bào)的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot應(yīng)用監(jiān)控帶郵件警報(bào)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
java通過isAccessAllowed方法實(shí)現(xiàn)訪問控制
在Web應(yīng)用開發(fā)中,使用Apache Shiro框架的isAccessAllowed方法可以有效管理用戶的訪問權(quán)限,本文詳細(xì)解析了該方法的實(shí)現(xiàn)過程,包括用戶身份驗(yàn)證、權(quán)限判斷和安全性分析,下面就一起來了解一下2024-09-09
解讀yml文件中配置時(shí)間類型的轉(zhuǎn)換方式
這篇文章主要介紹了yml文件中配置時(shí)間類型的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Spring從@Aspect到Advisor使用演示實(shí)例
這篇文章主要介紹了Spring從@Aspect到Advisor使用演示實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
Java CompletableFuture如何實(shí)現(xiàn)超時(shí)功能
這篇文章主要為大家介紹了實(shí)現(xiàn)超時(shí)功能的基本思路以及CompletableFuture(之后簡(jiǎn)稱CF)是如何通過代碼實(shí)現(xiàn)超時(shí)功能的,需要的小伙伴可以了解下2025-01-01
Mybatis詳細(xì)對(duì)比一級(jí)緩存與二級(jí)緩存
MyBatis 包含一個(gè)非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制,緩存可以極大的提升查詢效率。MyBatis中默認(rèn)定義了兩級(jí)緩存,分別是一級(jí)緩存和二級(jí)緩存2022-10-10

