From e857ba74d783a6543bdc728d7d55bafaef546125 Mon Sep 17 00:00:00 2001 From: liumin Date: Sun, 14 Jan 2024 17:50:25 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E4=BC=98=E5=8C=96BatchParam=E7=9A=84sql?= =?UTF-8?q?Param=EF=BC=8C=E6=94=AF=E6=8C=81List?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/beetl/sql/core/BaseSQLExecutor.java | 48 +++++++++---------- .../java/org/beetl/sql/core/BatchParam.java | 7 +++ .../sql/usage/sqlmanger/S08UpdateSample.java | 24 +++++++--- 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/sql-core/src/main/java/org/beetl/sql/core/BaseSQLExecutor.java b/sql-core/src/main/java/org/beetl/sql/core/BaseSQLExecutor.java index 2db1895b..4dc52582 100644 --- a/sql-core/src/main/java/org/beetl/sql/core/BaseSQLExecutor.java +++ b/sql-core/src/main/java/org/beetl/sql/core/BaseSQLExecutor.java @@ -325,27 +325,14 @@ public class BaseSQLExecutor implements SQLExecutor { InterceptorContext ctx = new InterceptorContext(executeContext); try { GroupBatchExecutor groupBatchExecutor = new GroupBatchExecutor(); - SQLResult result = null; conn = executeContext.sqlManager.getDs().getConn(executeContext, true); for (int k = 0; k < list.size(); k++) { if (list.get(k) == null) { throw new NullPointerException("列表 " + k + "参数为空"); } - Map paras = this.beforeExecute(target, list.get(k), true); - result = run(paras); - - PreparedStatement ps = groupBatchExecutor.containSql(result.jdbcSql); - if (ps == null) { - ps = conn.prepareStatement(result.jdbcSql); - } - this.applyStatementSetting(executeContext, conn, ps); - this.setPreparedStatementPara(ps, result.jdbcPara); - ps.addBatch(); - groupBatchExecutor.addSql(result,ps); + addParam2BatchExecutor(target, list.get(k), conn, groupBatchExecutor, true); } - return groupBatchExecutor.executeBatch(executeContext,ctx,executeContext.sqlManager.isBatchLogOneByOne()); - } catch (SQLException e) { this.callInterceptorAsException(ctx, e); throw new BeetlSQLException(BeetlSQLException.SQL_EXCEPTION, e); @@ -366,7 +353,6 @@ public class BaseSQLExecutor implements SQLExecutor { InterceptorContext ctx = new InterceptorContext(executeContext); try { GroupBatchExecutor groupBatchExecutor = new GroupBatchExecutor(); - SQLResult result; conn = executeContext.sqlManager.getDs().getConn(executeContext, true); int[] rows = new int[list.size()]; //分批执行 @@ -379,16 +365,17 @@ public class BaseSQLExecutor implements SQLExecutor { } SQLSource sqlSource = executeContext.sqlManager.getSqlLoader().querySQL(item.getSqlId()); executeContext.initSQLSource(sqlSource); - Map paras = this.beforeExecute(null, item.getSqlParam(), true); - result = run(paras); - PreparedStatement ps = groupBatchExecutor.containSql(result.jdbcSql); - if (ps == null) { - ps = conn.prepareStatement(result.jdbcSql); + Object sqlParams = item.getSqlParam(); + boolean isUpdate = sqlSource.getSqlType().isUpdate(); + //sql参数为集合 + if(sqlParams instanceof List){ + List sqlParamList = (List)sqlParams; + for (Object param : sqlParamList) { + addParam2BatchExecutor(null, param, conn, groupBatchExecutor,isUpdate); + } + }else { + addParam2BatchExecutor(null, item.getSqlParam(), conn, groupBatchExecutor,isUpdate); } - this.applyStatementSetting(executeContext, conn, ps); - this.setPreparedStatementPara(ps, result.jdbcPara); - ps.addBatch(); - groupBatchExecutor.addSql(result, ps); } int[] group = groupBatchExecutor.executeBatch(executeContext, ctx, executeContext.sqlManager.isBatchLogOneByOne()); rows = ArrayKit.concatAll(rows, group); @@ -402,6 +389,19 @@ public class BaseSQLExecutor implements SQLExecutor { } } + private void addParam2BatchExecutor(Class target, Object param, Connection conn, GroupBatchExecutor groupBatchExecutor, boolean isUpdate) throws SQLException { + Map paras = this.beforeExecute(target, param, isUpdate); + SQLResult result = run(paras); + PreparedStatement ps = groupBatchExecutor.containSql(result.jdbcSql); + if (ps == null) { + ps = conn.prepareStatement(result.jdbcSql); + } + this.applyStatementSetting(executeContext, conn, ps); + this.setPreparedStatementPara(ps, result.jdbcPara); + ps.addBatch(); + groupBatchExecutor.addSql(result, ps); + } + static class GroupBatchExecutor { Map batchPs = new HashMap<>(); diff --git a/sql-core/src/main/java/org/beetl/sql/core/BatchParam.java b/sql-core/src/main/java/org/beetl/sql/core/BatchParam.java index 76d88f2a..c65ad448 100644 --- a/sql-core/src/main/java/org/beetl/sql/core/BatchParam.java +++ b/sql-core/src/main/java/org/beetl/sql/core/BatchParam.java @@ -1,5 +1,7 @@ package org.beetl.sql.core; +import java.util.List; + /** * 批量参数 * @@ -49,6 +51,11 @@ public class BatchParam { return this; } + public BatchParam sqlParamList(List sqlParam) { + this.sqlParam = sqlParam; + return this; + } + public String getSqlTemplate() { return sqlTemplate; } diff --git a/sql-samples/sql-sample-usage/src/main/java/org/beetl/sql/usage/sqlmanger/S08UpdateSample.java b/sql-samples/sql-sample-usage/src/main/java/org/beetl/sql/usage/sqlmanger/S08UpdateSample.java index 8bd6a26f..02cce001 100644 --- a/sql-samples/sql-sample-usage/src/main/java/org/beetl/sql/usage/sqlmanger/S08UpdateSample.java +++ b/sql-samples/sql-sample-usage/src/main/java/org/beetl/sql/usage/sqlmanger/S08UpdateSample.java @@ -154,17 +154,27 @@ public class S08UpdateSample { */ UserEntity user = new UserEntity(); user.setName("abc"); - user.setId(21); + user.setId(1121); UserEntity user2 = new UserEntity(); - user2.setDepartmentId(1); - user2.setId(11); + user2.setName("abcd"); + user2.setDepartmentId(222); + user2.setId(1111); + BatchParam param = BatchParam.builder() - .sqlTemplate("update sys_user set name=#{name} where id=#{id}") - .sqlParam(user); + .sqlTemplate("insert into sys_user (id,name) values (#{id},#{name})") + .sqlParamList(Arrays.asList(user, user2)); BatchParam param1 = BatchParam.builder() - .sqlTemplate("update sys_user set department_id=#{departmentId} where id=#{id}") - .sqlParam(user2); + .sqlTemplate("update sys_user set \n" + //注意:使用String类型的sql模板并且使用到了函数,必须采用\n换行,否则报语法错误 + " -- @if(!isEmpty(departmentId)){ \n" + + " department_id=#{departmentId}, \n" + + " -- @}\n " + + " -- @if(!isEmpty(name)){\n " + + " name=#{name}\n " + + " -- @}\n " + + " where id=#{id}") + .sqlParamList(Arrays.asList(user, user2)); + sqlManager.setBatchLogOneByOne(true); sqlManager.executeBatch(Arrays.asList(param, param1), null); /** -- Gitee