Mybatis-plus2.0支持oracle序列

Mybatis-plus2.0支持oracle序列

配置部分

第一步,设置主键生成策略keyGenerator为OracleKeyGenerator

局部


    

 

全局


	
	
	
	
		
			
			
                
			
				
			
		
	

第二步,设置序列(@KeySequence)和主键类型(IdType)

clazz 指定主键的类型,IdType必须设置,且不能是AUTO,后面附有源码

@TableName("VZ_FAIL_ORDER_MESSAGE")
@KeySequence(value = "SEQ_VZ_FAIL_ORDER_MESSAGE", clazz = String.class)
public class FailOrderMessage extends BaseModel {
​
    private static final long serialVersionUID = -8043398680425490355L;
​
    @TableId(value = "ID_", type = IdType.INPUT)
    private String id;
​
    @TableField("PRO_ID")
    private String proId;
    
    ...

 

完成以上两个步骤,就大功告成了,insert操作不需要设置主键,自动从指定的序列获取。不设置序列,则自定义主键值。

 

源码部分

实体必须设置主键,主键类型不是AUTO才会使用指定的主键生成策略,建议设置为INPUT,不设置序列则需要用户手动传入主键值

/**
     * 

    * 注入插入 SQL 语句     *

    *     * @param selective   是否选择插入     * @param mapperClass     * @param modelClass     * @param table     */    protected void injectInsertOneSql(boolean selective, Class mapperClass, Class modelClass, TableInfo table) {        /*         * INSERT INTO table * xx, #{xx}, * */        KeyGenerator keyGenerator = new NoKeyGenerator();        StringBuilder fieldBuilder = new StringBuilder();        StringBuilder placeholderBuilder = new StringBuilder();        SqlMethod sqlMethod = selective ? SqlMethod.INSERT_ONE : SqlMethod.INSERT_ONE_ALL_COLUMN; ​        fieldBuilder.append("\n\n");        placeholderBuilder.append("\n\n");        String keyProperty = null;        String keyColumn = null; ​        // 表包含主键处理逻辑,如果不包含主键当普通字段处理        if (StringUtils.isNotEmpty(table.getKeyProperty())) {            if (table.getIdType() == IdType.AUTO) { /* 自增主键 */                keyGenerator = new Jdbc3KeyGenerator();                keyProperty = table.getKeyProperty();                keyColumn = table.getKeyColumn();           } else {                if (null != table.getKeySequence()) {                    keyGenerator = TableInfoHelper.genKeyGenerator(table, builderAssistant, sqlMethod.getMethod(), languageDriver);                    keyProperty = table.getKeyProperty();                    keyColumn = table.getKeyColumn();                    fieldBuilder.append(table.getKeyColumn()).append(",");                    placeholderBuilder.append("#{").append(table.getKeyProperty()).append("},");               } else {           /* 用户输入自定义ID */                    fieldBuilder.append(table.getKeyColumn()).append(",");                    // 正常自定义主键策略                    placeholderBuilder.append("#{").append(table.getKeyProperty()).append("},");               }           }       } ​        // 是否 IF 标签判断        boolean ifTag;        List fieldList = table.getFieldList();        for (TableFieldInfo fieldInfo : fieldList) {            // 在FieldIgnore,INSERT_UPDATE,INSERT 时设置为false            ifTag = !(FieldFill.INSERT == fieldInfo.getFieldFill()                    || FieldFill.INSERT_UPDATE == fieldInfo.getFieldFill());            if (selective && ifTag) {                fieldBuilder.append(convertIfTagIgnored(fieldInfo, false));                fieldBuilder.append(fieldInfo.getColumn()).append(",");                fieldBuilder.append(convertIfTagIgnored(fieldInfo, true));                placeholderBuilder.append(convertIfTagIgnored(fieldInfo, false));                placeholderBuilder.append("#{").append(fieldInfo.getEl()).append("},");                placeholderBuilder.append(convertIfTagIgnored(fieldInfo, true));           } else {                fieldBuilder.append(fieldInfo.getColumn()).append(",");                placeholderBuilder.append("#{").append(fieldInfo.getEl()).append("},");           }       }        fieldBuilder.append("\n");        placeholderBuilder.append("\n");        String sql = String.format(sqlMethod.getSql(), table.getTableName(), fieldBuilder.toString(),                placeholderBuilder.toString());        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);        this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource, keyGenerator, keyProperty,                keyColumn);   }

 

oracle以序列生成主键

/**
 * 

* Oracle Key Sequence 生成器 *

* * @author hubin * @Date 2017-05-08 */ public class OracleKeyGenerator implements IKeyGenerator { ​    @Override    public String executeSql(String incrementerName) {        StringBuilder sql = new StringBuilder();        sql.append("SELECT ").append(incrementerName);        sql.append(".NEXTVAL FROM DUAL");        return sql.toString();   } }

 

创建序列

CREATE SEQUENCE SEQ_VZ_FAIL_ORDER_MESSAGE 1 MAXVALUE 9999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 100;

 

你可能感兴趣的:(JAVA,mybatis-plus,sequence)