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: SYSDBA001
4.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)為LocalDateTime,這里用的8.1.2.141是可以的,但是如果因?yàn)樘厥庠蚴褂玫桶姹究梢宰约簩懸粋€(gè)TypeHandler把數(shù)據(jù)轉(zhuǎn)一下
5.2長文本顯示問題
長文本類型如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-07SpringBoot應(yīng)用監(jiān)控帶郵件警報(bào)的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot應(yīng)用監(jiān)控帶郵件警報(bào)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02java通過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-12Spring從@Aspect到Advisor使用演示實(shí)例
這篇文章主要介紹了Spring從@Aspect到Advisor使用演示實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02Java CompletableFuture如何實(shí)現(xiàn)超時(shí)功能
這篇文章主要為大家介紹了實(shí)現(xiàn)超時(shí)功能的基本思路以及CompletableFuture(之后簡稱CF)是如何通過代碼實(shí)現(xiàn)超時(shí)功能的,需要的小伙伴可以了解下2025-01-01Mybatis詳細(xì)對(duì)比一級(jí)緩存與二級(jí)緩存
MyBatis 包含一個(gè)非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制,緩存可以極大的提升查詢效率。MyBatis中默認(rèn)定義了兩級(jí)緩存,分別是一級(jí)緩存和二級(jí)緩存2022-10-10