mirror of
https://github.com/moparisthebest/JdbcMapper
synced 2024-11-22 00:52:16 -05:00
Implement JdbcMapper.DatabaseType.BIND support
This commit is contained in:
parent
2f8f293ed2
commit
5522014f8e
@ -128,9 +128,11 @@ public interface JdbcMapper extends Closeable {
|
|||||||
|
|
||||||
public enum DatabaseType {
|
public enum DatabaseType {
|
||||||
DEFAULT(null, null),
|
DEFAULT(null, null),
|
||||||
|
BIND(null, null),
|
||||||
STANDARD("numeric", "text"),
|
STANDARD("numeric", "text"),
|
||||||
UNNEST("NUMERIC", "VARCHAR"),
|
UNNEST("NUMERIC", "VARCHAR"),
|
||||||
ORACLE("ARRAY_NUM_TYPE", "ARRAY_STR_TYPE");
|
ORACLE("ARRAY_NUM_TYPE", "ARRAY_STR_TYPE"),
|
||||||
|
;
|
||||||
|
|
||||||
public final String arrayNumberTypeName, arrayStringTypeName;
|
public final String arrayNumberTypeName, arrayStringTypeName;
|
||||||
|
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package com.moparisthebest.jdbc.util;
|
package com.moparisthebest.jdbc.util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class InListUtil {
|
public class InListUtil {
|
||||||
|
|
||||||
|
public static final int defaultMaxSize = Integer.parseInt(System.getProperty("QueryMapper.BindInList.defaultMaxSize", "999"));
|
||||||
|
|
||||||
private static <T> List<List<T>> split(final List<T> list, final int maxLength) {
|
private static <T> List<List<T>> split(final List<T> list, final int maxLength) {
|
||||||
final int listSize = list.size();
|
final int listSize = list.size();
|
||||||
final List<List<T>> ret = new ArrayList<List<T>>();
|
final List<List<T>> ret = new ArrayList<List<T>>();
|
||||||
@ -49,11 +52,35 @@ public class InListUtil {
|
|||||||
return sb.append(")").toString();
|
return sb.append(")").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> String toInList(final String fieldName, final Collection<T> items, final int maxSize) {
|
private static <T> String toInListNonEmpty(final String fieldName, final Collection<T> items, final int maxSize) {
|
||||||
return toInList(fieldName, items, maxSize, " IN (", " OR ");
|
return toInList(fieldName, items, maxSize, " IN (", " OR ");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> String toNotInList(final String fieldName, final Collection<T> items, final int maxSize) {
|
private static <T> String toNotInListNonEmpty(final String fieldName, final Collection<T> items, final int maxSize) {
|
||||||
return toInList(fieldName, items, maxSize, " NOT IN (", " AND ");
|
return toInList(fieldName, items, maxSize, " NOT IN (", " AND ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> String toInList(final String fieldName, final Collection<T> items, final int maxSize) {
|
||||||
|
return items == null || items.isEmpty() ? "(0=1)" : toInListNonEmpty(fieldName, items, maxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String toNotInList(final String fieldName, final Collection<T> items, final int maxSize) {
|
||||||
|
return items == null || items.isEmpty() ? "(1=1)" : toNotInListNonEmpty(fieldName, items, maxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String toInList(final String fieldName, final Collection<T> items) {
|
||||||
|
return toInList(fieldName, items, defaultMaxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String toNotInList(final String fieldName, final Collection<T> items) {
|
||||||
|
return toInList(fieldName, items, defaultMaxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String toInList(final String fieldName, final T[] items) {
|
||||||
|
return toInList(fieldName, Arrays.asList(items), defaultMaxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String toNotInList(final String fieldName, final T[] items) {
|
||||||
|
return toInList(fieldName, Arrays.asList(items), defaultMaxSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
enumType = types.getDeclaredType(elements.getTypeElement(Enum.class.getCanonicalName()), types.getWildcardType(null, null));
|
enumType = types.getDeclaredType(elements.getTypeElement(Enum.class.getCanonicalName()), types.getWildcardType(null, null));
|
||||||
|
|
||||||
final String databaseType = processingEnv.getOptions().get("jdbcMapper.databaseType");
|
final String databaseType = processingEnv.getOptions().get("jdbcMapper.databaseType");
|
||||||
defaultDatabaseType = databaseType == null || databaseType.isEmpty() ? JdbcMapper.DatabaseType.STANDARD : JdbcMapper.DatabaseType.valueOf(databaseType);
|
defaultDatabaseType = databaseType == null || databaseType.isEmpty() ? JdbcMapper.DatabaseType.STANDARD : JdbcMapper.DatabaseType.valueOf(databaseType.toUpperCase());
|
||||||
defaultArrayNumberTypeName = processingEnv.getOptions().get("jdbcMapper.arrayNumberTypeName");
|
defaultArrayNumberTypeName = processingEnv.getOptions().get("jdbcMapper.arrayNumberTypeName");
|
||||||
if (defaultArrayNumberTypeName == null || defaultArrayNumberTypeName.isEmpty())
|
if (defaultArrayNumberTypeName == null || defaultArrayNumberTypeName.isEmpty())
|
||||||
defaultArrayNumberTypeName = defaultDatabaseType.arrayNumberTypeName;
|
defaultArrayNumberTypeName = defaultDatabaseType.arrayNumberTypeName;
|
||||||
@ -194,9 +194,13 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
case UNNEST:
|
case UNNEST:
|
||||||
arrayInList = new UnNestArrayInList(arrayNumberTypeName, arrayStringTypeName);
|
arrayInList = new UnNestArrayInList(arrayNumberTypeName, arrayStringTypeName);
|
||||||
break;
|
break;
|
||||||
|
case BIND:
|
||||||
|
//arrayInList = BindInList.instance();
|
||||||
|
arrayInList = null; // todo: do something here
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// no support
|
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@JdbcMapper.Mapper.databaseType unsupported", element);
|
||||||
arrayInList = null;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
arrayInList = null;
|
arrayInList = null;
|
||||||
@ -386,7 +390,16 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "cannot combine in/not in and clob/blob", bindParam);
|
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "cannot combine in/not in and clob/blob", bindParam);
|
||||||
SpecialVariableElement inListBindParam = inListBindParams.get(paramName);
|
SpecialVariableElement inListBindParam = inListBindParams.get(paramName);
|
||||||
if(inListBindParam == null) {
|
if(inListBindParam == null) {
|
||||||
inListBindParam = new SpecialVariableElement(bindParam, SpecialVariableElement.SpecialType.IN_LIST, ++inListBindParamsIdx);
|
inListBindParam = new SpecialVariableElement(bindParam,
|
||||||
|
databaseType == JdbcMapper.DatabaseType.BIND ? SpecialVariableElement.SpecialType.BIND_IN_LIST : SpecialVariableElement.SpecialType.IN_LIST,
|
||||||
|
++inListBindParamsIdx);
|
||||||
|
if(databaseType == JdbcMapper.DatabaseType.BIND) {
|
||||||
|
final TypeMirror o = bindParam.asType();
|
||||||
|
if(o.getKind() == TypeKind.DECLARED && types.isAssignable(o, streamType)) {
|
||||||
|
// todo: this allows them to name underscore names and create collisions, I'm ok with it
|
||||||
|
inListBindParam.setName("_" + inListBindParam.getSimpleName() + "StreamAsBindArray");
|
||||||
|
}
|
||||||
|
}
|
||||||
inListBindParams.put(paramName, inListBindParam);
|
inListBindParams.put(paramName, inListBindParam);
|
||||||
}
|
}
|
||||||
bindParams.add(inListBindParam);
|
bindParams.add(inListBindParam);
|
||||||
@ -408,6 +421,11 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
"(" + inColumnName + " NOT IN(UNNEST(?)))" :
|
"(" + inColumnName + " NOT IN(UNNEST(?)))" :
|
||||||
"(" + inColumnName + " IN(UNNEST(?)))";
|
"(" + inColumnName + " IN(UNNEST(?)))";
|
||||||
break;
|
break;
|
||||||
|
case BIND:
|
||||||
|
replacement = "REPLACEMEWITHUNQUOTEDQUOTEPLZ + com.moparisthebest.jdbc.util.InListUtil.to" +
|
||||||
|
(not ? "Not" : "") + "InList(REPLACEMEWITHUNQUOTEDQUOTEPLZ"
|
||||||
|
+ inColumnName + "REPLACEMEWITHUNQUOTEDQUOTEPLZ, " + inListBindParam.getName() + ") + REPLACEMEWITHUNQUOTEDQUOTEPLZ";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "default DatabaseType? should never happen!!", bindParam);
|
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "default DatabaseType? should never happen!!", bindParam);
|
||||||
return false;
|
return false;
|
||||||
@ -441,13 +459,14 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
processingEnv.getMessager().printMessage(warnOnUnusedParams != null ? Diagnostic.Kind.MANDATORY_WARNING : Diagnostic.Kind.ERROR, String.format("@JdbcMapper.SQL method has unused parameter '%s'", unusedParam.getKey()), unusedParam.getValue());
|
processingEnv.getMessager().printMessage(warnOnUnusedParams != null ? Diagnostic.Kind.MANDATORY_WARNING : Diagnostic.Kind.ERROR, String.format("@JdbcMapper.SQL method has unused parameter '%s'", unusedParam.getKey()), unusedParam.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final boolean notBindInList = !inListBindParams.isEmpty() && databaseType != JdbcMapper.DatabaseType.BIND;
|
||||||
|
|
||||||
final SQLParser parsedSQl = ManualSQLParser.getSQLParser(sql, parser, sqlStatement);
|
final SQLParser parsedSQl = ManualSQLParser.getSQLParser(sql, parser, sqlStatement);
|
||||||
// now implementation
|
// now implementation
|
||||||
w.write("\t\tPreparedStatement ps = null;\n");
|
w.write("\t\tPreparedStatement ps = null;\n");
|
||||||
if (parsedSQl.isSelect())
|
if (parsedSQl.isSelect())
|
||||||
w.write("\t\tResultSet rs = null;\n");
|
w.write("\t\tResultSet rs = null;\n");
|
||||||
if(!inListBindParams.isEmpty())
|
if(notBindInList)
|
||||||
w.append("\t\tfinal Array[] _bindArrays = new Array[").append(Integer.toString(inListBindParams.size())).append("];\n");
|
w.append("\t\tfinal Array[] _bindArrays = new Array[").append(Integer.toString(inListBindParams.size())).append("];\n");
|
||||||
w.write("\t\ttry {\n");
|
w.write("\t\ttry {\n");
|
||||||
for (final SpecialVariableElement param : inListBindParams.values())
|
for (final SpecialVariableElement param : inListBindParams.values())
|
||||||
@ -463,13 +482,21 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
w.write("conn.prepareStatement(");
|
w.write("conn.prepareStatement(");
|
||||||
}
|
}
|
||||||
w.write('"');
|
w.write('"');
|
||||||
w.write(sqlStatement.replace("\"", "\\\"").replace("\n", "\\n\" +\n\t\t\t \""));
|
w.write(sqlStatement.replace("\"", "\\\"")
|
||||||
|
.replace("\n", "\\n\" +\n\t\t\t \"")
|
||||||
|
.replace("REPLACEMEWITHUNQUOTEDQUOTEPLZ", "\""));
|
||||||
w.write("\");\n");
|
w.write("\");\n");
|
||||||
|
|
||||||
// now bind parameters
|
// now bind parameters
|
||||||
|
if(!inListBindParams.isEmpty() && databaseType == JdbcMapper.DatabaseType.BIND) {
|
||||||
|
w.write("\t\t\tint psParamCount = 0;\n");
|
||||||
|
for (final VariableElement param : bindParams)
|
||||||
|
setObject(w, "++psParamCount", param);
|
||||||
|
} else {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (final VariableElement param : bindParams)
|
for (final VariableElement param : bindParams)
|
||||||
setObject(w, ++count, param);
|
setObject(w, Integer.toString(++count), param);
|
||||||
|
}
|
||||||
|
|
||||||
boolean closeRs = true;
|
boolean closeRs = true;
|
||||||
if (!parsedSQl.isSelect()) {
|
if (!parsedSQl.isSelect()) {
|
||||||
@ -503,7 +530,7 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
if (!sqlExceptionThrown)
|
if (!sqlExceptionThrown)
|
||||||
w.write("\t\t} catch(SQLException e) {\n\t\t\tthrow new RuntimeException(e);\n");
|
w.write("\t\t} catch(SQLException e) {\n\t\t\tthrow new RuntimeException(e);\n");
|
||||||
w.write("\t\t} finally {\n");
|
w.write("\t\t} finally {\n");
|
||||||
if(!inListBindParams.isEmpty())
|
if(notBindInList)
|
||||||
w.append("\t\t\tfor(final Array _bindArray : _bindArrays)\n\t\t\t\ttryClose(_bindArray);\n");
|
w.append("\t\t\tfor(final Array _bindArray : _bindArrays)\n\t\t\t\ttryClose(_bindArray);\n");
|
||||||
if (parsedSQl.isSelect())
|
if (parsedSQl.isSelect())
|
||||||
w.write("\t\t\ttryClose(rs);\n");
|
w.write("\t\t\ttryClose(rs);\n");
|
||||||
@ -520,7 +547,7 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
w.write("\t\t\tif(e instanceof SQLException)\n\t\t\t\tthrow (SQLException)e;\n");
|
w.write("\t\t\tif(e instanceof SQLException)\n\t\t\t\tthrow (SQLException)e;\n");
|
||||||
w.write("\t\t\tif(e instanceof RuntimeException)\n\t\t\t\tthrow (RuntimeException)e;\n");
|
w.write("\t\t\tif(e instanceof RuntimeException)\n\t\t\t\tthrow (RuntimeException)e;\n");
|
||||||
w.write("\t\t\tthrow new RuntimeException(e);\n");
|
w.write("\t\t\tthrow new RuntimeException(e);\n");
|
||||||
if(!inListBindParams.isEmpty()) {
|
if(notBindInList) {
|
||||||
w.write("\t\t} finally {\n");
|
w.write("\t\t} finally {\n");
|
||||||
w.append("\t\t\tfor(final Array _bindArray : _bindArrays)\n\t\t\t\ttryClose(_bindArray);\n");
|
w.append("\t\t\tfor(final Array _bindArray : _bindArrays)\n\t\t\t\ttryClose(_bindArray);\n");
|
||||||
}
|
}
|
||||||
@ -690,7 +717,7 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setArray(final Writer w, final JdbcMapper.DatabaseType databaseType, final String arrayNumberTypeName, final String arrayStringTypeName, final SpecialVariableElement specialParam) throws IOException {
|
private void setArray(final Writer w, final JdbcMapper.DatabaseType databaseType, final String arrayNumberTypeName, final String arrayStringTypeName, final SpecialVariableElement specialParam) throws IOException {
|
||||||
final String variableName = specialParam.getSimpleName().toString();
|
final String variableName = specialParam.getName();
|
||||||
final TypeMirror o = specialParam.asType();
|
final TypeMirror o = specialParam.asType();
|
||||||
|
|
||||||
final InListArgType inListArgType;
|
final InListArgType inListArgType;
|
||||||
@ -726,6 +753,16 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
IFJAVA6_END*/
|
IFJAVA6_END*/
|
||||||
|
if(databaseType == JdbcMapper.DatabaseType.BIND) {
|
||||||
|
specialParam.setComponentTypeString(componentType.toString());
|
||||||
|
// only need to do something special for streams here...
|
||||||
|
if(inListArgType == InListArgType.STREAM) {
|
||||||
|
// todo: is array or collection better here, doesn't matter to us...
|
||||||
|
w.append("\t\t\tfinal ").append(specialParam.getComponentTypeString()).append("[] ").append(specialParam.getName()).append(" = ");
|
||||||
|
w.append(specialParam.getSimpleName()).append(".toArray(").append(specialParam.getComponentTypeString()).append("[]::new);\n");
|
||||||
|
}
|
||||||
|
return; // we don't want any of the following
|
||||||
|
}
|
||||||
w.append("\t\t\t_bindArrays[").append(Integer.toString(specialParam.index)).append("] = ");
|
w.append("\t\t\t_bindArrays[").append(Integer.toString(specialParam.index)).append("] = ");
|
||||||
final String type = types.isAssignable(componentType, numberType) ? arrayNumberTypeName : arrayStringTypeName;
|
final String type = types.isAssignable(componentType, numberType) ? arrayNumberTypeName : arrayStringTypeName;
|
||||||
switch (databaseType) {
|
switch (databaseType) {
|
||||||
@ -774,7 +811,7 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
w.write(");\n");
|
w.write(");\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setObject(final Writer w, final int index, final VariableElement param) throws IOException {
|
private void setObject(final Writer w, final String index, final VariableElement param) throws IOException {
|
||||||
String variableName = param.getSimpleName().toString();
|
String variableName = param.getSimpleName().toString();
|
||||||
final TypeMirror o = param.asType();
|
final TypeMirror o = param.asType();
|
||||||
w.write("\t\t\t");
|
w.write("\t\t\t");
|
||||||
@ -784,16 +821,21 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
if (param instanceof SpecialVariableElement) {
|
if (param instanceof SpecialVariableElement) {
|
||||||
final SpecialVariableElement specialParam = (SpecialVariableElement) param;
|
final SpecialVariableElement specialParam = (SpecialVariableElement) param;
|
||||||
switch (specialParam.specialType) {
|
switch (specialParam.specialType) {
|
||||||
|
case BIND_IN_LIST: {
|
||||||
|
w.append("for(final ").append(specialParam.getComponentTypeString()).append(" _bindInListParam : ").append(specialParam.getName()).append(")\n");
|
||||||
|
w.append("\t\t\t\tps.setObject(").append(index).append(", _bindInListParam);\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
case IN_LIST: {
|
case IN_LIST: {
|
||||||
w.write("ps.setArray(");
|
w.write("ps.setArray(");
|
||||||
w.write(Integer.toString(index));
|
w.write(index);
|
||||||
w.append(", _bindArrays[").append(Integer.toString(specialParam.index)).append("]);\n");
|
w.append(", _bindArrays[").append(Integer.toString(specialParam.index)).append("]);\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case BLOB: {
|
case BLOB: {
|
||||||
if (types.isAssignable(o, stringType)) {
|
if (types.isAssignable(o, stringType)) {
|
||||||
w.write("try {\n\t\t\t\tps.setBlob(");
|
w.write("try {\n\t\t\t\tps.setBlob(");
|
||||||
w.write(Integer.toString(index));
|
w.write(index);
|
||||||
w.write(", ");
|
w.write(", ");
|
||||||
w.write(variableName);
|
w.write(variableName);
|
||||||
w.write(" == null ? null : new java.io.ByteArrayInputStream(");
|
w.write(" == null ? null : new java.io.ByteArrayInputStream(");
|
||||||
@ -884,7 +926,7 @@ public class JdbcMapperProcessor extends AbstractProcessor {
|
|||||||
w.write("ps.set");
|
w.write("ps.set");
|
||||||
w.write(method);
|
w.write(method);
|
||||||
w.write('(');
|
w.write('(');
|
||||||
w.write(Integer.toString(index));
|
w.write(index);
|
||||||
w.write(", ");
|
w.write(", ");
|
||||||
w.write(variableName);
|
w.write(variableName);
|
||||||
w.write(");\n");
|
w.write(");\n");
|
||||||
|
@ -12,6 +12,7 @@ import java.util.Set;
|
|||||||
class SpecialVariableElement implements VariableElement {
|
class SpecialVariableElement implements VariableElement {
|
||||||
|
|
||||||
enum SpecialType {
|
enum SpecialType {
|
||||||
|
BIND_IN_LIST,
|
||||||
IN_LIST,
|
IN_LIST,
|
||||||
CLOB,
|
CLOB,
|
||||||
BLOB,
|
BLOB,
|
||||||
@ -22,6 +23,8 @@ class SpecialVariableElement implements VariableElement {
|
|||||||
final String blobStringCharset;
|
final String blobStringCharset;
|
||||||
final int index;
|
final int index;
|
||||||
|
|
||||||
|
String name, componentTypeString;
|
||||||
|
|
||||||
SpecialVariableElement(final VariableElement delegate, final SpecialType specialType) {
|
SpecialVariableElement(final VariableElement delegate, final SpecialType specialType) {
|
||||||
this(delegate, specialType, null, 0);
|
this(delegate, specialType, null, 0);
|
||||||
}
|
}
|
||||||
@ -39,6 +42,23 @@ class SpecialVariableElement implements VariableElement {
|
|||||||
this.specialType = specialType;
|
this.specialType = specialType;
|
||||||
this.blobStringCharset = blobStringCharset;
|
this.blobStringCharset = blobStringCharset;
|
||||||
this.index = index;
|
this.index = index;
|
||||||
|
this.name = getSimpleName().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComponentTypeString() {
|
||||||
|
return componentTypeString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComponentTypeString(String componentTypeString) {
|
||||||
|
this.componentTypeString = componentTypeString;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -3,6 +3,7 @@ package com.moparisthebest.jdbc;
|
|||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static com.moparisthebest.jdbc.util.InListUtil.defaultMaxSize;
|
||||||
import static com.moparisthebest.jdbc.util.InListUtil.toInList;
|
import static com.moparisthebest.jdbc.util.InListUtil.toInList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -10,8 +11,6 @@ import static com.moparisthebest.jdbc.util.InListUtil.toInList;
|
|||||||
*/
|
*/
|
||||||
public class BindInList implements InList {
|
public class BindInList implements InList {
|
||||||
|
|
||||||
private static final int defaultMaxSize = Integer.parseInt(System.getProperty("QueryMapper.BindInList.defaultMaxSize", "999"));
|
|
||||||
|
|
||||||
private static final InList instance = new BindInList();
|
private static final InList instance = new BindInList();
|
||||||
|
|
||||||
public static InList instance() {
|
public static InList instance() {
|
||||||
|
16
test/pom.xml
16
test/pom.xml
@ -194,5 +194,21 @@
|
|||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
</profile>
|
</profile>
|
||||||
|
<profile>
|
||||||
|
<id>bind</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<compilerArgs>
|
||||||
|
<compilerArg>-AjdbcMapper.databaseType=BIND</compilerArg>
|
||||||
|
</compilerArgs>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
</project>
|
</project>
|
@ -245,6 +245,9 @@ public interface QmDao extends JdbcMapper {
|
|||||||
@SQL(selectStrVal)
|
@SQL(selectStrVal)
|
||||||
ZoneOffset getZoneOffsetString(long valNo) throws SQLException;
|
ZoneOffset getZoneOffsetString(long valNo) throws SQLException;
|
||||||
|
|
||||||
|
@SQL("SELECT person_no, first_name, last_name, birth_date from person WHERE {person_no IN personNos} ORDER BY person_no")
|
||||||
|
List<FieldPerson> getFieldPeopleStream(Stream<Long> personNos) throws SQLException;
|
||||||
|
|
||||||
//IFJAVA8_END
|
//IFJAVA8_END
|
||||||
|
|
||||||
@SQL("SELECT person_no, first_name, last_name, birth_date from person WHERE {person_no IN personNos} ORDER BY person_no")
|
@SQL("SELECT person_no, first_name, last_name, birth_date from person WHERE {person_no IN personNos} ORDER BY person_no")
|
||||||
|
@ -10,6 +10,7 @@ import java.sql.SQLException;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
//IFJAVA8_START
|
//IFJAVA8_START
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import java.time.*;
|
import java.time.*;
|
||||||
//IFJAVA8_END
|
//IFJAVA8_END
|
||||||
@ -453,6 +454,11 @@ public class QueryMapperQmDao implements QmDao {
|
|||||||
return qm.toObject(selectStrVal, ZoneOffset.class, valNo);
|
return qm.toObject(selectStrVal, ZoneOffset.class, valNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FieldPerson> getFieldPeopleStream(final Stream<Long> personNos) throws SQLException {
|
||||||
|
return lqm.toList("SELECT * from person WHERE " + inListReplace + " ORDER BY person_no", FieldPerson.class, lqm.inList("person_no", personNos.collect(Collectors.toList())));
|
||||||
|
}
|
||||||
|
|
||||||
//IFJAVA8_END
|
//IFJAVA8_END
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -13,6 +13,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
//IFJAVA8_START
|
//IFJAVA8_START
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import java.time.*;
|
import java.time.*;
|
||||||
//IFJAVA8_END
|
//IFJAVA8_END
|
||||||
@ -332,6 +333,11 @@ public class QueryMapperTypeQmDao extends QueryMapperQmDao {
|
|||||||
return qm.toType(selectStrVal, new TypeReference<ZoneOffset>() {}, valNo);
|
return qm.toType(selectStrVal, new TypeReference<ZoneOffset>() {}, valNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FieldPerson> getFieldPeopleStream(final Stream<Long> personNos) throws SQLException {
|
||||||
|
return lqm.toType("SELECT * from person WHERE " + inListReplace + " ORDER BY person_no", new TypeReference<List<FieldPerson>>() {}, lqm.inList("person_no", personNos.collect(Collectors.toList())));
|
||||||
|
}
|
||||||
|
|
||||||
//IFJAVA8_END
|
//IFJAVA8_END
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -75,16 +75,16 @@ public class QueryMapperTest {
|
|||||||
static {
|
static {
|
||||||
final Collection<String> jUrls = new ArrayList<String>();
|
final Collection<String> jUrls = new ArrayList<String>();
|
||||||
final String jdbcUrl = System.getProperty("jdbcUrl", "all");
|
final String jdbcUrl = System.getProperty("jdbcUrl", "all");
|
||||||
if(jdbcUrl.equals("all")) {
|
if(jdbcUrl.equals("all") || jdbcUrl.equals("bind")) {
|
||||||
//jUrls.add("jdbc:hsqldb:mem:testDB"); // remove this from all since it supports custom InList, until generic inlist supported in JdbcMapper
|
jUrls.add("jdbc:hsqldb:mem:testDB");
|
||||||
jUrls.add("jdbc:derby:memory:testDB;create=true");
|
jUrls.add("jdbc:derby:memory:testDB;create=true");
|
||||||
jUrls.add("jdbc:h2:mem:testDB");
|
jUrls.add("jdbc:h2:mem:testDB");
|
||||||
jUrls.add("jdbc:sqlite::memory:");
|
jUrls.add("jdbc:sqlite::memory:");
|
||||||
} else if(jdbcUrl.equals("hsql") || jdbcUrl.equals("hsqldb")) {
|
} else if(jdbcUrl.equals("hsql") || jdbcUrl.equals("hsqldb") || jdbcUrl.equals("unnest")) {
|
||||||
jUrls.add("jdbc:hsqldb:mem:testDB");
|
jUrls.add("jdbc:hsqldb:mem:testDB");
|
||||||
} else if(jdbcUrl.equals("derby")) {
|
} else if(jdbcUrl.equals("derby")) {
|
||||||
jUrls.add("jdbc:derby:memory:testDB;create=true");
|
jUrls.add("jdbc:derby:memory:testDB;create=true");
|
||||||
} else if(jdbcUrl.equals("h2")) {
|
} else if(jdbcUrl.equals("h2") || jdbcUrl.equals("any")) {
|
||||||
jUrls.add("jdbc:h2:mem:testDB");
|
jUrls.add("jdbc:h2:mem:testDB");
|
||||||
} else if(jdbcUrl.equals("sqlite")) {
|
} else if(jdbcUrl.equals("sqlite")) {
|
||||||
jUrls.add("jdbc:sqlite::memory:");
|
jUrls.add("jdbc:sqlite::memory:");
|
||||||
@ -521,28 +521,6 @@ public class QueryMapperTest {
|
|||||||
assertArrayEquals(people, fromDb.toArray());
|
assertArrayEquals(people, fromDb.toArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean supportsInList(final QmDao qm) {
|
|
||||||
return qm instanceof QueryMapperQmDao || supportsArrayInList(qm.getConnection());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testListQueryMapperList() throws SQLException {
|
|
||||||
if(!supportsInList(qm))
|
|
||||||
return;
|
|
||||||
final List<FieldPerson> fromDb = qm.getFieldPeople(Arrays.asList(people[0].getPersonNo(), people[1].getPersonNo(), people[2].getPersonNo()));
|
|
||||||
assertArrayEquals(people, fromDb.toArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testListQueryMapperListMultiple() throws SQLException {
|
|
||||||
if(!supportsInList(qm))
|
|
||||||
return;
|
|
||||||
final List<FieldPerson> fromDb = qm.getFieldPeopleByName(
|
|
||||||
Arrays.asList(people[0].getPersonNo(), people[1].getPersonNo(), people[2].getPersonNo()),
|
|
||||||
Arrays.asList(people[0].getFirstName(), people[1].getFirstName(), people[2].getFirstName()));
|
|
||||||
assertArrayEquals(people, fromDb.toArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testResultSetIterable() throws SQLException {
|
public void testResultSetIterable() throws SQLException {
|
||||||
final ResultSetIterable<FieldPerson> rsi = qm.getThreePeopleResultSetIterable(people[0].getPersonNo(), people[1].getPersonNo(), people[2].getPersonNo());
|
final ResultSetIterable<FieldPerson> rsi = qm.getThreePeopleResultSetIterable(people[0].getPersonNo(), people[1].getPersonNo(), people[2].getPersonNo());
|
||||||
@ -683,5 +661,25 @@ public class QueryMapperTest {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testListQueryMapperStream() throws SQLException {
|
||||||
|
final List<FieldPerson> fromDb = qm.getFieldPeopleStream(Stream.of(people[0].getPersonNo(), people[1].getPersonNo(), people[2].getPersonNo()));
|
||||||
|
assertArrayEquals(people, fromDb.toArray());
|
||||||
|
}
|
||||||
|
|
||||||
//IFJAVA8_END
|
//IFJAVA8_END
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testListQueryMapperList() throws SQLException {
|
||||||
|
final List<FieldPerson> fromDb = qm.getFieldPeople(Arrays.asList(people[0].getPersonNo(), people[1].getPersonNo(), people[2].getPersonNo()));
|
||||||
|
assertArrayEquals(people, fromDb.toArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testListQueryMapperListMultiple() throws SQLException {
|
||||||
|
final List<FieldPerson> fromDb = qm.getFieldPeopleByName(
|
||||||
|
Arrays.asList(people[0].getPersonNo(), people[1].getPersonNo(), people[2].getPersonNo()),
|
||||||
|
Arrays.asList(people[0].getFirstName(), people[1].getFirstName(), people[2].getFirstName()));
|
||||||
|
assertArrayEquals(people, fromDb.toArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user