Mybatis-plus2.0支持oracle序列

Mybatis-plus2.0支持oracle序列

配置部分

第一步,設置主鍵生成策略keyGenerator爲OracleKeyGenerator

局部

<property name="keyGenerator">
    <bean class="com.baomidou.mybatisplus.incrementer.OracleKeyGenerator"/>
</property>

 

全局

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="mapperLocations" value="classpath*:mappers/**/*.xml" />
	<property name="typeAliasesPackage" value="x.**.x" />
	<property name="globalConfig">
		<bean class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
			<property name="dbColumnUnderline" value="true" />
			
                <!-- 支持oracle序列 -->
			<property name="keyGenerator">
				<bean class="com.baomidou.mybatisplus.incrementer.OracleKeyGenerator"/>
			</property>
		</bean>
	</property>
</bean>

第二步,設置序列(@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<FailOrderMessage> {
​
    private static final long serialVersionUID = -8043398680425490355L;
​
    @TableId(value = "ID_", type = IdType.INPUT)
    private String id;
​
    @TableField("PRO_ID")
    private String proId;
    
    ...

 

完成以上兩個步驟,就大功告成了,insert操作不需要設置主鍵,自動從指定的序列獲取。不設置序列,則自定義主鍵值。

 

源碼部分

實體必須設置主鍵,主鍵類型不是AUTO纔會使用指定的主鍵生成策略,建議設置爲INPUT,不設置序列則需要用戶手動傳入主鍵值

/**
     * <p>
     * 注入插入 SQL 語句
     * </p>
     *
     * @param selective   是否選擇插入
     * @param mapperClass
     * @param modelClass
     * @param table
     */
    protected void injectInsertOneSql(boolean selective, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
        /*
         * INSERT INTO table <trim prefix="(" suffix=")" suffixOverrides=",">
         * <if test="xx != null">xx,</if> </trim> <trim prefix="values ("
         * suffix=")" suffixOverrides=","> <if test="xx != null">#{xx},</if>
         * </trim>
         */
        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<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n");
        placeholderBuilder.append("\n<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\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<TableFieldInfo> 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</trim>");
        placeholderBuilder.append("\n</trim>");
        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以序列生成主鍵

/**
 * <p>
 * Oracle Key Sequence 生成器
 * </p>
 *
 * @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;

 

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