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

com.github.freegeese.easymybatis.mapper.provider.UpdateSqlProvider Maven / Gradle / Ivy

The newest version!
package com.github.freegeese.easymybatis.mapper.provider;

import com.github.freegeese.easymybatis.meta.MetaCache;
import com.github.freegeese.easymybatis.meta.MetaEntityClass;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.AbstractSQL;
import org.apache.ibatis.jdbc.SQL;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * 提供基础更新 SQL
 *
 * @author zhangguangyong
 * @since 1.0
 */
public class UpdateSqlProvider {
    /**
     * 更新单个
     *
     * @param entity
     * @return
     */
    public String updateByPrimaryKey(Object entity) {
        MetaEntityClass meta = MetaCache.getMetaEntityClass(entity.getClass());
        List resultMappings = meta.getResultMappingsWithoutNull(entity);
        MetaEntityClass.ResultMapping primaryKey = meta.checkPrimaryKey(entity);
        return updateSql(meta, resultMappings, primaryKey);
    }

    /**
     * 更新单个,只更新非空字段
     *
     * @param entity
     * @return
     */
    public String updateByPrimaryKeySelective(Object entity) {
        MetaEntityClass meta = MetaCache.getMetaEntityClass(entity.getClass());
        List resultMappings = meta.getResultMappingsWithoutPrimaryKeyOrNull(entity);
        MetaEntityClass.ResultMapping primaryKey = meta.checkPrimaryKey(entity);
        return updateSql(meta, resultMappings, primaryKey);
    }

    /**
     * 更新多个(只更新非空字段)
     *
     * @param entities
     * @return
     */
    public String updateBatchSelective(@Param("entities") List entities) {
        Class entityClass = entities.get(0).getClass();
        MetaEntityClass meta = MetaCache.getMetaEntityClass(entityClass);
        AtomicInteger index = new AtomicInteger(0);

        List sqls = new ArrayList<>();
        for (Object entity : entities) {
            List resultMappings = meta.getResultMappingsWithoutPrimaryKeyOrNull(entity);
            MetaEntityClass.ResultMapping primaryKey = meta.checkPrimaryKey(entity);
            int i = index.getAndIncrement();

            String sets = resultMappings.stream().map(v -> v.getColumn() + " = #{entities[" + i + "]" + v.getProperty() + "}").collect(Collectors.joining(","));
            SQL sql = new SQL().UPDATE(meta.getTable()).SET(sets).WHERE(primaryKey.getColumn() + " = #{entities[" + i + "]" + primaryKey.getProperty() + "}");

            sqls.add(sql);
        }

        return sqls.stream().map(AbstractSQL::toString).collect(Collectors.joining(";"));
    }

    private String updateSql(MetaEntityClass meta, List resultMappings, MetaEntityClass.ResultMapping primaryKey) {
        String sets = resultMappings.stream().map(v -> v.getColumn() + " = #{" + v.getProperty() + "}").collect(Collectors.joining(","));
        SQL sql = new SQL().UPDATE(meta.getTable()).SET(sets).WHERE(primaryKey.getColumn() + " = #{" + primaryKey.getProperty() + "}");
        return sql.toString();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy