diff --git a/src/org/redkale/service/DataSourceService.java b/src/org/redkale/service/DataSourceService.java index 24b6ceaad..c6f28b0d8 100644 --- a/src/org/redkale/service/DataSourceService.java +++ b/src/org/redkale/service/DataSourceService.java @@ -64,28 +64,13 @@ public class DataSourceService implements DataSource, Service, AutoCloseable { } @Override - public void updateColumn(final Class clazz, final Serializable id, final ColumnValue... values) { - source.updateColumn(clazz, id, values); + public void updateColumns(final Class clazz, final Serializable id, final ColumnValue... values) { + source.updateColumns(clazz, id, values); } @Override - public void updateColumn(final Class clazz, final FilterNode node, final ColumnValue... values) { - source.updateColumn(clazz, node, values); - } - - @Override - public void updateColumnIncrement(final Class clazz, final Serializable id, final String column, long incvalue) { - source.updateColumnIncrement(clazz, id, column, incvalue); - } - - @Override - public void updateColumnAnd(final Class clazz, final Serializable id, final String column, long incvalue) { - source.updateColumnAnd(clazz, id, column, incvalue); - } - - @Override - public void updateColumnOr(final Class clazz, final Serializable id, final String column, long incvalue) { - source.updateColumnOr(clazz, id, column, incvalue); + public void updateColumns(final Class clazz, final FilterNode node, final ColumnValue... values) { + source.updateColumns(clazz, node, values); } @Override diff --git a/src/org/redkale/source/ColumnExpress.java b/src/org/redkale/source/ColumnExpress.java index 72e93fc09..ce36db0e5 100644 --- a/src/org/redkale/source/ColumnExpress.java +++ b/src/org/redkale/source/ColumnExpress.java @@ -15,7 +15,8 @@ package org.redkale.source; */ public enum ColumnExpress { MOV, //直接赋值 col = val - INCR, //追加值 col = col + val + INC, //追加值 col = col + val + MUL, //乘值 col = col * val AND, //与值 col = col & val - OR; //或值 col = col | val + ORR; //或值 col = col | val } diff --git a/src/org/redkale/source/ColumnValue.java b/src/org/redkale/source/ColumnValue.java index 8e0162249..1e1173f4b 100644 --- a/src/org/redkale/source/ColumnValue.java +++ b/src/org/redkale/source/ColumnValue.java @@ -6,6 +6,7 @@ package org.redkale.source; import java.io.Serializable; +import static org.redkale.source.ColumnExpress.*; /** * ColumnValue主要用于多个字段更新的表达式。 @@ -36,6 +37,30 @@ public class ColumnValue { this.value = value; } + public static ColumnValue create(String column, Serializable value) { + return new ColumnValue(column, value); + } + + public static ColumnValue createMov(String column, Serializable value) { + return new ColumnValue(column, MOV, value); + } + + public static ColumnValue createInc(String column, Serializable value) { + return new ColumnValue(column, INC, value); + } + + public static ColumnValue createMul(String column, Serializable value) { + return new ColumnValue(column, MUL, value); + } + + public static ColumnValue createAnd(String column, Serializable value) { + return new ColumnValue(column, AND, value); + } + + public static ColumnValue createOrr(String column, Serializable value) { + return new ColumnValue(column, ORR, value); + } + public String getColumn() { return column; } diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index 88c295d2e..2c4cf7d0c 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -740,7 +740,7 @@ public final class DataDefaultSource implements DataSource, Function void updateColumn(final Class clazz, final Serializable id, final ColumnValue... values) { + public void updateColumns(final Class clazz, final Serializable id, final ColumnValue... values) { final EntityInfo info = loadEntityInfo(clazz); if (info.isVirtualEntity()) { updateColumn(null, info, id, values); @@ -768,7 +768,8 @@ public final class DataDefaultSource implements DataSource, Function 0) setsql.append(", "); - setsql.append(info.getSQLColumn(null, col.getColumn())).append(" = ").append(info.formatToString(col.getValue())); + String c = info.getSQLColumn(null, col.getColumn()); + setsql.append(c).append(" = ").append(info.formatSQLValue(c, col)); } } if (!virtual) { @@ -797,7 +798,7 @@ public final class DataDefaultSource implements DataSource, Function void updateColumn(final Class clazz, final FilterNode node, final ColumnValue... values) { + public void updateColumns(final Class clazz, final FilterNode node, final ColumnValue... values) { final EntityInfo info = loadEntityInfo(clazz); if (info.isVirtualEntity()) { updateColumn(null, info, node, values); @@ -825,7 +826,8 @@ public final class DataDefaultSource implements DataSource, Function 0) setsql.append(", "); - setsql.append(info.getSQLColumn("a", col.getColumn())).append(" = ").append(info.formatToString(col.getValue())); + String c = info.getSQLColumn("a", col.getColumn()); + setsql.append(c).append(" = ").append(info.formatSQLValue(c, col)); } } if (!virtual) { @@ -849,153 +851,6 @@ public final class DataDefaultSource implements DataSource, Function Entity类的泛型 - * @param clazz Entity类 - * @param id 主键值 - * @param column 字段名 - * @param incvalue 字段加值 - */ - @Override - public void updateColumnIncrement(Class clazz, Serializable id, String column, long incvalue) { - final EntityInfo info = loadEntityInfo(clazz); - if (info.isVirtualEntity()) { - updateColumnIncrement(null, info, id, column, incvalue); - return; - } - Connection conn = createWriteSQLConnection(); - try { - updateColumnIncrement(conn, info, id, column, incvalue); - } finally { - closeSQLConnection(conn); - } - } - - private void updateColumnIncrement(Connection conn, final EntityInfo info, Serializable id, String column, long incvalue) { - try { - if (!info.isVirtualEntity()) { - String col = info.getSQLColumn(null, column); - String sql = "UPDATE " + info.getTable(id) + " SET " + col + " = " + col + " + (" + incvalue - + ") WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); - if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); - final Statement stmt = conn.createStatement(); - stmt.execute(sql); - stmt.close(); - } - //--------------------------------------------------- - final EntityCache cache = info.getCache(); - if (cache == null) return; - Attribute attr = info.getAttribute(column); - T value = cache.updateColumnIncrement(id, attr, incvalue); - if (value != null && cacheListener != null) cacheListener.updateCache(info.getType(), value); - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - if (conn != null) closeSQLConnection(conn); - } - } - - /** - * 根据主键值给对象的column对应的值 & andvalue, 必须是Entity Class - * 等价SQL: UPDATE {clazz} SET {column} = {column} & {incvalue} WHERE {primary} = {id} - * - * @param Entity类的泛型 - * @param clazz Entity类 - * @param id 主键值 - * @param column 字段名 - * @param andvalue 字段与值 - */ - @Override - public void updateColumnAnd(Class clazz, Serializable id, String column, long andvalue) { - final EntityInfo info = loadEntityInfo(clazz); - if (info.isVirtualEntity()) { - updateColumnAnd(null, info, id, column, andvalue); - return; - } - Connection conn = createWriteSQLConnection(); - try { - updateColumnAnd(conn, info, id, column, andvalue); - } finally { - closeSQLConnection(conn); - } - } - - private void updateColumnAnd(Connection conn, final EntityInfo info, Serializable id, String column, long andvalue) { - try { - if (!info.isVirtualEntity()) { - String col = info.getSQLColumn(null, column); - String sql = "UPDATE " + info.getTable(id) + " SET " + col + " = " + col + " & (" + andvalue - + ") WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); - if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); - final Statement stmt = conn.createStatement(); - stmt.execute(sql); - stmt.close(); - } - //--------------------------------------------------- - final EntityCache cache = info.getCache(); - if (cache == null) return; - Attribute attr = info.getAttribute(column); - T value = cache.updateColumnAnd(id, attr, andvalue); - if (value != null && cacheListener != null) cacheListener.updateCache(info.getType(), value); - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - if (conn != null) closeSQLConnection(conn); - } - } - - /** - * 根据主键值给对象的column对应的值 | andvalue, 必须是Entity Class - * 等价SQL: UPDATE {clazz} SET {column} = {column} | {incvalue} WHERE {primary} = {id} - * - * @param Entity类的泛型 - * @param clazz Entity类 - * @param id 主键值 - * @param column 字段名 - * @param orvalue 字段或值 - */ - @Override - public void updateColumnOr(Class clazz, Serializable id, String column, long orvalue) { - final EntityInfo info = loadEntityInfo(clazz); - if (info.isVirtualEntity()) { - updateColumnOr(null, info, id, column, orvalue); - return; - } - Connection conn = createWriteSQLConnection(); - try { - updateColumnOr(conn, info, id, column, orvalue); - } finally { - closeSQLConnection(conn); - } - } - - private void updateColumnOr(Connection conn, final EntityInfo info, Serializable id, String column, long orvalue) { - try { - if (!info.isVirtualEntity()) { - String col = info.getSQLColumn(null, column); - String sql = "UPDATE " + info.getTable(id) + " SET " + col + " = " + col + " | (" + orvalue - + ") WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); - if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); - final Statement stmt = conn.createStatement(); - stmt.execute(sql); - stmt.close(); - } - //--------------------------------------------------- - final EntityCache cache = info.getCache(); - if (cache == null) return; - Attribute attr = info.getAttribute(column); - T value = cache.updateColumnOr(id, attr, orvalue); - if (value != null && cacheListener != null) cacheListener.updateCache(info.getType(), value); - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - if (conn != null) closeSQLConnection(conn); - } - } - /** * 更新对象指定的一些字段, 必须是Entity对象 * diff --git a/src/org/redkale/source/DataSource.java b/src/org/redkale/source/DataSource.java index 560cd9373..66cd44311 100644 --- a/src/org/redkale/source/DataSource.java +++ b/src/org/redkale/source/DataSource.java @@ -66,15 +66,9 @@ public interface DataSource { public void updateColumn(final Class clazz, final String column, final Serializable value, final FilterNode node); - public void updateColumn(final Class clazz, final Serializable id, final ColumnValue... values); + public void updateColumns(final Class clazz, final Serializable id, final ColumnValue... values); - public void updateColumn(final Class clazz, final FilterNode node, final ColumnValue... values); - - public void updateColumnIncrement(final Class clazz, final Serializable id, final String column, long incvalue); - - public void updateColumnAnd(final Class clazz, final Serializable id, final String column, long incvalue); - - public void updateColumnOr(final Class clazz, final Serializable id, final String column, long incvalue); + public void updateColumns(final Class clazz, final FilterNode node, final ColumnValue... values); public void updateColumns(final T bean, final String... columns); diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index cc9fbf146..a121701c1 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -465,7 +465,7 @@ public final class EntityCache { T rs = this.map.get(id); if (rs == null) return rs; synchronized (rs) { - return updateColumn(attr, rs, ColumnExpress.OR, orvalue); + return updateColumn(attr, rs, ColumnExpress.ORR, orvalue); } } @@ -483,7 +483,7 @@ public final class EntityCache { T rs = this.map.get(id); if (rs == null) return rs; synchronized (rs) { - return updateColumn(attr, rs, ColumnExpress.INCR, incvalue); + return updateColumn(attr, rs, ColumnExpress.INC, incvalue); } } @@ -492,7 +492,7 @@ public final class EntityCache { Number numb = null; Serializable newval = null; switch (express) { - case INCR: + case INC: numb = (Number) attr.get(rs); if (numb == null) { numb = (Number) val; @@ -500,6 +500,14 @@ public final class EntityCache { numb = numb.longValue() + ((Number) val).longValue(); } break; + case MUL: + numb = (Number) attr.get(rs); + if (numb == null) { + numb = 0; + } else { + numb = numb.longValue() * ((Number) val).floatValue(); + } + break; case AND: numb = (Number) attr.get(rs); if (numb == null) { @@ -508,7 +516,7 @@ public final class EntityCache { numb = numb.longValue() & ((Number) val).longValue(); } break; - case OR: + case ORR: numb = (Number) attr.get(rs); if (numb == null) { numb = 0; diff --git a/src/org/redkale/source/EntityInfo.java b/src/org/redkale/source/EntityInfo.java index 259cf46f7..fb883214a 100644 --- a/src/org/redkale/source/EntityInfo.java +++ b/src/org/redkale/source/EntityInfo.java @@ -424,6 +424,23 @@ public final class EntityInfo { return getSQLColumn(tabalis, this.primary.field()); } + protected CharSequence formatSQLValue(String col, final ColumnValue cv) { + if (cv == null) return null; + switch (cv.getExpress()) { + case INC: + return new StringBuilder().append(col).append(" + ").append(cv.getValue()); + case MUL: + return new StringBuilder().append(col).append(" * ").append(cv.getValue()); + case AND: + return new StringBuilder().append(col).append(" & ").append(cv.getValue()); + case ORR: + return new StringBuilder().append(col).append(" | ").append(cv.getValue()); + case MOV: + return formatToString(cv.getValue()); + } + return formatToString(cv.getValue()); + } + protected Map> getAttributes() { return attributeMap; }