#1354 - ENH: Add SqlUpdate setNextParameter() ... as alternative for positioned parameters

This commit is contained in:
Rob Bygrave
2018-03-27 22:58:19 +13:00
parent 4ef581f87c
commit dfa7b765f9
4 changed files with 68 additions and 12 deletions
+37 -1
View File
@@ -30,6 +30,35 @@ package io.ebean;
* String msg = "There were " + modifiedCount + " rows updated";
*
* }</pre>
* <p>
* <h3>Example: Using setNextParameter()</h3>
* <pre>{@code
*
* String sql = "insert into audit_log (id, description, modified_description) values (?,?,?)";
* SqlUpdate insert = Ebean.createSqlUpdate(sql);
*
* try (Transaction txn = Ebean.beginTransaction()) {
* txn.setBatchMode(true);
*
* insert.setNextParameter(10000);
* insert.setNextParameter("hello");
* insert.setNextParameter("rob");
* insert.execute();
*
* insert.setNextParameter(10001);
* insert.setNextParameter("goodbye");
* insert.setNextParameter("rob");
* insert.execute();
*
* insert.setNextParameter(10002);
* insert.setNextParameter("chow");
* insert.setNextParameter("bob");
* insert.execute();
*
* txn.commit();
* }
*
* }</pre>
*
* @see Update
* @see SqlQuery
@@ -61,7 +90,7 @@ public interface SqlUpdate {
/**
* Execute and return the generated key. This is effectively a short cut for:
*
* <p>
* <pre>{@code
*
* sqlUpdate.execute();
@@ -137,6 +166,13 @@ public interface SqlUpdate {
*/
SqlUpdate setTimeout(int secs);
/**
* Set the next positioned parameter.
*
* @param value The value to bind
*/
SqlUpdate setNextParameter(Object value);
/**
* Set a parameter via its index position.
*/
@@ -105,6 +105,7 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
@Override
public int execute() {
addPos = 0;
if (server != null) {
return server.execute(this);
} else {
@@ -182,8 +183,9 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
return this;
}
public void addParameter(Object value) {
public SqlUpdate setNextParameter(Object value) {
setParameter(++addPos, value);
return this;
}
@Override
@@ -3,8 +3,8 @@ package org.tests.persistencecontext;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.SqlUpdate;
import org.tests.model.basic.EBasicVer;
import org.junit.Test;
import org.tests.model.basic.EBasicVer;
import static io.ebean.PersistenceContextScope.QUERY;
import static io.ebean.PersistenceContextScope.TRANSACTION;
@@ -28,8 +28,8 @@ public class TestPersistenceContextQueryScope extends BaseTestCase {
// do an update of the name in the DB
SqlUpdate sqlUpdate = Ebean.createSqlUpdate("update e_basicver set name=? where id=?");
sqlUpdate.setParameter(1, "second");
sqlUpdate.setParameter(2, bean.getId());
sqlUpdate.setNextParameter("second");
sqlUpdate.setNextParameter(bean.getId());
int rowCount = sqlUpdate.execute();
assertEquals(1, rowCount);
@@ -5,8 +5,8 @@ import io.ebean.Ebean;
import io.ebean.SqlUpdate;
import io.ebean.Transaction;
import io.ebeaninternal.api.SpiTransaction;
import org.tests.idkeys.db.AuditLog;
import org.junit.Test;
import org.tests.idkeys.db.AuditLog;
import static org.junit.Assert.assertFalse;
@@ -15,15 +15,33 @@ public class TestInsertSqlLogging extends BaseTestCase {
@Test
public void test() {
Ebean.delete(AuditLog.class, 10000);
Ebean.find(AuditLog.class).where().ge("id", 10000).delete();
String sql = "insert into audit_log (id, description, modified_description) values (?,?,?)";
SqlUpdate sqlUpdate = Ebean.createSqlUpdate(sql);
sqlUpdate.setParameter(1, 10000);
sqlUpdate.setParameter(2, "hello");
sqlUpdate.setParameter(3, "rob");
SqlUpdate insert = Ebean.createSqlUpdate(sql);
try (Transaction txn = Ebean.beginTransaction()) {
txn.setBatchMode(true);
txn.setBatchSize(2);
insert.setNextParameter(10000);
insert.setNextParameter("hello");
insert.setNextParameter("rob");
insert.execute();
insert.setNextParameter(10001);
insert.setNextParameter("goodbye");
insert.setNextParameter("rob");
insert.execute();
insert.setNextParameter(10002);
insert.setNextParameter("chow");
insert.setNextParameter("bob");
insert.execute();
txn.commit();
}
sqlUpdate.execute();
}
@Test