From 34ddd0d65e499e4a618501e41064f25725a25f57 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Wed, 6 Jul 2016 22:40:24 +0800 Subject: [PATCH] --- .../redkale/service/DataSourceService.java | 22 +++ src/org/redkale/source/DataDefaultSource.java | 134 +++++++++++++++++- src/org/redkale/source/DataSource.java | 16 ++- src/org/redkale/source/EntityCache.java | 9 ++ 4 files changed, 178 insertions(+), 3 deletions(-) diff --git a/src/org/redkale/service/DataSourceService.java b/src/org/redkale/service/DataSourceService.java index 478d9591d..de88daa2c 100644 --- a/src/org/redkale/service/DataSourceService.java +++ b/src/org/redkale/service/DataSourceService.java @@ -95,6 +95,17 @@ public class DataSourceService implements DataSource, Service, AutoCloseable { if (handler != null) handler.completed(null, id); } + @Override + public void updateColumn(final Class clazz, final String column, final Serializable value, final FilterNode node) { + source.updateColumn(clazz, column, value, node); + } + + @Override + public void updateColumn(final CompletionHandler handler, final Class clazz, final String column, final Serializable value, @DynAttachment final FilterNode node) { + source.updateColumn(clazz, column, value, node); + if (handler != null) handler.completed(null, node); + } + @Override public void updateColumnIncrement(final Class clazz, final Serializable id, final String column, long incvalue) { source.updateColumnIncrement(clazz, id, column, incvalue); @@ -139,6 +150,17 @@ public class DataSourceService implements DataSource, Service, AutoCloseable { if (handler != null) handler.completed(null, value); } + @Override + public void updateColumns(T value, final FilterNode node, final String... columns) { + source.updateColumns(value, node, columns); + } + + @Override + public void updateColumns(final CompletionHandler handler, final T value, @DynAttachment final FilterNode node, final String... columns) { + source.updateColumns(value, node, columns); + if (handler != null) handler.completed(null, node); + } + @Override public Number getNumberResult(final Class entityClass, FilterFunc func, final String column) { return source.getNumberResult(entityClass, func, column); diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index fa8b4e1bc..34d73e2cc 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -17,7 +17,6 @@ import java.util.logging.*; import javax.annotation.Resource; import javax.sql.ConnectionPoolDataSource; import javax.xml.stream.*; -import static org.redkale.source.FilterNode.formatToString; import org.redkale.util.*; import static org.redkale.source.FilterNode.formatToString; @@ -763,6 +762,63 @@ public final class DataDefaultSource implements DataSource, Function Entity类的泛型 + * @param clazz Entity类 + * @param column 过滤字段名 + * @param value 过滤字段值 + * @param node 过滤node 不能为null + */ + @Override + public void updateColumn(Class clazz, String column, Serializable value, FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + if (info.isVirtualEntity()) { + updateColumn(null, info, column, value, node); + return; + } + Connection conn = createWriteSQLConnection(); + try { + updateColumn(conn, info, column, value, node); + } finally { + closeSQLConnection(conn); + } + } + + @Override + public void updateColumn(final CompletionHandler handler, final Class clazz, final String column, final Serializable value, FilterNode node) { + updateColumn(clazz, column, value, node); + if (handler != null) handler.completed(null, node); + } + + private void updateColumn(Connection conn, final EntityInfo info, String column, Serializable value, FilterNode node) { + try { + if (!info.isVirtualEntity()) { + Map joinTabalis = node.getJoinTabalis(); + CharSequence join = node.createSQLJoin(this, joinTabalis, info); + CharSequence where = node.createSQLExpress(info, joinTabalis); + + String sql = "UPDATE " + info.getTable() + " a SET " + info.getSQLColumn("a", column) + " = " + + formatToString(value) + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); + final Statement stmt = conn.createStatement(); + stmt.execute(sql); + stmt.close(); + if (writeListener != null) writeListener.update(sql); + } + //--------------------------------------------------- + final EntityCache cache = info.getCache(); + if (cache == null) return; + T[] rs = cache.update(info.getAttribute(column), value, node); + if (cacheListener != null) cacheListener.updateCache(info.getType(), rs); + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + if (conn != null) closeSQLConnection(conn); + } + } + /** * 根据主键值给对象的column对应的值+incvalue, 必须是Entity Class * 等价SQL: UPDATE {clazz} SET {column} = {column} + {incvalue} WHERE {primary} = {id} @@ -994,6 +1050,75 @@ public final class DataDefaultSource implements DataSource, Function Entity类的泛型 + * @param value Entity对象 + * @param node 过滤node 不能为null + * @param columns 需要更新的字段 + */ + @Override + public void updateColumns(final T value, final FilterNode node, final String... columns) { + final EntityInfo info = loadEntityInfo((Class) value.getClass()); + if (info.isVirtualEntity()) { + updateColumns(null, info, value, node, columns); + return; + } + Connection conn = createWriteSQLConnection(); + try { + updateColumns(conn, info, value, node, columns); + } finally { + closeSQLConnection(conn); + } + } + + @Override + public void updateColumns(final CompletionHandler handler, final T value, final FilterNode node, final String... columns) { + updateColumns(value, node, columns); + if (handler != null) handler.completed(null, node); + } + + private void updateColumns(final Connection conn, final EntityInfo info, final T value, final FilterNode node, final String... columns) { + if (value == null || node == null || columns.length < 1) return; + try { + final Class clazz = (Class) value.getClass(); + StringBuilder setsql = new StringBuilder(); + final Serializable id = info.getPrimary().get(value); + final List> attrs = new ArrayList<>(); + final boolean virtual = info.isVirtualEntity(); + for (String col : columns) { + Attribute attr = info.getUpdateAttribute(col); + if (attr == null) continue; + attrs.add(attr); + if (!virtual) { + if (setsql.length() > 0) setsql.append(", "); + setsql.append(info.getSQLColumn("a", col)).append(" = ").append(formatToString(attr.get(value))); + } + } + if (!virtual) { + Map joinTabalis = node.getJoinTabalis(); + CharSequence join = node.createSQLJoin(this, joinTabalis, info); + CharSequence where = node.createSQLExpress(info, joinTabalis); + + String sql = "UPDATE " + info.getTable() + " a SET " + setsql + + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); + final Statement stmt = conn.createStatement(); + stmt.execute(sql); + stmt.close(); + if (writeListener != null) writeListener.update(sql); + } + //--------------------------------------------------- + final EntityCache cache = info.getCache(); + if (cache == null) return; + T[] rs = cache.update(value, attrs, node); + if (cacheListener != null) cacheListener.updateCache(clazz, rs); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + public void updateCache(Class clazz, T... values) { if (values.length == 0) return; final EntityInfo info = loadEntityInfo(clazz); @@ -1148,6 +1273,7 @@ public final class DataDefaultSource implements DataSource, Function Entity类的泛型 * @param clazz Entity类 * @param pk 主键值 + * * @return Entity对象 */ @Override @@ -1427,6 +1553,7 @@ public final class DataDefaultSource implements DataSource, Function Entity类的泛型 * @param clazz Entity类 * @param bean 过滤Bean + * * @return Entity对象集合 */ @Override @@ -1531,6 +1660,7 @@ public final class DataDefaultSource implements DataSource, Function void updateColumn(final Class clazz, final Serializable id, final String column, final Serializable value); + public void updateColumn(final Class clazz, final String column, final Serializable value, final FilterNode node); + 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); @@ -81,11 +83,15 @@ public interface DataSource { public void updateColumns(final T value, final String... columns); + public void updateColumns(final T value, final FilterNode node, final String... columns); + //----------------------异步版--------------------------------- public void update(final CompletionHandler handler, final T... values); public void updateColumn(final CompletionHandler handler, final Class clazz, final Serializable id, final String column, final Serializable value); + public void updateColumn(final CompletionHandler handler, final Class clazz, final String column, final Serializable value, final FilterNode node); + public void updateColumnIncrement(final CompletionHandler handler, final Class clazz, final Serializable id, final String column, long incvalue); public void updateColumnAnd(final CompletionHandler handler, final Class clazz, final Serializable id, final String column, long incvalue); @@ -94,8 +100,8 @@ public interface DataSource { public void updateColumns(final CompletionHandler handler, final T value, final String... columns); - - + public void updateColumns(final CompletionHandler handler, final T value, final FilterNode node, final String... columns); + //############################################# 查询接口 ############################################# //-----------------------getXXXXResult----------------------------- public Number getNumberResult(final Class entityClass, final FilterFunc func, final String column); @@ -130,6 +136,7 @@ public interface DataSource { * @param 泛型 * @param clazz Entity类 * @param pk 主键值 + * * @return Entity对象 */ public T find(final Class clazz, final Serializable pk); @@ -183,6 +190,7 @@ public interface DataSource { * @param clazz Entity类 * @param column 过滤字段名 * @param key 过滤字段值 + * * @return 字段值的集合 */ public HashSet queryColumnSet(final String selectedColumn, final Class clazz, final String column, final Serializable key); @@ -219,6 +227,7 @@ public interface DataSource { * @param clazz Entity类 * @param flipper 翻页对象 * @param bean 过滤Bean + * * @return 结果集合 */ public Sheet queryColumnSheet(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterBean bean); @@ -237,6 +246,7 @@ public interface DataSource { * @param clazz Entity类 * @param column 过滤字段名 * @param key 过滤字段值 + * * @return Entity的List */ public List queryList(final Class clazz, final String column, final Serializable key); @@ -288,6 +298,7 @@ public interface DataSource { * @param clazz Entity类 * @param flipper 翻页对象 * @param bean 过滤Bean + * * @return Entity的Sheet */ public Sheet querySheet(final Class clazz, final Flipper flipper, final FilterBean bean); @@ -322,6 +333,7 @@ public interface DataSource { * 通常用于复杂的更新操作 * * @param sqls SQL语句 + * * @return 结果数组 */ public int[] directExecute(String... sqls); diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index 9f3e68939..00c2399ea 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -400,6 +400,15 @@ public final class EntityCache { return rs; } + public T[] update(Attribute attr, final V fieldValue, final FilterNode node) { + if (attr == null || node == null) return (T[]) Array.newInstance(type, 0); + T[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len)); + for (T rs : rms) { + attr.set(rs, fieldValue); + } + return rms; + } + public T updateColumnOr(final Serializable id, Attribute attr, final long orvalue) { if (id == null) return null; T rs = this.map.get(id);