实现通用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;

 

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