Loading

Mybatis-plus批量更新时报语法错误(Mysql数据库)

今天通过自定义sql注入器实现了MP真正的批量插入和更新操作,具体配置可以参考这篇文章Mybatis-plus批量操作
测试发现有两个问题:
- 批量插入时Id字段没有回填到原对象中
指定一下keyGenerator, keyProperty, keyColumn三个参数即可

    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        final String sql = "<script>insert into %s %s values %s</script>";
        final String fieldSql = prepareFieldSql(tableInfo);
        final String valueSql = prepareValuesSql(tableInfo);
        final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
        log.debug("sqlResult----->{}", sqlResult);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        String keyProperty = null;
        String keyColumn = null;
        KeyGenerator keyGenerator = new NoKeyGenerator();
        // 表包含主键处理逻辑,如果不包含主键当普通字段处理
        String insertBatch = "insertBatch";
        if (tableInfo.havePK()) {
            if (tableInfo.getIdType() == IdType.AUTO) {
                /* 自增主键 */
                keyGenerator = new Jdbc3KeyGenerator();
                keyProperty = tableInfo.getKeyProperty();
                keyColumn = tableInfo.getKeyColumn();
            } else {
                if (null != tableInfo.getKeySequence()) {
                    keyGenerator = TableInfoHelper.genKeyGenerator(insertBatch, tableInfo, builderAssistant);
                    keyProperty = tableInfo.getKeyProperty();
                    keyColumn = tableInfo.getKeyColumn();
                }
            }
        }

        // 第三个参数必须和RootMapper的自定义方法名一致
        return this.addInsertMappedStatement(mapperClass, modelClass, insertBatch, sqlSource, keyGenerator, keyProperty, keyColumn);
    }
  • 更新时会报错
    第一个问题暂时没有解决,第二个问题经过查询资料,发现是连接数据库时少了相关配置allowMultiQueries=true
    加到jdbcUrl后即可。
posted @ 2023-03-07 20:41  _fun_ny  阅读(487)  评论(0)    收藏  举报