1. 程式人生 > 其它 >mybatis-plus 自定義sql

mybatis-plus 自定義sql

自定義mybatisplus sql

自定義首先繼承於 DefaultSqlInjector 這個類 實現介面 getMethodList

@Configuration
public class SqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        var list = super.getMethodList(mapperClass, tableInfo);
        list.add(....)
        return list;
    }

具體實現方法是 繼承AbstractMethod這個類
下邊是一個批量插入自定義類

public class BatchInsert extends AbstractMethod {

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        var sqlMethod = "<script>  %s \n</script>";
        var sql = String.format(sqlMethod, getSql(tableInfo));
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
        return this.addSelectMappedStatementForTable(mapperClass, "batchInsert", sqlSource, tableInfo);
    }

    private String getSql(TableInfo tableInfo) {
        var builder = new StringBuilder();
        var columns = new ArrayList<String>();
        var fieldNames = new ArrayList<String>();
        columns.add(tableInfo.getKeyColumn());
        fieldNames.add(tableInfo.getKeyProperty());
        tableInfo.getFieldList().forEach(x -> {
            columns.add(x.getColumn());
            fieldNames.add(x.getField().getName());
        });

        builder.append(String.format(" INSERT INTO %s \n", tableInfo.getTableName()));
        builder.append(String.format(" ( %s ) VALUES ", String.join(",", columns)));
        builder.append("<foreach collection=\"list\" index=\"index\" item=\"item\" separator=\",\">\n");
        builder.append("(");
        for (var i = 0; i < fieldNames.size(); i++) {
            if (i != 0) {
                builder.append(",");
            }

            builder.append(String.format("#{item.%s}", fieldNames.get(i)));
        }

        builder.append(") \n");
        builder.append("</foreach>");
        return builder.toString();
    }
}

最後一步 把這個類加入 第一步定義的SqlInjector getMethodList list 方法中

list.add(new BatchInsert())