INSERT
とりあえずINSERTのみ。
ライブラリ未使用のJavaのみです
Enttiyにセットした内容をもとにINSERT文を取得します
プリミティブ型の初期値がすこし厄介ですが...
使うとき.java
Entity entity = new Entity();
entity.setId("id");
String query = new CreateQuery<Entity>().insert(entity);
実際に作られるINSERT.sql
INSERT INTO entity ( id ) VALUES ( 'id' )
createQuery.java
package test;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CreateQuery<T> {
private Logger log = Logger.getLogger(this.getClass().getSimpleName());
public String insert(T t) {
String tableName = camelToSnake(t.getClass().getSimpleName());
Map<String, String> data = getData(t);
String query = "INSERT INTO " + tableName + " ( "
+ String.join(", ", data.keySet())
+ " ) VALUES ( "
+ String.join(", ", data.values()) + " )";
return query;
}
private Map<String, String> getData(T t) {
Map<Map<String, Object>, Class<?>> entity = new HashMap<>();
Stream.of(t.getClass().getDeclaredFields())
.map(v -> {
try {
Class<?> type = v.getType();
String column = v.getName();
final String flg;
if (!boolean.class.equals(type)) {
flg = ("get"
+ column.substring(0, 1).toUpperCase()
+ column.substring(1, column.length()));
} else if (boolean.class.equals(type) && column.startsWith("is")) {
String str = column.split("is")[1];
flg = ("is"
+ str.substring(0, 1).toUpperCase()
+ str.substring(1, str.length()));
} else if (boolean.class.equals(type) && !column.startsWith("is")) {
flg = ("is"
+ column.substring(0, 1).toUpperCase()
+ column.substring(1, column.length()));
} else {
flg = new String();
}
// invoke getter
Object value = Stream.of(t.getClass().getDeclaredMethods())
.filter(x -> flg.equals(x.getName()))
.findFirst().get()
.invoke(t);
if (value == null || new Integer(0).equals(value)) {
return null;
}
Map<Map<String, Object>, Class<?>> typedMap = new HashMap<>();
Map<String, Object> map = new HashMap<>();
map.put(camelToSnake(column), value);
typedMap.put(map, type);
return typedMap;
} catch (Exception e) {
e.printStackTrace();
log.warning(e.getMessage());
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList())
.forEach(entity::putAll);
// create query map
Map<String, String> data = new HashMap<>();
for (Entry<Map<String, Object>, Class<?>> e : entity.entrySet()) {
Class<?> type = e.getValue();
for (Entry<String, Object> rawData : e.getKey().entrySet()) {
String column = rawData.getKey();
String value = new String();
if (String.class.equals(type)) {
value = "\'" + (String) rawData.getValue() + "\'";
} else if (Date.class.equals(type)) {
value = "\'" + new SimpleDateFormat("YYYY-MM-DD").format((Date) rawData.getValue()) + "\'";
} else if (Time.class.equals(type)) {
value = "\'" + new SimpleDateFormat("HH:MM:SS").format((Time) rawData.getValue()) + "\'";
} else if (Timestamp.class.equals(type)) {
value = "\'" + new SimpleDateFormat("YYYY-MM-DD HH:MM:SS").format((Timestamp) rawData.getValue()) + "\'";
} else if (boolean.class.equals(type)){
value = (boolean) rawData.getValue() ? "TRUE" : "FALSE";
} else {
value = (String) rawData.getValue();
}
data.put(column, value);
}
}
return data;
}
private String camelToSnake(final String camel) {
final StringBuilder sb = new StringBuilder(camel.length() + camel.length());
for (int i = 0; i < camel.length(); i++) {
final char c = camel.charAt(i);
if (Character.isUpperCase(c)) {
sb.append(sb.length() != 0 ? '_' : "").append(Character.toLowerCase(c));
} else {
sb.append(Character.toLowerCase(c));
}
}
return sb.toString();
}
}