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

cn.mybatisboost.mapper.provider.SelectByIds 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.EntityUtils;
import cn.mybatisboost.util.MapperUtils;
import cn.mybatisboost.util.MyBatisUtils;
import cn.mybatisboost.util.SqlUtils;
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.*;

public class SelectByIds 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("SELECT * FROM ").append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor()));

        String idProperty = EntityUtils.getIdProperty(entityType);
        String idColumn = SqlUtils.normalizeColumn(idProperty,
                (boolean) metaObject.getValue("delegate.configuration.mapUnderscoreToCamelCase"));
        boolean multipleIds = mappedStatement.getId().endsWith("Ids");
        List parameterMappings = Collections.emptyList();
        if (!multipleIds) {
            sqlBuilder.append(" WHERE ").append(idColumn).append(" = ?");
            parameterMappings = Collections.singletonList(new ParameterMapping.Builder
                    ((org.apache.ibatis.session.Configuration) metaObject.getValue("delegate.configuration"),
                            "param1", Object.class).build());
        } else {
            Map parameterMap = (Map) boundSql.getParameterObject();
            Object[] ids = (Object[]) parameterMap.get("param1");
            if (ids.length > 0) {
                sqlBuilder.append(" WHERE ").append(idColumn).append(" IN (");
                Arrays.stream(ids).forEach(c -> sqlBuilder.append("?, "));
                sqlBuilder.setLength(sqlBuilder.length() - 2);
                sqlBuilder.append(')');

                org.apache.ibatis.session.Configuration configuration = (org.apache.ibatis.session.Configuration)
                        metaObject.getValue("delegate.configuration");
                Map newParameterMap = new HashMap<>(ids.length);
                parameterMappings = new ArrayList<>(ids.length);
                for (int i = 0; i < ids.length; i++) {
                    newParameterMap.put(idProperty + i, ids[i]);
                    parameterMappings.add(new ParameterMapping.Builder(configuration,
                            idProperty + i, Object.class).build());
                }
                parameterMap = newParameterMap;
            } else {
                parameterMap = Collections.emptyMap();
            }
            MyBatisUtils.getRealMetaObject(metaObject.getValue("delegate.parameterHandler"))
                    .setValue("parameterObject", parameterMap);
            metaObject.setValue("delegate.boundSql.parameterObject", parameterMap);
        }
        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