/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jdbi.v3.core.argument;
import static org.assertj.core.api.Assertions.assertThat;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Optional;
import org.jdbi.v3.core.Handle;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.core.config.ConfigRegistry;
import org.jdbi.v3.core.rule.H2DatabaseRule;
import org.jdbi.v3.core.statement.PreparedBatch;
import org.junit.Rule;
import org.junit.Test;
public class TestArgumentFactory
{
@Rule
public H2DatabaseRule dbRule = new H2DatabaseRule();
@Test
public void testRegisterOnJdbi() throws Exception
{
final Jdbi db = dbRule.getJdbi();
db.registerArgument(new NameAF());
try (Handle h = db.open()) {
h.createUpdate("insert into something (id, name) values (:id, :name)")
.bind("id", 7)
.bind("name", new Name("Brian", "McCallister"))
.execute();
String full_name = h.createQuery("select name from something where id = 7").mapTo(String.class).findOnly();
assertThat(full_name).isEqualTo("Brian McCallister");
}
}
@Test
public void testRegisterOnHandle() throws Exception
{
try (Handle h = dbRule.openHandle()) {
h.registerArgument(new NameAF());
h.createUpdate("insert into something (id, name) values (:id, :name)")
.bind("id", 7)
.bind("name", new Name("Brian", "McCallister"))
.execute();
String full_name = h.createQuery("select name from something where id = 7").mapTo(String.class).findOnly();
assertThat(full_name).isEqualTo("Brian McCallister");
}
}
@Test
public void testRegisterOnStatement() throws Exception
{
dbRule.getSharedHandle().createUpdate("insert into something (id, name) values (:id, :name)")
.registerArgument(new NameAF())
.bind("id", 1)
.bind("name", new Name("Brian", "McCallister"))
.execute();
}
@Test
public void testOnPreparedBatch() throws Exception
{
Handle h = dbRule.getSharedHandle();
PreparedBatch batch = h.prepareBatch("insert into something (id, name) values (:id, :name)");
batch.registerArgument(new NameAF());
batch.bind("id", 1).bind("name", new Name("Brian", "McCallister")).add();
batch.bind("id", 2).bind("name", new Name("Henning", "S")).add();
batch.execute();
List<String> rs = h.createQuery("select name from something order by id")
.mapTo(String.class)
.list();
assertThat(rs.get(0)).isEqualTo("Brian McCallister");
assertThat(rs.get(1)).isEqualTo("Henning S");
}
public static class NameAF implements ArgumentFactory
{
@Override
public Optional<Argument> build(Type expectedType, Object value, ConfigRegistry config) {
if (expectedType == Name.class || value instanceof Name) {
Name nameValue = (Name) value;
return config.get(Arguments.class).findFor(String.class, nameValue.getFullName());
}
return Optional.empty();
}
}
public static class Name
{
private final String first;
private final String last;
public Name(String first, String last)
{
this.first = first;
this.last = last;
}
public String getFullName()
{
return first + " " + last;
}
@Override
public String toString()
{
return "<Name first=" + first + " last=" + last + " >";
}
}
}