提交 8a0f4354 authored 作者: Thomas Mueller's avatar Thomas Mueller

Issue 121: JaQu simple update and merge methods

上级 279da7c5
......@@ -85,6 +85,16 @@ public class Db {
define(clazz).createTableIfRequired(this).insert(this, t);
}
public <T> void merge(T t) {
Class< ? > clazz = t.getClass();
define(clazz).createTableIfRequired(this).merge(this, t);
}
public <T> void update(T t) {
Class< ? > clazz = t.getClass();
define(clazz).createTableIfRequired(this).update(this, t);
}
public <T extends Object> Query<T> from(T alias) {
Class< ? > clazz = alias.getClass();
define(clazz).createTableIfRequired(this);
......
......@@ -12,6 +12,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import org.h2.jaqu.util.Utils;
......@@ -34,7 +35,7 @@ class TableDefinition<T> {
static class IndexDefinition {
boolean unique;
String indexName;
String[] columnNames;
List<String> columnNames;
}
//## Java 1.5 end ##
......@@ -47,6 +48,7 @@ class TableDefinition<T> {
Field field;
String dataType;
int maxLength;
boolean isPrimaryKey;
Object getValue(Object obj) {
try {
......@@ -84,7 +86,7 @@ class TableDefinition<T> {
private ArrayList<FieldDefinition> fields = Utils.newArrayList();
private IdentityHashMap<Object, FieldDefinition> fieldMap =
Utils.newIdentityHashMap();
private String[] primaryKeyColumnNames;
private List<String> primaryKeyColumnNames;
private ArrayList<IndexDefinition> indexes = Utils.newArrayList();
TableDefinition(Class<T> clazz) {
......@@ -98,6 +100,11 @@ class TableDefinition<T> {
void setPrimaryKey(Object[] primaryKeyColumns) {
this.primaryKeyColumnNames = mapColumnNames(primaryKeyColumns);
// set isPrimaryKey flag for all field definitions
for (FieldDefinition fieldDefinition : fieldMap.values()) {
fieldDefinition.isPrimaryKey = this.primaryKeyColumnNames
.contains(fieldDefinition.columnName);
}
}
<A> String getColumnName(A fieldObject) {
......@@ -105,11 +112,10 @@ class TableDefinition<T> {
return def == null ? null : def.columnName;
}
private String[] mapColumnNames(Object[] columns) {
int len = columns.length;
String[] columnNames = new String[len];
for (int i = 0; i < len; i++) {
columnNames[i] = getColumnName(columns[i]);
private List<String> mapColumnNames(Object[] columns) {
List<String> columnNames = Utils.newArrayList();
for (Object column : columns) {
columnNames.add(getColumnName(column));
}
return columnNames;
}
......@@ -186,6 +192,80 @@ class TableDefinition<T> {
stat.executeUpdate();
}
void merge(Db db, Object obj) {
if (primaryKeyColumnNames == null || primaryKeyColumnNames.size() == 0) {
throw new IllegalStateException("No primary key columns defined "
+ "for table " + obj.getClass() + " - no update possible");
}
SQLStatement stat = new SQLStatement(db);
StatementBuilder buff = new StatementBuilder("MERGE INTO ");
buff.append(tableName).append(" (");
buff.resetCount();
for (FieldDefinition field : fields) {
buff.appendExceptFirst(", ");
buff.append(field.columnName);
}
buff.append(") KEY(");
buff.resetCount();
for (FieldDefinition field : fields) {
if (field.isPrimaryKey) {
buff.appendExceptFirst(", ");
buff.append(field.columnName);
}
}
buff.append(") ");
buff.resetCount();
buff.append("VALUES (");
for (FieldDefinition field : fields) {
buff.appendExceptFirst(", ");
buff.append('?');
Object value = field.getValue(obj);
stat.addParameter(value);
}
buff.append(')');
stat.setSQL(buff.toString());
stat.executeUpdate();
}
void update(Db db, Object obj) {
if (primaryKeyColumnNames == null || primaryKeyColumnNames.size() == 0) {
throw new IllegalStateException("No primary key columns defined "
+ "for table " + obj.getClass() + " - no update possible");
}
SQLStatement stat = new SQLStatement(db);
StatementBuilder buff = new StatementBuilder("UPDATE ");
buff.append(tableName).append(" SET ");
buff.resetCount();
for (FieldDefinition field : fields) {
if (!field.isPrimaryKey) {
buff.appendExceptFirst(", ");
buff.append(field.columnName);
buff.append(" = ?");
Object value = field.getValue(obj);
stat.addParameter(value);
}
}
Object alias = Utils.newObject(obj.getClass());
Query<Object> query = Query.from(db, alias);
boolean firstCondition = true;
for (FieldDefinition field : fields) {
if (field.isPrimaryKey) {
Object aliasValue = field.getValue(alias);
Object value = field.getValue(obj);
if (!firstCondition) {
query.addConditionToken(ConditionAndOr.AND);
}
firstCondition = false;
query.addConditionToken(
new Condition<Object>(
aliasValue, value, CompareType.EQUAL));
}
}
stat.setSQL(buff.toString());
query.appendWhere(stat);
stat.executeUpdate();
}
TableDefinition<T> createTableIfRequired(Db db) {
SQLStatement stat = new SQLStatement(db);
StatementBuilder buff = new StatementBuilder("CREATE TABLE IF NOT EXISTS ");
......
......@@ -130,7 +130,7 @@ public class Utils {
return null;
}
Class< ? > currentType = o.getClass();
if (currentType == targetType) {
if (targetType.isAssignableFrom(currentType)) {
return o;
}
if (targetType == String.class) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论