All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.mybatisboost.mapper.provider.Insert Maven / Gradle / Ivy

The newest version!
package cn.mybatisboost.mapper.provider;

import cn.mybatisboost.core.Configuration;
import cn.mybatisboost.core.ConfigurationAware;
import cn.mybatisboost.core.SqlProvider;
import cn.mybatisboost.util.*;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.reflection.MetaObject;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Insert implements SqlProvider, ConfigurationAware {

    private Configuration configuration;

    @Override
    public void replace(Connection connection, MetaObject metaObject, MappedStatement mappedStatement, BoundSql boundSql) {
        Class entityType = MapperUtils.getEntityTypeFromMapper
                (mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.')));
        StringBuilder sqlBuilder = new StringBuilder();
        sqlBuilder.append("INSERT INTO ").append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor()));

        Map parameterMap = (Map) boundSql.getParameterObject();
        Object entity = parameterMap.get("param1");
        List entities;
        if (entity instanceof List) {
            entities = (List) entity;
            if (entities.isEmpty()) {
                throw new IllegalArgumentException("Can't insert empty list");
            }
            entity = entities.iterator().next();
        } else {
            entities = Collections.singletonList(entity);
        }

        boolean selective = mappedStatement.getId().endsWith("Selective");
        String[] candidateProperties = (String[]) parameterMap.get("param2");
        List properties;
        if (candidateProperties.length == 0) {
            if (!selective || !configuration.isIterateSelectiveInBatch()) {
                properties = EntityUtils.getProperties(entity, selective);
            } else {
                properties = EntityUtils.getProperties(entities);
            }
        } else {
            properties = PropertyUtils.buildPropertiesWithCandidates(candidateProperties, entity, selective);
        }

        List parameterMappings = Collections.emptyList();
        if (!properties.isEmpty()) {
            boolean mapUnderscoreToCamelCase = (boolean)
                    metaObject.getValue("delegate.configuration.mapUnderscoreToCamelCase");
            List columns = properties.stream()
                    .map(it -> SqlUtils.normalizeColumn(it, mapUnderscoreToCamelCase)).collect(Collectors.toList());

            StringBuilder subSqlBuilder = new StringBuilder();
            columns.forEach(property -> subSqlBuilder.append(property).append(", "));
            subSqlBuilder.setLength(subSqlBuilder.length() - 2);
            sqlBuilder.append('(').append(subSqlBuilder).append(") VALUES ");

            subSqlBuilder.setLength(0);
            for (int n = 0; n < entities.size(); n++) {
                subSqlBuilder.append('(');
                for (int i = 0, size = columns.size(); i < size; i++) {
                    subSqlBuilder.append("?, ");
                }
                subSqlBuilder.setLength(subSqlBuilder.length() - 2);
                subSqlBuilder.append("), ");
            }
            subSqlBuilder.setLength(subSqlBuilder.length() - 2);
            sqlBuilder.append(subSqlBuilder);

            if (entities.size() > 1) {
                entity = Collections.singletonMap("list", entities);
                parameterMappings = new ArrayList<>(properties.size() * entities.size());

                for (int i = 0; i < entities.size(); i++) {
                    org.apache.ibatis.session.Configuration configuration =
                            (org.apache.ibatis.session.Configuration)
                                    metaObject.getValue("delegate.configuration");
                    for (String property : properties) {
                        parameterMappings.add(new ParameterMapping.Builder(configuration,
                                "list[" + i + "]." + property, Object.class).build());
                    }
                }
            } else {
                parameterMappings = MyBatisUtils.getParameterMappings((org.apache.ibatis.session.Configuration)
                        metaObject.getValue("delegate.configuration"), properties);
            }
        }
        MyBatisUtils.getRealMetaObject(metaObject.getValue("delegate.parameterHandler"))
                .setValue("parameterObject", entity);
        metaObject.setValue("delegate.boundSql.parameterObject", entity);
        metaObject.setValue("delegate.boundSql.parameterMappings", parameterMappings);
        metaObject.setValue("delegate.boundSql.sql", sqlBuilder.toString());
    }

    @Override
    public void setConfiguration(Configuration configuration) {
        this.configuration = configuration;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy