浏览代码

add 增加 自定义 批量insert方法

疯狂的狮子li 4 年之前
父节点
当前提交
c98ab8fb51

+ 47 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java

@@ -0,0 +1,47 @@
+package com.ruoyi.common.core.mybatisplus.methods;
+
+import org.apache.ibatis.executor.keygen.NoKeyGenerator;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+
+/**
+ * 单sql批量插入
+ *
+ * @author Lion Li
+ */
+public class InsertAll extends AbstractMethod {
+
+	@Override
+	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 = prepareValuesSqlForMysqlBatch(tableInfo);
+		final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
+		SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
+		return this.addInsertMappedStatement(mapperClass, modelClass, "insertAll", sqlSource, new NoKeyGenerator(), null, null);
+	}
+
+	private String prepareFieldSql(TableInfo tableInfo) {
+		StringBuilder fieldSql = new StringBuilder();
+		fieldSql.append(tableInfo.getKeyColumn()).append(",");
+		tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(","));
+		fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
+		fieldSql.insert(0, "(");
+		fieldSql.append(")");
+		return fieldSql.toString();
+	}
+
+	private String prepareValuesSqlForMysqlBatch(TableInfo tableInfo) {
+		final StringBuilder valueSql = new StringBuilder();
+		valueSql.append("<foreach collection=\"list\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
+		valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},");
+		tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"));
+		valueSql.delete(valueSql.length() - 1, valueSql.length());
+		valueSql.append("</foreach>");
+		return valueSql.toString();
+	}
+}
+

+ 17 - 4
ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java

@@ -2,15 +2,21 @@ package com.ruoyi.framework.config;
 
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
+import com.baomidou.mybatisplus.core.injector.ISqlInjector;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.ruoyi.common.core.mybatisplus.methods.InsertAll;
 import com.ruoyi.framework.mybatisplus.CreateAndUpdateMetaObjectHandler;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
+import java.util.List;
+
 /**
  * mybatis-plus配置类
  *
@@ -94,10 +100,17 @@ public class MybatisPlusConfig {
 	 * sql注入器配置
 	 * https://baomidou.com/guide/sql-injector.html
 	 */
-//	@Bean
-//	public ISqlInjector sqlInjector() {
-//		return new DefaultSqlInjector();
-//	}
+	@Bean
+	public ISqlInjector sqlInjector() {
+		return new DefaultSqlInjector() {
+			@Override
+			public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
+				List<AbstractMethod> methodList = super.getMethodList(mapperClass);
+				methodList.add(new InsertAll());
+				return methodList;
+			}
+		};
+	}
 
 	/**
 	 * TenantLineInnerInterceptor 多租户插件