package com.xzx.gc.batch;
import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.SqlHelper;
import tk.mybatis.mapper.provider.ExampleProvider;
import java.util.Set;
/**
 * 批量更新的SqlProvider
 * @author sunchangtan
 */
public class BatchExampleProvider extends ExampleProvider {
    public BatchExampleProvider(Class> mapperClass, MapperHelper mapperHelper) {
        super(mapperClass, mapperHelper);
    }
    /**
     * 拼update sql, 使用case when方式,id为主键
     *
     * @param ms
     * @return
     */
    public String updateBatchByPrimaryKeySelective(MappedStatement ms) {
        final Class> entityClass = getEntityClass(ms);
        //开始拼sql
        StringBuilder sql = new StringBuilder();
        sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
        sql.append("");
        //获取全部列
        Set columnList = EntityHelper.getColumns(entityClass);
        String columnNameInDb = "id";
        String fieldNameInWeb = "id";
        for (EntityColumn column : columnList) {
            if(column.isId()){
                columnNameInDb=column.getColumn();
                fieldNameInWeb=column.getProperty();
            }
            if (!column.isId() && column.isUpdatable()) {
                sql.append("  ");
                sql.append("    ");
                sql.append("      ");
                sql.append("         when "+columnNameInDb+"=#{i."+fieldNameInWeb+"} then #{i."+column.getEntityField().getName()+"}");
                sql.append("      ");
                sql.append("    ");
                sql.append("  ");
            }
        }
        sql.append("");
        sql.append("WHERE");
        sql.append(" "+columnNameInDb+" IN ");
        sql.append("");
        sql.append("");
        sql.append("#{i."+fieldNameInWeb+"}");
        sql.append("");
        sql.append("");
        return sql.toString();
    }
}