From e31c4a30418614672ae8fe309b371f2d6b008d88 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Tue, 28 Feb 2017 13:37:38 +0800 Subject: [PATCH] =?UTF-8?q?DataSource=E5=A2=9E=E5=8A=A0=E6=94=AF=E6=8C=81B?= =?UTF-8?q?lob=EF=BC=88byte[]=EF=BC=89=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redkale/service/DataSourceService.java | 12 + src/org/redkale/source/DataDefaultSource.java | 269 +++++++++++++----- src/org/redkale/source/DataSource.java | 33 ++- src/org/redkale/source/EntityInfo.java | 64 +++-- 4 files changed, 278 insertions(+), 100 deletions(-) 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