diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 4df95c8..65cc054 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 4df95c8..65cc054 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestInsert.java b/test/nl/astraeus/database/TestInsert.java index f608f63..2fec890 100644 --- a/test/nl/astraeus/database/TestInsert.java +++ b/test/nl/astraeus/database/TestInsert.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 4df95c8..65cc054 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestInsert.java b/test/nl/astraeus/database/TestInsert.java index f608f63..2fec890 100644 --- a/test/nl/astraeus/database/TestInsert.java +++ b/test/nl/astraeus/database/TestInsert.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestMissingReference.java b/test/nl/astraeus/database/TestMissingReference.java index bfd2b05..3d435de 100644 --- a/test/nl/astraeus/database/TestMissingReference.java +++ b/test/nl/astraeus/database/TestMissingReference.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 4df95c8..65cc054 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestInsert.java b/test/nl/astraeus/database/TestInsert.java index f608f63..2fec890 100644 --- a/test/nl/astraeus/database/TestInsert.java +++ b/test/nl/astraeus/database/TestInsert.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestMissingReference.java b/test/nl/astraeus/database/TestMissingReference.java index bfd2b05..3d435de 100644 --- a/test/nl/astraeus/database/TestMissingReference.java +++ b/test/nl/astraeus/database/TestMissingReference.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestReference.java b/test/nl/astraeus/database/TestReference.java index a7a0a19..84bc876 100644 --- a/test/nl/astraeus/database/TestReference.java +++ b/test/nl/astraeus/database/TestReference.java @@ -3,6 +3,7 @@ import junit.framework.Assert; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import nl.astraeus.database.test.model.Person; @@ -48,6 +49,8 @@ @Test public void testReference() { + Cache.get().clear(); + Persister.begin(); Person person = new Person("Name", 40, "Street"); diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 4df95c8..65cc054 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestInsert.java b/test/nl/astraeus/database/TestInsert.java index f608f63..2fec890 100644 --- a/test/nl/astraeus/database/TestInsert.java +++ b/test/nl/astraeus/database/TestInsert.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestMissingReference.java b/test/nl/astraeus/database/TestMissingReference.java index bfd2b05..3d435de 100644 --- a/test/nl/astraeus/database/TestMissingReference.java +++ b/test/nl/astraeus/database/TestMissingReference.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestReference.java b/test/nl/astraeus/database/TestReference.java index a7a0a19..84bc876 100644 --- a/test/nl/astraeus/database/TestReference.java +++ b/test/nl/astraeus/database/TestReference.java @@ -3,6 +3,7 @@ import junit.framework.Assert; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import nl.astraeus.database.test.model.Person; @@ -48,6 +49,8 @@ @Test public void testReference() { + Cache.get().clear(); + Persister.begin(); Person person = new Person("Name", 40, "Street"); diff --git a/test/nl/astraeus/database/TestSelectAll.java b/test/nl/astraeus/database/TestSelectAll.java index 3f0d60f..e3ea66d 100644 --- a/test/nl/astraeus/database/TestSelectAll.java +++ b/test/nl/astraeus/database/TestSelectAll.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 4df95c8..65cc054 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestInsert.java b/test/nl/astraeus/database/TestInsert.java index f608f63..2fec890 100644 --- a/test/nl/astraeus/database/TestInsert.java +++ b/test/nl/astraeus/database/TestInsert.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestMissingReference.java b/test/nl/astraeus/database/TestMissingReference.java index bfd2b05..3d435de 100644 --- a/test/nl/astraeus/database/TestMissingReference.java +++ b/test/nl/astraeus/database/TestMissingReference.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestReference.java b/test/nl/astraeus/database/TestReference.java index a7a0a19..84bc876 100644 --- a/test/nl/astraeus/database/TestReference.java +++ b/test/nl/astraeus/database/TestReference.java @@ -3,6 +3,7 @@ import junit.framework.Assert; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import nl.astraeus.database.test.model.Person; @@ -48,6 +49,8 @@ @Test public void testReference() { + Cache.get().clear(); + Persister.begin(); Person person = new Person("Name", 40, "Street"); diff --git a/test/nl/astraeus/database/TestSelectAll.java b/test/nl/astraeus/database/TestSelectAll.java index 3f0d60f..e3ea66d 100644 --- a/test/nl/astraeus/database/TestSelectAll.java +++ b/test/nl/astraeus/database/TestSelectAll.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestSelectWhere.java b/test/nl/astraeus/database/TestSelectWhere.java index 1145bff..67e6a24 100644 --- a/test/nl/astraeus/database/TestSelectWhere.java +++ b/test/nl/astraeus/database/TestSelectWhere.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/src/nl/astraeus/database/ConnectionProvider.java b/src/nl/astraeus/database/ConnectionProvider.java deleted file mode 100644 index ece7e56..0000000 --- a/src/nl/astraeus/database/ConnectionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.astraeus.database; - -import java.sql.Connection; - -/** - * Date: 11/16/13 - * Time: 12:00 PM - */ -public interface ConnectionProvider { - - public Connection getConnection(); - -} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java new file mode 100644 index 0000000..52e55ad --- /dev/null +++ b/src/nl/astraeus/database/DdlMapping.java @@ -0,0 +1,156 @@ +package nl.astraeus.database; + +import nl.astraeus.template.EscapeMode; +import nl.astraeus.template.SimpleTemplate; +import nl.astraeus.util.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Date: 11/19/13 + * Time: 10:46 PM + */ +public class DdlMapping { + private final static Logger logger = LoggerFactory.getLogger(DdlMapping.class); + + public static enum QueryTemplates { + CREATE, + CREATE_COLUMN, + INSERT, + UPDATE, + DELETE, + SELECT, + SELECT_WHERE, + SELECT_FROM + } + + public static enum DatabaseDefinition { + H2("H2", "h2"), + POSTGRESQL("PostgreSQL", "postgres"); + + private String name; + private String packageName; + + private DatabaseDefinition(String name, String packageName) { + this.name = name; + this.packageName = packageName; + } + + public String getName() { + return name; + } + + public String getPackageName() { + return packageName; + } + } + + private static DdlMapping instance = new DdlMapping(); + + public static DdlMapping get() { + return instance; + } + + private static Map, SimpleTemplate> ddlMapping; + private static Map, Class> primitiveToWrapper; + private static Map queryTemplates; + + static { + primitiveToWrapper = new HashMap<>(); + + primitiveToWrapper.put(boolean.class, Boolean.class); + primitiveToWrapper.put(byte.class, Byte.class); + primitiveToWrapper.put(char.class, Character.class); + primitiveToWrapper.put(double.class, Double.class); + primitiveToWrapper.put(float.class, Float.class); + primitiveToWrapper.put(int.class, Integer.class); + primitiveToWrapper.put(long.class, Long.class); + primitiveToWrapper.put(short.class, Short.class); + primitiveToWrapper.put(void.class, Void.class); + } + + private DatabaseDefinition database; + + public DdlMapping() { + setDatabaseType(DatabaseDefinition.H2); + } + + public void setDatabaseType(DatabaseDefinition definition) { + database = definition; + reload(); + } + + private String findSqlResource(String name) { + try { + InputStream in = DdlMapping.class.getResourceAsStream("sql/"+database.getPackageName()+"/"+name); + + if (in == null) { + in = DdlMapping.class.getResourceAsStream("sql/def/"+name); + } + + return Util.readAsString(in); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void reload() { + ddlMapping = new HashMap<>(); + queryTemplates = new HashMap<>(); + + try { + String types = findSqlResource("types.sql"); + + String [] lines = types.split("\\n"); + + for (String line : lines) { + String [] parts = line.split("\\="); + + if (parts.length != 2) { + logger.warn("Skipped line: ["+line+"] while loading mapping definition of types.sql"); + } + + Class cls = Class.forName(parts[0]); + ddlMapping.put(cls, new SimpleTemplate("${", "}", EscapeMode.NONE, parts[1])); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); + queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); + queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); + queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); + queryTemplates.put(QueryTemplates.SELECT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("select.sql"))); + queryTemplates.put(QueryTemplates.SELECT_WHERE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectWhere.sql"))); + queryTemplates.put(QueryTemplates.SELECT_FROM, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("selectFrom.sql"))); + } + + public SimpleTemplate getDdlTemplateForType(Class type) { + if (type.isPrimitive()) { + type = primitiveToWrapper.get(type); + } + + // todo: check for null + + return ddlMapping.get(type); + } + + public SimpleTemplate getBlobType() { + return getDdlTemplateForType(Object.class); + } + + public SimpleTemplate getIdType() { + return getDdlTemplateForType(Long.class); + } + + public SimpleTemplate getQueryTemplate(QueryTemplates type) { + return queryTemplates.get(type); + } +} diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index 9602814..f3d1086 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -1,7 +1,6 @@ package nl.astraeus.database; import nl.astraeus.database.annotations.*; -import nl.astraeus.template.EscapeMode; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,30 +42,18 @@ private boolean primaryKey = false; - private static Map, SimpleTemplate> ddlMapping; private static Map, Integer> sqlTypeMapping; // java.lang.Boolean BOOLEAN // java.lang.Byte TINYINT // java.lang.BigDecinal DECIMAL(${precision}, ${scale}) + private static Map ddlMappingx; + // todo: get these definitions from some configuration file static { - ddlMapping = new HashMap<>(); sqlTypeMapping = new HashMap<>(); - ddlMapping.put(String.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "VARCHAR(${length})")); - ddlMapping.put(Long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(long.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "BIGINT")); - ddlMapping.put(Integer.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(int.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "INT")); - ddlMapping.put(Short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(short.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "SMALLINT")); - ddlMapping.put(Double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(double.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(BigDecimal.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "DECIMAL(${precision}, ${scale})")); - ddlMapping.put(java.util.Date.class, new SimpleTemplate("${", "}", EscapeMode.NONE, "TIMESTAMP")); - sqlTypeMapping.put(String.class, Types.VARCHAR); sqlTypeMapping.put(Long.class, Types.BIGINT); sqlTypeMapping.put(long.class, Types.BIGINT); @@ -76,6 +63,8 @@ sqlTypeMapping.put(short.class, Types.SMALLINT); sqlTypeMapping.put(Double.class, Types.DECIMAL); sqlTypeMapping.put(double.class, Types.DECIMAL); + sqlTypeMapping.put(Boolean.class, Types.BOOLEAN); + sqlTypeMapping.put(boolean.class, Types.BOOLEAN); sqlTypeMapping.put(BigDecimal.class, Types.DECIMAL); sqlTypeMapping.put(java.util.Date.class, Types.TIMESTAMP); } @@ -115,7 +104,7 @@ model.put("scale", length.scale()); } - SimpleTemplate template = ddlMapping.get(javaType); + SimpleTemplate template = DdlMapping.get().getDdlTemplateForType(javaType); sqlType = sqlTypeMapping.get(javaType); String type = "BIGINT"; // default to id ref @@ -123,14 +112,9 @@ Serialized serialized = field.getAnnotation(Serialized.class); Collection collection = field.getAnnotation(Collection.class); - if (javaType.getAnnotation(Table.class) != null) { - // oneToone - type = "BIGINT"; - sqlType = Types.BIGINT; - this.type = ColumnType.REFERENCE; - } else if (serialized != null) { + if (serialized != null) { // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; this.type = ColumnType.SERIALIZED; } else if (collection != null) { @@ -138,8 +122,13 @@ this.type = ColumnType.COLLECTION; // BLOB - type = "BLOB"; + type = DdlMapping.get().getBlobType().render(model); sqlType = Types.BLOB; + } else if (javaType.getAnnotation(Table.class) != null) { + // oneToone + type = DdlMapping.get().getIdType().render(model); + sqlType = Types.BIGINT; + this.type = ColumnType.REFERENCE; } else if (template != null) { type = template.render(model); } else { @@ -232,6 +221,9 @@ case Types.SMALLINT: statement.setShort(index, (Short) value); break; + case Types.BOOLEAN: + statement.setBoolean(index, (Boolean) value); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { statement.setBigDecimal(index, (BigDecimal) value); @@ -249,7 +241,7 @@ id = metaData.getId(value); - if (id == null) { + if (id == null || id == 0) { Persister.insert(value); id = metaData.getId(value); @@ -308,6 +300,9 @@ case Types.SMALLINT: set(obj, rs.getShort(index)); break; + case Types.BOOLEAN: + set(obj, rs.getBoolean(index)); + break; case Types.DECIMAL: if (javaType.equals(BigDecimal.class)) { set(obj, rs.getBigDecimal(index)); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index d739799..b013b36 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -3,7 +3,6 @@ import nl.astraeus.database.annotations.Cache; import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; -import nl.astraeus.database.sql.TemplateHandler; import nl.astraeus.template.SimpleTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,10 +96,10 @@ createTable(); } - SimpleTemplate insertTemplate = TemplateHandler.get().getInsertTemplate(); - SimpleTemplate selectTemplate = TemplateHandler.get().getSelectTemplate(); - SimpleTemplate updateTemplate = TemplateHandler.get().getUpdateTemplate(); - SimpleTemplate deleteTemplate = TemplateHandler.get().getDeleteTemplate(); + SimpleTemplate insertTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.INSERT); + SimpleTemplate selectTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT); + SimpleTemplate updateTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.UPDATE); + SimpleTemplate deleteTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.DELETE); Map model = new HashMap<>(); @@ -158,7 +157,7 @@ model.put("columns", columns); model.put("key", pk.getColumnInfo().getName()); - SimpleTemplate template = TemplateHandler.get().getCreateTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE); execute(template, model); } @@ -169,7 +168,7 @@ model.put("tableName", tableName); model.put("column", meta.getColumnInfo()); - SimpleTemplate template = TemplateHandler.get().getCreateColumnTemplate(); + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_COLUMN); execute(template, model); } @@ -330,7 +329,7 @@ public List selectFrom(String query, final Object[] params) { List result; - SimpleTemplate fromTemplate = TemplateHandler.get().getSelectFromTemplate(); + SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); Map model = new HashMap<>(); @@ -376,7 +375,7 @@ public List selectWhere(String query, final Object[] params) { List result; - SimpleTemplate whereTemplate = TemplateHandler.get().getSelectWhereTemplate(); + SimpleTemplate whereTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_WHERE); Map model = new HashMap<>(); diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index 6049775..49e71bd 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -2,6 +2,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import java.sql.Connection; import java.sql.DriverManager; diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 3f9d849..09a9eef 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -1,6 +1,5 @@ package nl.astraeus.database.jdbc; -import nl.astraeus.database.ConnectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/nl/astraeus/database/jdbc/ConnectionProvider.java b/src/nl/astraeus/database/jdbc/ConnectionProvider.java new file mode 100644 index 0000000..5804474 --- /dev/null +++ b/src/nl/astraeus/database/jdbc/ConnectionProvider.java @@ -0,0 +1,13 @@ +package nl.astraeus.database.jdbc; + +import java.sql.Connection; + +/** + * Date: 11/16/13 + * Time: 12:00 PM + */ +public interface ConnectionProvider { + + public Connection getConnection(); + +} diff --git a/src/nl/astraeus/database/sql/TemplateHandler.java b/src/nl/astraeus/database/sql/TemplateHandler.java deleted file mode 100644 index d1615e3..0000000 --- a/src/nl/astraeus/database/sql/TemplateHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package nl.astraeus.database.sql; - -import nl.astraeus.template.EscapeMode; -import nl.astraeus.template.SimpleTemplate; - -/** - * Date: 11/15/13 - * Time: 9:51 PM - */ -public class TemplateHandler { - - private static TemplateHandler instance = new TemplateHandler(); - - public static TemplateHandler get() { - return instance; - } - - private SimpleTemplate createTemplate; - private SimpleTemplate createColumnTemplate; - private SimpleTemplate insertTemplate; - private SimpleTemplate updateTemplate; - private SimpleTemplate deleteTemplate; - private SimpleTemplate selectTemplate; - private SimpleTemplate selectWhereTemplate; - private SimpleTemplate selectFromTemplate; - - public TemplateHandler() { - createTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "create.sql"); - createColumnTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "createColumn.sql"); - insertTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "insert.sql"); - updateTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "update.sql"); - deleteTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "delete.sql"); - selectTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "select.sql"); - selectWhereTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectWhere.sql"); - selectFromTemplate = new SimpleTemplate("${", "}", EscapeMode.NONE, getClass(), "selectFrom.sql"); - } - - public SimpleTemplate getCreateTemplate() { - return createTemplate; - } - - public SimpleTemplate getCreateColumnTemplate() { - return createColumnTemplate; - } - - public SimpleTemplate getInsertTemplate() { - return insertTemplate; - } - - public SimpleTemplate getSelectWhereTemplate() { - return selectWhereTemplate; - } - - public SimpleTemplate getSelectTemplate() { - return selectTemplate; - } - - public SimpleTemplate getUpdateTemplate() { - return updateTemplate; - } - - public SimpleTemplate getDeleteTemplate() { - return deleteTemplate; - } - - public SimpleTemplate getSelectFromTemplate() { - return selectFromTemplate; - } -} diff --git a/src/nl/astraeus/database/sql/create.sql b/src/nl/astraeus/database/sql/create.sql deleted file mode 100644 index 0febe12..0000000 --- a/src/nl/astraeus/database/sql/create.sql +++ /dev/null @@ -1,4 +0,0 @@ -create table `${tableName}` (`${key}` BIGINT AUTO_INCREMENT,${each(columns as column)} - `${column.name}` ${column.type},${/each} - primary key(`${key}`) -); diff --git a/src/nl/astraeus/database/sql/createColumn.sql b/src/nl/astraeus/database/sql/createColumn.sql deleted file mode 100644 index 9fac2c1..0000000 --- a/src/nl/astraeus/database/sql/createColumn.sql +++ /dev/null @@ -1 +0,0 @@ -alter table `${tableName}` add column (`${column.name}` ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/create.sql b/src/nl/astraeus/database/sql/def/create.sql new file mode 100644 index 0000000..5445db2 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} BIGINT AUTO_INCREMENT,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/def/createColumn.sql b/src/nl/astraeus/database/sql/def/createColumn.sql new file mode 100644 index 0000000..e3d6526 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createColumn.sql @@ -0,0 +1 @@ +alter table ${tableName} add column (${column.name} ${column.type}); diff --git a/src/nl/astraeus/database/sql/def/delete.sql b/src/nl/astraeus/database/sql/def/delete.sql new file mode 100644 index 0000000..853f45b --- /dev/null +++ b/src/nl/astraeus/database/sql/def/delete.sql @@ -0,0 +1 @@ +delete from ${tableName} where ${key} = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/insert.sql b/src/nl/astraeus/database/sql/def/insert.sql new file mode 100644 index 0000000..351e188 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/insert.sql @@ -0,0 +1,3 @@ +insert into ${tableName} + (${each(columns as column)}${column}, ${eachlast}${column}${/each}) values + (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/def/select.sql b/src/nl/astraeus/database/sql/def/select.sql new file mode 100644 index 0000000..bdf43bb --- /dev/null +++ b/src/nl/astraeus/database/sql/def/select.sql @@ -0,0 +1,4 @@ +select ${each(columns as column)}${column}, + ${eachlast}${column}${/each} + from ${tableName} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/def/selectFrom.sql b/src/nl/astraeus/database/sql/def/selectFrom.sql new file mode 100644 index 0000000..744ea5e --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectFrom.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/def/selectWhere.sql b/src/nl/astraeus/database/sql/def/selectWhere.sql new file mode 100644 index 0000000..e3b9b82 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/selectWhere.sql @@ -0,0 +1,3 @@ +select ${key} + from ${tableName} + where ${query}; diff --git a/src/nl/astraeus/database/sql/def/update.sql b/src/nl/astraeus/database/sql/def/update.sql new file mode 100644 index 0000000..0e75fa3 --- /dev/null +++ b/src/nl/astraeus/database/sql/def/update.sql @@ -0,0 +1,4 @@ +update ${tableName} + set ${each(columns as column)}${column} = ?, + ${eachlast}${column} = ?${/each} + where ${key} = ?; diff --git a/src/nl/astraeus/database/sql/delete.sql b/src/nl/astraeus/database/sql/delete.sql deleted file mode 100644 index 015848c..0000000 --- a/src/nl/astraeus/database/sql/delete.sql +++ /dev/null @@ -1 +0,0 @@ -delete from `${tableName}` where `${key}` = ?; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2/types.sql b/src/nl/astraeus/database/sql/h2/types.sql new file mode 100644 index 0000000..ab69dd0 --- /dev/null +++ b/src/nl/astraeus/database/sql/h2/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INT +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/h2types.sql b/src/nl/astraeus/database/sql/h2types.sql deleted file mode 100644 index f075ae5..0000000 --- a/src/nl/astraeus/database/sql/h2types.sql +++ /dev/null @@ -1,8 +0,0 @@ -java.lang.String VARCHAR(${length}) -java.lang.Boolean BOOLEAN -java.lang.Integer INT -java.lang.Short SMALLINT -java.lang.Byte TINYINT -java.lang.Long BIGINT -java.lang.Double DECIMAL(${precision}, ${scale}) -java.lang.BigDecinal DECIMAL(${precision}, ${scale}) diff --git a/src/nl/astraeus/database/sql/insert.sql b/src/nl/astraeus/database/sql/insert.sql deleted file mode 100644 index 2b3a735..0000000 --- a/src/nl/astraeus/database/sql/insert.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into `${tableName}` - (${each(columns as column)}`${column}`, ${eachlast}`${column}`${/each}) values - (${each(columns as column)}?, ${eachlast}?${/each}); diff --git a/src/nl/astraeus/database/sql/postgresql/create.sql b/src/nl/astraeus/database/sql/postgresql/create.sql new file mode 100644 index 0000000..b148dde --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/create.sql @@ -0,0 +1,4 @@ +create table ${tableName} (${key} SERIAL,${each(columns as column)} + ${column.name} ${column.type},${/each} + primary key(${key}) +); diff --git a/src/nl/astraeus/database/sql/postgresql/types.sql b/src/nl/astraeus/database/sql/postgresql/types.sql new file mode 100644 index 0000000..b3d1fe4 --- /dev/null +++ b/src/nl/astraeus/database/sql/postgresql/types.sql @@ -0,0 +1,10 @@ +java.lang.String=VARCHAR(${length}) +java.lang.Boolean=BOOLEAN +java.lang.Integer=INTEGER +java.lang.Short=SMALLINT +java.lang.Byte=TINYINT +java.lang.Long=BIGINT +java.lang.Double=DECIMAL(${precision}, ${scale}) +java.math.BigDecimal=DECIMAL(${precision}, ${scale}) +java.util.Date=TIMESTAMP +java.lang.Object=BLOB \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/select.sql b/src/nl/astraeus/database/sql/select.sql deleted file mode 100644 index 4a9f053..0000000 --- a/src/nl/astraeus/database/sql/select.sql +++ /dev/null @@ -1,4 +0,0 @@ -select ${each(columns as column)}`${column}`, - ${eachlast}`${column}`${/each} - from `${tableName}` - where `${key}` = ?; diff --git a/src/nl/astraeus/database/sql/selectFrom.sql b/src/nl/astraeus/database/sql/selectFrom.sql deleted file mode 100644 index 51a0159..0000000 --- a/src/nl/astraeus/database/sql/selectFrom.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - ${query}; \ No newline at end of file diff --git a/src/nl/astraeus/database/sql/selectWhere.sql b/src/nl/astraeus/database/sql/selectWhere.sql deleted file mode 100644 index 119d169..0000000 --- a/src/nl/astraeus/database/sql/selectWhere.sql +++ /dev/null @@ -1,3 +0,0 @@ -select `${key}` - from `${tableName}` - where ${query}; diff --git a/src/nl/astraeus/database/sql/update.sql b/src/nl/astraeus/database/sql/update.sql deleted file mode 100644 index d6de642..0000000 --- a/src/nl/astraeus/database/sql/update.sql +++ /dev/null @@ -1,4 +0,0 @@ -update `${tableName}` - set ${each(columns as column)}`${column}` = ?, - ${eachlast}`${column}` = ?${/each} - where `${key}` = ?; diff --git a/src/nl/astraeus/database/test.sql b/src/nl/astraeus/database/test.sql new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/src/nl/astraeus/database/test.sql @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/test/nl/astraeus/database/DdlMappingTest.java b/test/nl/astraeus/database/DdlMappingTest.java new file mode 100644 index 0000000..0589fec --- /dev/null +++ b/test/nl/astraeus/database/DdlMappingTest.java @@ -0,0 +1,15 @@ +package nl.astraeus.database; + +import org.junit.Test; + +/** + * Date: 11/19/13 + * Time: 11:07 PM + */ +public class DdlMappingTest { + + @Test + public void getInstance() { + DdlMapping.get().getDdlTemplateForType(Long.class); + } +} diff --git a/test/nl/astraeus/database/TestCache.java b/test/nl/astraeus/database/TestCache.java index 460cfbc..7f4e836 100644 --- a/test/nl/astraeus/database/TestCache.java +++ b/test/nl/astraeus/database/TestCache.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestCollection.java b/test/nl/astraeus/database/TestCollection.java index a92d986..5539cf0 100644 --- a/test/nl/astraeus/database/TestCollection.java +++ b/test/nl/astraeus/database/TestCollection.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestCompoundPK.java b/test/nl/astraeus/database/TestCompoundPK.java index 724ad0a..b083783 100644 --- a/test/nl/astraeus/database/TestCompoundPK.java +++ b/test/nl/astraeus/database/TestCompoundPK.java @@ -3,6 +3,7 @@ import nl.astraeus.database.annotations.Id; import nl.astraeus.database.annotations.Table; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/nl/astraeus/database/TestDataTypes.java b/test/nl/astraeus/database/TestDataTypes.java index 761e25c..97d74ec 100644 --- a/test/nl/astraeus/database/TestDataTypes.java +++ b/test/nl/astraeus/database/TestDataTypes.java @@ -5,6 +5,7 @@ import nl.astraeus.database.annotations.Serialized; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -67,6 +68,8 @@ public Date lastAccess; + public boolean bit; + @Serialized public String blub; @@ -86,6 +89,7 @@ type.created = System.currentTimeMillis(); type.lastAccess = new Date(); type.blub = "Some serialized string thingy!"; + type.bit = true; insert(type); } @@ -105,6 +109,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); Cache.get().clear(); @@ -119,6 +124,7 @@ System.out.println("Created: "+type.created+" ("+new Date(type.created)+")"); System.out.println("LastAccess: "+type.lastAccess); System.out.println("Blub: "+type.blub); + System.out.println("Bit: "+type.bit); } }); diff --git a/test/nl/astraeus/database/TestDelete.java b/test/nl/astraeus/database/TestDelete.java index 59da52c..0d2c726 100644 --- a/test/nl/astraeus/database/TestDelete.java +++ b/test/nl/astraeus/database/TestDelete.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 4df95c8..65cc054 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestInsert.java b/test/nl/astraeus/database/TestInsert.java index f608f63..2fec890 100644 --- a/test/nl/astraeus/database/TestInsert.java +++ b/test/nl/astraeus/database/TestInsert.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestMissingReference.java b/test/nl/astraeus/database/TestMissingReference.java index bfd2b05..3d435de 100644 --- a/test/nl/astraeus/database/TestMissingReference.java +++ b/test/nl/astraeus/database/TestMissingReference.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; diff --git a/test/nl/astraeus/database/TestReference.java b/test/nl/astraeus/database/TestReference.java index a7a0a19..84bc876 100644 --- a/test/nl/astraeus/database/TestReference.java +++ b/test/nl/astraeus/database/TestReference.java @@ -3,6 +3,7 @@ import junit.framework.Assert; import nl.astraeus.database.cache.Cache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Company; import nl.astraeus.database.test.model.Info; import nl.astraeus.database.test.model.Person; @@ -48,6 +49,8 @@ @Test public void testReference() { + Cache.get().clear(); + Persister.begin(); Person person = new Person("Name", 40, "Street"); diff --git a/test/nl/astraeus/database/TestSelectAll.java b/test/nl/astraeus/database/TestSelectAll.java index 3f0d60f..e3ea66d 100644 --- a/test/nl/astraeus/database/TestSelectAll.java +++ b/test/nl/astraeus/database/TestSelectAll.java @@ -4,6 +4,7 @@ import nl.astraeus.database.cache.Cache; import nl.astraeus.database.cache.ObjectCache; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestSelectWhere.java b/test/nl/astraeus/database/TestSelectWhere.java index 1145bff..67e6a24 100644 --- a/test/nl/astraeus/database/TestSelectWhere.java +++ b/test/nl/astraeus/database/TestSelectWhere.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/test/nl/astraeus/database/TestUpdate.java b/test/nl/astraeus/database/TestUpdate.java index a216d99..a21c23c 100644 --- a/test/nl/astraeus/database/TestUpdate.java +++ b/test/nl/astraeus/database/TestUpdate.java @@ -2,6 +2,7 @@ import junit.framework.Assert; import nl.astraeus.database.jdbc.ConnectionPool; +import nl.astraeus.database.jdbc.ConnectionProvider; import nl.astraeus.database.test.model.Person; import org.junit.AfterClass; import org.junit.BeforeClass;