6. 开发自己的通用接口方法

除了Mapper2中支持的两种方式外(Mapper2扩展文档]

增加了一种简单的方式,看下面一个例子:

public interface InsertListMapper<T> {
    /**
     * 批量插入,支持数据库自增字段,支持回写
     *
     * @param recordList
     * @return
     */
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @InsertProvider(type = SpecialProvider.class, method = "dynamicSQL")
    int insertList(List<T> recordList);
}

这是一个批量插入的接口,这里限制自增属性为id

我们看看实现类SpecialProvider中的insertList(方法名必须和接口方法名一致)方法:

public String insertList(MappedStatement ms) {
    final Class<?> entityClass = getSelectReturnType(ms);
    //获取表的各项属性
    EntityTable table = getEntityTable(entityClass);
    //开始拼sql
    StringBuilder sql = new StringBuilder();
    sql.append("insert into ");
    sql.append(table.getName());
    sql.append("(");
    boolean first = true;
    for (EntityColumn column : table.getEntityClassColumns()) {
        if(!first) {
            sql.append(",");
        }
        sql.append(column.getColumn());
        first = false;
    }
    sql.append(") values ");
    sql.append("<foreach collection=\"list\" item=\"record\" separator=\",\" >");
    sql.append("(");
    first = true;
    for (EntityColumn column : table.getEntityClassColumns()) {
        if(!first) {
            sql.append(",");
        }
        sql.append("#{record.").append(column.getProperty()).append("}");
        first = false;
    }
    sql.append(")");
    sql.append("</foreach>");
    return sql.toString();
}

从获取表的各项属性后,完全就是一个拼SQL的过程,这个过程需要注意的是,这里拼的是XML中的形式。

上面就是两次循环列,最后拼个sql,sql形式如下:

insert into 表(id,xxx,xxx,...)
values
<foreach collection="list" item="record" separtor=",">
(#{record.id},#{record.xxx},...)
</foreach>

相信这种简单的拼字符串难不倒任何一个人,只要你能在xml写出来,就能在这儿拼出来。