通用mapper用oracle序列作為主鍵
通用mapper用oracle序列作為主鍵
最近使用通用mapper開發專案,公司用的oracle資料庫,持久層用的是通用mapper,公司要求用資料庫的序列,按照官方的配置,可能是自己的原因,總是配置不對,自己看了一下原始碼,發現用key註解就可以實現,具體配置如下:
@Id
@Column(name = "id")
@KeySql(sql = "select SEQ_ID.nextval from dual", order= ORDER.DEFAULT)
private Integer id;
平常用mybatis的時候,mybatis 有個selectKey標籤,那麼通用mapper應該是啟動的時候把註解的內容封裝成selectKey了。於是找到了BaseInsertProvider這個類。
public String insert(MappedStatement ms) {
Class<?> entityClass = getEntityClass(ms);
}
這個insert方法就是儲存的方法,getEntityClass就是解析實體。點進去看一下。
public Class<?> getEntityClass(MappedStatement ms) {
EntityHelper.initEntityNameMap(returnType, mapperHelper.getConfig());
}
找到了initEntityNameMap 方法,再跟進去。
public static synchronized void initEntityNameMap(Class<?> entityClass, Config config) {
if (entityTableMap.get(entityClass) != null) {
return;
}
//建立並快取EntityTable
EntityTable entityTable = resolve.resolveEntity(entityClass, config);
entityTableMap.put(entityClass, entityTable);
}
終於找到了解析resolve.resolveEntity(entityClass, config),點進去看看。
應為註解是寫的在Id欄位上的,我們就重點看解析field的方法。
for (EntityField field : fields) {
if (config.isUseSimpleType()){
//省略了一些方法
processField(entityTable, field, config, style);
}
然後看processField,找到處理主鍵的方法。
//處理主鍵策略
processKeyGenerator(entityTable, field, entityColumn);
protected void processKeyGenerator(EntityTable entityTable, EntityField field, EntityColumn entityColumn) {
//KeySql 優先順序最高
if (field.isAnnotationPresent(KeySql.class)) {
processKeySql(entityTable, entityColumn, field.getAnnotation(KeySql.class));
} else if (field.isAnnotationPresent(GeneratedValue.class)) {
//執行 sql - selectKey
processGeneratedValue(entityTable, entityColumn, field.getAnnotation(GeneratedValue.class));
}
}
看到了keysql 這個註解,於是看下面是怎麼處理的。
protected void processKeySql(EntityTable entityTable, EntityColumn entityColumn, KeySql keySql) {
if (keySql.useGeneratedKeys()) {
entityColumn.setIdentity(true);
entityColumn.setGenerator("JDBC");
entityTable.setKeyProperties(entityColumn.getProperty());
entityTable.setKeyColumns(entityColumn.getColumn());
} else if (keySql.dialect() == IdentityDialect.DEFAULT) {
entityColumn.setIdentity(true);
entityColumn.setOrder(ORDER.AFTER);
} else if (keySql.dialect() != IdentityDialect.NULL) {
//自動增長
entityColumn.setIdentity(true);
entityColumn.setOrder(ORDER.AFTER);
entityColumn.setGenerator(keySql.dialect().getIdentityRetrievalStatement());
} else if (StringUtil.isNotEmpty(keySql.sql())){
entityColumn.setIdentity(true);
entityColumn.setOrder(keySql.order());
entityColumn.setGenerator(keySql.sql());
} else if (keySql.genSql() != GenSql.NULL.class){
entityColumn.setIdentity(true);
entityColumn.setOrder(keySql.order());
try {
GenSql genSql = keySql.genSql().newInstance();
entityColumn.setGenerator(genSql.genSql(entityTable, entityColumn));
} catch (Exception e) {
log.error("例項化 GenSql 失敗: " + e, e);
throw new MapperException("例項化 GenSql 失敗: " + e, e);
}
} else if(keySql.genId() != GenId.NULL.class){
entityColumn.setIdentity(false);
entityColumn.setGenIdClass(keySql.genId());
} else {
throw new MapperException(entityTable.getEntityClass().getCanonicalName()
+ " 類中的 @KeySql 註解配置無效!");
}
}
}
這裡面就是一些判斷邏輯。於是我們用註解就可以實現了。
以上文章就是記錄一下自己的心得,有不正之處,希望大家多多指點。
相關文章
- NotesAtRandom——通用MapperrandomAPP
- MyBatis外掛 - 通用mapperMyBatisAPP
- SpringBoot快速整合通用MapperSpring BootAPP
- mybatis通用mapper原始碼解析(一)MyBatisAPP原始碼
- mybatis通用mapper原始碼解析(二)MyBatisAPP原始碼
- 通用mapper和分類實現APP
- 通用mapper、圖片上傳、nginxAPPNginx
- Spring Boot整合MyBatis實現通用MapperSpring BootMyBatisAPP
- SpringBoot第六篇:整合通用MapperSpring BootAPP
- oracle增加主鍵也不會了Oracle
- 開發一個MyBatis通用Mapper的輪子MyBatisAPP
- 陣列作為函式引數陣列函式
- 主鍵為聯合主鍵時,索引B+樹結構索引
- Oracle 單機切換為主備Oracle
- ORACLE批量刪除無主鍵重複資料Oracle
- 如何在Oracle表中選擇主鍵列BWOracle
- EBS:主鍵ID欄位預設值來源於序號
- oracle 12c主機徹底掛機用failover把備機設定為主機OracleAI
- Oracle RAC一鍵部署001(主機環境校驗)Oracle
- oracle 序列值導致的主鍵衝突問題Oracle
- C語言用二維陣列作為函式入口引數的小結C語言陣列函式
- Oracle實現自增列(序列+觸發器實現、Identity Columns新特性、序列作為預設值)Oracle觸發器IDE
- 從零搭建Spring Boot腳手架(4):手寫Mybatis通用MapperSpring BootMyBatisAPP
- 不要使用業務鍵作為資料庫主鍵資料庫
- oracle中檢視一張表是否有主鍵,主鍵在哪個欄位上Oracle
- 二維陣列作為引數傳遞問題陣列
- oracle主鍵序列的建立,刪除,修改序列起始值Oracle
- PostgreSQL中UUID v7作為主鍵SQLUI
- mybatis oracle資料庫批次插入資料,忽略主鍵重複MyBatisOracle資料庫
- Oracle impdp遷移資料後主鍵丟失故障處理Oracle
- CTF逆向:將陣列作為函式程式碼執行陣列函式
- mobaxterm用alt鍵作為meta鍵的方法
- Mybatis通用mapper獲得insert後的資料實體的自增IDMyBatisAPP
- Springboot 整合通用mapper和pagehelper展示分頁資料(附github原始碼)Spring BootAPPGithub原始碼
- 主鍵命名
- 主鍵和外來鍵
- PHP 陣列作為列表使用時應當遵循的規範PHP陣列
- Spring Boot從入門到實戰:整合通用Mapper簡化單表操作Spring BootAPP