實現通用mapper主鍵策略兼容mysql和oracle

【原創文章,轉載請註明原文章地址,謝謝!】

1.直接用官方提供的註解方法是無法達到兼容效果的

2.跟蹤源碼看看是否有其他方法

3.這裏有個genSql,可以看一下這個類

 4.創建一個自定義的處理類實現GenSql(代碼中是我實際項目中用到的策略,部分代碼可以忽略)

package com.wisedu.common.handle;

import com.wisedu.common.utils.EnvironmentUtil;
import com.wisedu.common.utils.StringUtils;
import lombok.Data;
import tk.mybatis.mapper.code.ORDER;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.entity.EntityTable;
import tk.mybatis.mapper.gensql.GenSql;
import javax.persistence.Table;

/**
 * @Author meiwenjun
 * @Description 主鍵策略handle
 * @Date 2020/3/5
 */
@Data
public class GenSqlHandle implements GenSql {

    @Override
    public String genSql(EntityTable entityTable, EntityColumn entityColumn) {
        if (StringUtils.isNotEmpty(EnvironmentUtil.getEnvironment())) {

            Class<?> entityClass = entityTable.getEntityClass();
            if (!entityClass.isAnnotationPresent(Table.class)) {
                throw new RuntimeException(entityClass.getName() + "類上必須指定@Table註解");
            }
            String environment = EnvironmentUtil.getEnvironment();
            if (environment.contains("oracle")) {
                entityColumn.setOrder(ORDER.BEFORE);
//                entityColumn.setUseJavaType(true);
                //獲取表名
                Table classAnnotation = entityClass.getAnnotation(Table.class);
                //拼接序列名稱
                String sequenceName = StringUtils.substringAfter(classAnnotation.name().toLowerCase(), "pms_") + "_seq";
                return "SELECT " + sequenceName + ".nextval from dual";
            } else {
                entityColumn.setOrder(ORDER.AFTER);
                return "SELECT LAST_INSERT_ID()";
            }
        }else {
            throw new RuntimeException("獲取環境變量失敗");
        }
    }
}

5.POJO類中可以用以下註解即可(@KeySql(gensql = GenSqlHandle.class)

    @Id
    @KeySql(genSql = GenSqlHandle.class)
    private Integer id;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章