Mybatis——通用mapper(自定义和扩展mapper)(3)

项目源代码:https://github.com/ClevelandCavaliers2016/extendedUniversalMapper.git

1、自定义:

Mybatis——通用mapper(自定义和扩展mapper)(3)

Mybatis——通用mapper(自定义和扩展mapper)(3)

2、扩展通用mapper:
作用:增加通用Mapper 没有提供的功能。

自定义扩展mapper接口简单实现结构:

Mybatis——通用mapper(自定义和扩展mapper)(3)

自定义扩展mapper接替实现:

(1)自定义扩展mapper接口:

Mybatis——通用mapper(自定义和扩展mapper)(3)

(2)具体实现:

public class ExtendBatchUpdatesProvider extends MapperTemplate {

    public ExtendBatchUpdatesProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
        super(mapperClass, mapperHelper);
    }


    public String batchUpdate(MappedStatement statement) {
        //1.创建StringBuilder用于拼接SQL语句的各个组成部分
        StringBuilder builder = new StringBuilder();
        //2.拼接foreach标签
        builder.append("<foreach collection=\"list\" item=\"record\" separator=\";\" >");

        //3.获取实体类对应的Class对象
        Class<?> entityClass = super.getEntityClass(statement);
        //4.获取实体类在数据库中对应的表名
        String tableName = super.tableName(entityClass);
        //5.生成update子句
        String updateClause = SqlHelper.updateTable(entityClass, tableName);

        //拼接update语句
        builder.append(updateClause);
        builder.append("<set>");
        //6.获取所有字段信息
        Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);
        String idColumn = null;
        String idHolder = null;

        for (EntityColumn entityColumn : columns) {
            boolean isPrimaryKey = entityColumn.isId();
            //7.判断当前字段是否为主键
            if (isPrimaryKey) {
                //8.缓存主键的字段名和字段值
                idColumn = entityColumn.getColumn();
                //※返回格式如:#{record.age,jdbcType=NUMERIC,typeHandler=MyTypeHandler}
                idHolder = entityColumn.getColumnHolder("record");
            } else {
                //9.使用非主键字段拼接SET子句
                String column = entityColumn.getColumn();
                String columnHolder = entityColumn.getColumnHolder("record");
                builder.append(column).append("=").append(columnHolder).append(",");
            }
        }
        builder.append("</set>");
        //10.使用前面缓存的主键名、主键值拼接where子句
        builder.append("where ").append(idColumn).append("=").append(idHolder);
        builder.append("</foreach>");
        //11.将拼接好的字符串返回
        return builder.toString();
    }
}