001/**
002 * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package com.mybatisflex.core.keygen;
017
018import com.mybatisflex.core.table.IdInfo;
019import com.mybatisflex.core.table.TableInfo;
020import org.apache.ibatis.executor.Executor;
021import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
022import org.apache.ibatis.executor.keygen.KeyGenerator;
023import org.apache.ibatis.mapping.MappedStatement;
024
025import java.sql.Statement;
026import java.util.ArrayList;
027import java.util.List;
028
029/**
030 * 多主键、复合主键 id 生成器
031 */
032public class MultiPrimaryKeyGenerator implements KeyGenerator, IMultiKeyGenerator {
033
034    private List<KeyGenerator> keyGenerators;
035
036    //所有自增字段的名称
037    private String[] autoGenKeyColumnNames;
038
039    public MultiPrimaryKeyGenerator(MappedStatement mappedStatement, TableInfo tableInfo, List<IdInfo> primaryKeyList) {
040        this.keyGenerators = new ArrayList<>();
041
042        List<String> autoGenKeyColumnNameList = new ArrayList<>();
043        for (IdInfo idInfo : primaryKeyList) {
044            KeyGenerator idKeyGenerator = MybatisKeyGeneratorUtil.createIdKeyGenerator(tableInfo, mappedStatement, idInfo);
045            keyGenerators.add(idKeyGenerator);
046            if (idKeyGenerator == Jdbc3KeyGenerator.INSTANCE) {
047                autoGenKeyColumnNameList.add(idInfo.getColumn());
048            }
049        }
050
051        this.autoGenKeyColumnNames = autoGenKeyColumnNameList.toArray(new String[0]);
052    }
053
054    @Override
055    public void processBefore(Executor executor, MappedStatement ms, Statement stmt, Object parameter) {
056        for (KeyGenerator keyGenerator : keyGenerators) {
057            keyGenerator.processBefore(executor, ms, stmt, parameter);
058        }
059    }
060
061
062    @Override
063    public void processAfter(Executor executor, MappedStatement ms, Statement stmt, Object parameter) {
064        for (KeyGenerator keyGenerator : keyGenerators) {
065            keyGenerator.processAfter(executor, ms, stmt, parameter);
066        }
067    }
068
069    /**
070     * 是否需要数据库 自动生成主键
071     *
072     * @return true: need generated keys
073     */
074    @Override
075    public boolean isNeedGeneratedKeys() {
076        for (KeyGenerator keyGenerator : keyGenerators) {
077            if (keyGenerator == Jdbc3KeyGenerator.INSTANCE) {
078                return true;
079            }
080        }
081        return false;
082    }
083
084    /**
085     * 自动生成主键的 columns 字段
086     *
087     * @return keyColumnNames
088     */
089    @Override
090    public String[] getKeyColumnNames() {
091        return autoGenKeyColumnNames;
092    }
093
094
095}