diff --git a/src/org/redkale/service/DataSourceService.java b/src/org/redkale/service/DataSourceService.java index fbd92f654..2670f9a39 100644 --- a/src/org/redkale/service/DataSourceService.java +++ b/src/org/redkale/service/DataSourceService.java @@ -93,11 +93,23 @@ public class DataSourceService implements DataSource, Service, AutoCloseable { return source.updateColumn(bean, node, columns); } + @Override + public int updateColumn(T bean, final SelectColumn selects) { + return source.updateColumn(bean, selects); + } + + @Override + public int updateColumn(T bean, final FilterNode node, final SelectColumn selects) { + return source.updateColumn(bean, node, selects); + } + + @Deprecated @Override public int updateColumns(T bean, final String... columns) { return source.updateColumn(bean, columns); } + @Deprecated @Override public int updateColumns(T bean, final FilterNode node, final String... columns) { return source.updateColumn(bean, node, columns); diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index 7f3dc0abe..f9e7d830b 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -448,7 +448,14 @@ public final class DataDefaultSource implements DataSource, Function attr : attrs) { - prestmt.setObject(++i, attr.get(value)); + Serializable val = attr.get(value); + if (val instanceof byte[]) { + Blob blob = conn.createBlob(); + blob.setBytes(1, (byte[]) val); + prestmt.setObject(++i, blob); + } else { + prestmt.setObject(++i, val); + } } prestmt.addBatch(); } @@ -688,7 +695,14 @@ public final class DataDefaultSource implements DataSource, Function attr : attrs) { - prestmt.setObject(++k, attr.get(value)); + Serializable val = attr.get(value); + if (val instanceof byte[]) { + Blob blob = conn.createBlob(); + blob.setBytes(1, (byte[]) val); + prestmt.setObject(++k, blob); + } else { + prestmt.setObject(++k, val); + } } prestmt.setObject(++k, primary.get(value)); prestmt.addBatch();//------------------------------------------------------------ @@ -757,17 +771,29 @@ public final class DataDefaultSource implements DataSource, Function int updateColumn(Connection conn, final EntityInfo info, Serializable id, String column, Serializable value) { + private int updateColumn(Connection conn, final EntityInfo info, Serializable id, String column, final Serializable value) { try { int c = -1; if (!info.isVirtualEntity()) { - String sql = "UPDATE " + info.getTable(id) + " SET " + info.getSQLColumn(null, column) + " = " - + info.formatToString(value) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); - if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); - conn.setReadOnly(false); - final Statement stmt = conn.createStatement(); - c = stmt.executeUpdate(sql); - stmt.close(); + if (value instanceof byte[]) { + String sql = "UPDATE " + info.getTable(id) + " SET " + info.getSQLColumn(null, column) + " = ? WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); + if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); + conn.setReadOnly(false); + final PreparedStatement stmt = conn.prepareStatement(sql); + Blob blob = conn.createBlob(); + blob.setBytes(1, (byte[]) value); + stmt.setBlob(1, blob); + c = stmt.executeUpdate(sql); + stmt.close(); + } else { + String sql = "UPDATE " + info.getTable(id) + " SET " + info.getSQLColumn(null, column) + " = " + + info.formatToString(value) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); + if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); + conn.setReadOnly(false); + final Statement stmt = conn.createStatement(); + c = stmt.executeUpdate(sql); + stmt.close(); + } } //--------------------------------------------------- final EntityCache cache = info.getCache(); @@ -807,7 +833,7 @@ public final class DataDefaultSource implements DataSource, Function int updateColumn(Connection conn, final EntityInfo info, String column, Serializable value, FilterNode node) { + private int updateColumn(Connection conn, final EntityInfo info, String column, final Serializable value, FilterNode node) { try { int c = -1; if (!info.isVirtualEntity()) { @@ -822,15 +848,30 @@ public final class DataDefaultSource implements DataSource, Function(); + blobs.add((byte[]) col.getValue()); + setsql.append(c).append(" = ?"); + } else { + setsql.append(c).append(" = ").append(info.formatSQLValue(c, col)); + } } } int c = -1; @@ -892,9 +941,21 @@ public final class DataDefaultSource implements DataSource, Function cache = info.getCache(); @@ -963,6 +1024,7 @@ public final class DataDefaultSource implements DataSource, Function> attrs = new ArrayList<>(); final List cols = new ArrayList<>(); final boolean virtual = info.isVirtualEntity(); + List blobs = null; for (ColumnValue col : values) { Attribute attr = info.getUpdateAttribute(col.getColumn()); if (attr == null) continue; @@ -971,7 +1033,13 @@ public final class DataDefaultSource implements DataSource, Function 0) setsql.append(", "); String c = info.getSQLColumn("a", col.getColumn()); - setsql.append(c).append(" = ").append(info.formatSQLValue(c, col)); + if (col.getValue() instanceof byte[]) { + if (blobs == null) blobs = new ArrayList<>(); + blobs.add((byte[]) col.getValue()); + setsql.append(c).append(" = ?"); + } else { + setsql.append(c).append(" = ").append(info.formatSQLValue(c, col)); + } } } int c = -1; @@ -993,9 +1061,21 @@ public final class DataDefaultSource implements DataSource, Function cache = info.getCache(); @@ -1078,45 +1174,48 @@ public final class DataDefaultSource implements DataSource, Function Entity类的泛型 - * @param bean Entity对象 - * @param node 过滤node 不能为null - * @param columns 需要更新的字段 - * - * @return 更新的数据条数 - */ @Override public int updateColumn(final T bean, final FilterNode node, final String... columns) { + return updateColumn(bean, node, SelectColumn.createIncludes(columns)); + } + + @Override + public int updateColumn(final T bean, final FilterNode node, final SelectColumn selects) { final EntityInfo info = loadEntityInfo((Class) bean.getClass()); if (info.isVirtualEntity()) { - return updateColumns(null, info, bean, node, columns); + return updateColumns(null, info, bean, node, selects); } Connection conn = createWriteSQLConnection(); try { - return updateColumns(conn, info, bean, node, columns); + return updateColumns(conn, info, bean, node, selects); } finally { closeSQLConnection(conn); } } - private int updateColumns(final Connection conn, final EntityInfo info, final T bean, final FilterNode node, final String... columns) { - if (bean == null || node == null || columns.length < 1) return -1; + private int updateColumns(final Connection conn, final EntityInfo info, final T bean, final FilterNode node, final SelectColumn selects) { + if (bean == null || node == null || selects == null) return -1; try { final Class clazz = (Class) bean.getClass(); StringBuilder setsql = new StringBuilder(); final Serializable id = info.getPrimary().get(bean); final List> attrs = new ArrayList<>(); + List blobs = null; final boolean virtual = info.isVirtualEntity(); - for (String col : columns) { - Attribute attr = info.getUpdateAttribute(col); - if (attr == null) continue; + for (Attribute attr : info.updateAttributes) { + if (!selects.test(attr.field())) continue; attrs.add(attr); if (!virtual) { if (setsql.length() > 0) setsql.append(", "); - setsql.append(info.getSQLColumn("a", col)).append(" = ").append(info.formatToString(attr.get(bean))); + setsql.append(info.getSQLColumn("a", attr.field())); + Serializable val = attr.get(bean); + if (val instanceof byte[]) { + if (blobs == null) blobs = new ArrayList<>(); + blobs.add((byte[]) val); + setsql.append(" = ?"); + } else { + setsql.append(" = ").append(info.formatToString(val)); + } } } int c = -1; @@ -1136,9 +1235,21 @@ public final class DataDefaultSource implements DataSource, Function