DataSource增加支持Blob(byte[])类型字段功能

This commit is contained in:
Redkale
2017-02-28 13:37:38 +08:00
parent 2928d5fc93
commit e31c4a3041
4 changed files with 278 additions and 100 deletions

View File

@@ -93,11 +93,23 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
return source.updateColumn(bean, node, columns); return source.updateColumn(bean, node, columns);
} }
@Override
public <T> int updateColumn(T bean, final SelectColumn selects) {
return source.updateColumn(bean, selects);
}
@Override
public <T> int updateColumn(T bean, final FilterNode node, final SelectColumn selects) {
return source.updateColumn(bean, node, selects);
}
@Deprecated
@Override @Override
public <T> int updateColumns(T bean, final String... columns) { public <T> int updateColumns(T bean, final String... columns) {
return source.updateColumn(bean, columns); return source.updateColumn(bean, columns);
} }
@Deprecated
@Override @Override
public <T> int updateColumns(T bean, final FilterNode node, final String... columns) { public <T> int updateColumns(T bean, final FilterNode node, final String... columns) {
return source.updateColumn(bean, node, columns); return source.updateColumn(bean, node, columns);

View File

@@ -448,7 +448,14 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
int i = 0; int i = 0;
if (info.autouuid) info.createPrimaryValue(value); if (info.autouuid) info.createPrimaryValue(value);
for (Attribute<T, Serializable> attr : attrs) { for (Attribute<T, Serializable> 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(); prestmt.addBatch();
} }
@@ -688,7 +695,14 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
for (final T value : values) { for (final T value : values) {
int k = 0; int k = 0;
for (Attribute<T, Serializable> attr : attrs) { for (Attribute<T, Serializable> 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.setObject(++k, primary.get(value));
prestmt.addBatch();//------------------------------------------------------------ prestmt.addBatch();//------------------------------------------------------------
@@ -757,17 +771,29 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
} }
} }
private <T> int updateColumn(Connection conn, final EntityInfo<T> info, Serializable id, String column, Serializable value) { private <T> int updateColumn(Connection conn, final EntityInfo<T> info, Serializable id, String column, final Serializable value) {
try { try {
int c = -1; int c = -1;
if (!info.isVirtualEntity()) { if (!info.isVirtualEntity()) {
String sql = "UPDATE " + info.getTable(id) + " SET " + info.getSQLColumn(null, column) + " = " if (value instanceof byte[]) {
+ info.formatToString(value) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); 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); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
conn.setReadOnly(false); conn.setReadOnly(false);
final Statement stmt = conn.createStatement(); final PreparedStatement stmt = conn.prepareStatement(sql);
c = stmt.executeUpdate(sql); Blob blob = conn.createBlob();
stmt.close(); 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<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
@@ -807,7 +833,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
} }
} }
private <T> int updateColumn(Connection conn, final EntityInfo<T> info, String column, Serializable value, FilterNode node) { private <T> int updateColumn(Connection conn, final EntityInfo<T> info, String column, final Serializable value, FilterNode node) {
try { try {
int c = -1; int c = -1;
if (!info.isVirtualEntity()) { if (!info.isVirtualEntity()) {
@@ -822,15 +848,30 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
join1 = multisplit('[', ']', ",", new StringBuilder(), joinstr, 0); join1 = multisplit('[', ']', ",", new StringBuilder(), joinstr, 0);
join2 = multisplit('{', '}', " AND ", new StringBuilder(), joinstr, 0); join2 = multisplit('{', '}', " AND ", new StringBuilder(), joinstr, 0);
} }
String sql = "UPDATE " + info.getTable(node) + " a " + (join1 == null ? "" : (", " + join1)) if (value instanceof byte[]) {
+ " SET " + info.getSQLColumn("a", column) + " = " + info.formatToString(value) String sql = "UPDATE " + info.getTable(node) + " a " + (join1 == null ? "" : (", " + join1))
+ ((where == null || where.length() == 0) ? (join2 == null ? "" : (" WHERE " + join2)) + " SET " + info.getSQLColumn("a", column) + " = ?"
: (" WHERE " + where + (join2 == null ? "" : (" AND " + join2)))); + ((where == null || where.length() == 0) ? (join2 == null ? "" : (" WHERE " + join2))
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); : (" WHERE " + where + (join2 == null ? "" : (" AND " + join2))));
conn.setReadOnly(false); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
final Statement stmt = conn.createStatement(); conn.setReadOnly(false);
c = stmt.executeUpdate(sql); Blob blob = conn.createBlob();
stmt.close(); blob.setBytes(1, (byte[]) value);
final PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setBlob(1, blob);
c = stmt.executeUpdate(sql);
stmt.close();
} else {
String sql = "UPDATE " + info.getTable(node) + " a " + (join1 == null ? "" : (", " + join1))
+ " SET " + info.getSQLColumn("a", column) + " = " + info.formatToString(value)
+ ((where == null || where.length() == 0) ? (join2 == null ? "" : (" WHERE " + join2))
: (" WHERE " + where + (join2 == null ? "" : (" AND " + join2))));
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<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
@@ -876,6 +917,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
final List<Attribute<T, Serializable>> attrs = new ArrayList<>(); final List<Attribute<T, Serializable>> attrs = new ArrayList<>();
final List<ColumnValue> cols = new ArrayList<>(); final List<ColumnValue> cols = new ArrayList<>();
final boolean virtual = info.isVirtualEntity(); final boolean virtual = info.isVirtualEntity();
List<byte[]> blobs = null;
for (ColumnValue col : values) { for (ColumnValue col : values) {
Attribute<T, Serializable> attr = info.getUpdateAttribute(col.getColumn()); Attribute<T, Serializable> attr = info.getUpdateAttribute(col.getColumn());
if (attr == null) continue; if (attr == null) continue;
@@ -884,7 +926,14 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
if (!virtual) { if (!virtual) {
if (setsql.length() > 0) setsql.append(", "); if (setsql.length() > 0) setsql.append(", ");
String c = info.getSQLColumn(null, col.getColumn()); String c = info.getSQLColumn(null, col.getColumn());
setsql.append(c).append(" = ").append(info.formatSQLValue(c, col)); setsql.append(c).append(" = ");
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; int c = -1;
@@ -892,9 +941,21 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
String sql = "UPDATE " + info.getTable(id) + " SET " + setsql + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); String sql = "UPDATE " + info.getTable(id) + " SET " + setsql + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id);
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + ": " + sql); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + ": " + sql);
conn.setReadOnly(false); conn.setReadOnly(false);
final Statement stmt = conn.createStatement(); if (blobs != null) {
c = stmt.executeUpdate(sql); final PreparedStatement stmt = conn.prepareStatement(sql);
stmt.close(); int idx = 0;
for (byte[] bs : blobs) {
Blob blob = conn.createBlob();
blob.setBytes(1, bs);
stmt.setBlob(++idx, blob);
}
c = stmt.executeUpdate();
stmt.close();
} else {
final Statement stmt = conn.createStatement();
c = stmt.executeUpdate(sql);
stmt.close();
}
} }
//--------------------------------------------------- //---------------------------------------------------
final EntityCache<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
@@ -963,6 +1024,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
final List<Attribute<T, Serializable>> attrs = new ArrayList<>(); final List<Attribute<T, Serializable>> attrs = new ArrayList<>();
final List<ColumnValue> cols = new ArrayList<>(); final List<ColumnValue> cols = new ArrayList<>();
final boolean virtual = info.isVirtualEntity(); final boolean virtual = info.isVirtualEntity();
List<byte[]> blobs = null;
for (ColumnValue col : values) { for (ColumnValue col : values) {
Attribute<T, Serializable> attr = info.getUpdateAttribute(col.getColumn()); Attribute<T, Serializable> attr = info.getUpdateAttribute(col.getColumn());
if (attr == null) continue; if (attr == null) continue;
@@ -971,7 +1033,13 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
if (!virtual) { if (!virtual) {
if (setsql.length() > 0) setsql.append(", "); if (setsql.length() > 0) setsql.append(", ");
String c = info.getSQLColumn("a", col.getColumn()); 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; int c = -1;
@@ -993,9 +1061,21 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
sql += info.createSQLOrderby(flipper) + ((flipper == null || flipper.getLimit() < 1) ? "" : (" LIMIT " + flipper.getLimit())); sql += info.createSQLOrderby(flipper) + ((flipper == null || flipper.getLimit() < 1) ? "" : (" LIMIT " + flipper.getLimit()));
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
conn.setReadOnly(false); conn.setReadOnly(false);
final Statement stmt = conn.createStatement(); if (blobs != null) {
c = stmt.executeUpdate(sql); final PreparedStatement stmt = conn.prepareStatement(sql);
stmt.close(); int idx = 0;
for (byte[] bs : blobs) {
Blob blob = conn.createBlob();
blob.setBytes(1, bs);
stmt.setBlob(++idx, blob);
}
c = stmt.executeUpdate();
stmt.close();
} else {
final Statement stmt = conn.createStatement();
c = stmt.executeUpdate(sql);
stmt.close();
}
} }
//--------------------------------------------------- //---------------------------------------------------
final EntityCache<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
@@ -1013,44 +1093,48 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
return updateColumn(bean, columns); return updateColumn(bean, columns);
} }
/**
* 更新对象指定的一些字段, 必须是Entity对象
*
* @param <T> Entity类的泛型
* @param bean Entity对象
* @param columns 需要更新的字段
*
* @return 更新的数据条数
*/
@Override @Override
public <T> int updateColumn(final T bean, final String... columns) { public <T> int updateColumn(final T bean, final String... columns) {
return updateColumn(bean, SelectColumn.createIncludes(columns));
}
@Override
public <T> int updateColumn(final T bean, final SelectColumn selects) {
final EntityInfo<T> info = loadEntityInfo((Class<T>) bean.getClass()); final EntityInfo<T> info = loadEntityInfo((Class<T>) bean.getClass());
if (info.isVirtualEntity()) { if (info.isVirtualEntity()) {
return updateColumns(null, info, bean, columns); return updateColumns(null, info, bean, selects);
} }
Connection conn = createWriteSQLConnection(); Connection conn = createWriteSQLConnection();
try { try {
return updateColumns(conn, info, bean, columns); return updateColumns(conn, info, bean, selects);
} finally { } finally {
closeSQLConnection(conn); closeSQLConnection(conn);
} }
} }
private <T> int updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final String... columns) { private <T> int updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final SelectColumn selects) {
if (bean == null || columns.length < 1) return -1; if (bean == null || selects == null) return -1;
try { try {
final Class<T> clazz = (Class<T>) bean.getClass(); final Class<T> clazz = (Class<T>) bean.getClass();
StringBuilder setsql = new StringBuilder(); StringBuilder setsql = new StringBuilder();
final Serializable id = info.getPrimary().get(bean); final Serializable id = info.getPrimary().get(bean);
final List<Attribute<T, Serializable>> attrs = new ArrayList<>(); final List<Attribute<T, Serializable>> attrs = new ArrayList<>();
List<byte[]> blobs = null;
final boolean virtual = info.isVirtualEntity(); final boolean virtual = info.isVirtualEntity();
for (String col : columns) { for (Attribute<T, Serializable> attr : info.updateAttributes) {
Attribute<T, Serializable> attr = info.getUpdateAttribute(col); if (!selects.test(attr.field())) continue;
if (attr == null) continue;
attrs.add(attr); attrs.add(attr);
if (!virtual) { if (!virtual) {
if (setsql.length() > 0) setsql.append(", "); if (setsql.length() > 0) setsql.append(", ");
setsql.append(info.getSQLColumn(null, col)).append(" = ").append(info.formatToString(attr.get(bean))); setsql.append(info.getSQLColumn(null, 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; int c = -1;
@@ -1058,9 +1142,21 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
String sql = "UPDATE " + info.getTable(id) + " SET " + setsql + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id); String sql = "UPDATE " + info.getTable(id) + " SET " + setsql + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id);
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(bean.getClass().getSimpleName() + ": " + sql); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(bean.getClass().getSimpleName() + ": " + sql);
conn.setReadOnly(false); conn.setReadOnly(false);
final Statement stmt = conn.createStatement(); if (blobs != null) {
c = stmt.executeUpdate(sql); final PreparedStatement stmt = conn.prepareStatement(sql);
stmt.close(); int idx = 0;
for (byte[] bs : blobs) {
Blob blob = conn.createBlob();
blob.setBytes(1, bs);
stmt.setBlob(++idx, blob);
}
c = stmt.executeUpdate();
stmt.close();
} else {
final Statement stmt = conn.createStatement();
c = stmt.executeUpdate(sql);
stmt.close();
}
} }
//--------------------------------------------------- //---------------------------------------------------
final EntityCache<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
@@ -1078,45 +1174,48 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
return updateColumn(bean, node, columns); return updateColumn(bean, node, columns);
} }
/**
* 更新对象指定的一些字段, 必须是Entity对象
*
* @param <T> Entity类的泛型
* @param bean Entity对象
* @param node 过滤node 不能为null
* @param columns 需要更新的字段
*
* @return 更新的数据条数
*/
@Override @Override
public <T> int updateColumn(final T bean, final FilterNode node, final String... columns) { public <T> int updateColumn(final T bean, final FilterNode node, final String... columns) {
return updateColumn(bean, node, SelectColumn.createIncludes(columns));
}
@Override
public <T> int updateColumn(final T bean, final FilterNode node, final SelectColumn selects) {
final EntityInfo<T> info = loadEntityInfo((Class<T>) bean.getClass()); final EntityInfo<T> info = loadEntityInfo((Class<T>) bean.getClass());
if (info.isVirtualEntity()) { if (info.isVirtualEntity()) {
return updateColumns(null, info, bean, node, columns); return updateColumns(null, info, bean, node, selects);
} }
Connection conn = createWriteSQLConnection(); Connection conn = createWriteSQLConnection();
try { try {
return updateColumns(conn, info, bean, node, columns); return updateColumns(conn, info, bean, node, selects);
} finally { } finally {
closeSQLConnection(conn); closeSQLConnection(conn);
} }
} }
private <T> int updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final FilterNode node, final String... columns) { private <T> int updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final FilterNode node, final SelectColumn selects) {
if (bean == null || node == null || columns.length < 1) return -1; if (bean == null || node == null || selects == null) return -1;
try { try {
final Class<T> clazz = (Class<T>) bean.getClass(); final Class<T> clazz = (Class<T>) bean.getClass();
StringBuilder setsql = new StringBuilder(); StringBuilder setsql = new StringBuilder();
final Serializable id = info.getPrimary().get(bean); final Serializable id = info.getPrimary().get(bean);
final List<Attribute<T, Serializable>> attrs = new ArrayList<>(); final List<Attribute<T, Serializable>> attrs = new ArrayList<>();
List<byte[]> blobs = null;
final boolean virtual = info.isVirtualEntity(); final boolean virtual = info.isVirtualEntity();
for (String col : columns) { for (Attribute<T, Serializable> attr : info.updateAttributes) {
Attribute<T, Serializable> attr = info.getUpdateAttribute(col); if (!selects.test(attr.field())) continue;
if (attr == null) continue;
attrs.add(attr); attrs.add(attr);
if (!virtual) { if (!virtual) {
if (setsql.length() > 0) setsql.append(", "); 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; int c = -1;
@@ -1136,9 +1235,21 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
: (" WHERE " + where + (join2 == null ? "" : (" AND " + join2)))); : (" WHERE " + where + (join2 == null ? "" : (" AND " + join2))));
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
conn.setReadOnly(false); conn.setReadOnly(false);
final Statement stmt = conn.createStatement(); if (blobs != null) {
c = stmt.executeUpdate(sql); final PreparedStatement stmt = conn.prepareStatement(sql);
stmt.close(); int idx = 0;
for (byte[] bs : blobs) {
Blob blob = conn.createBlob();
blob.setBytes(1, bs);
stmt.setBlob(++idx, blob);
}
c = stmt.executeUpdate();
stmt.close();
} else {
final Statement stmt = conn.createStatement();
c = stmt.executeUpdate(sql);
stmt.close();
}
} }
//--------------------------------------------------- //---------------------------------------------------
final EntityCache<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
@@ -1487,6 +1598,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
final Connection conn = createReadSQLConnection(); final Connection conn = createReadSQLConnection();
try { try {
final Attribute<T, Serializable> attr = info.getAttribute(column);
final String sql = "SELECT " + info.getSQLColumn(null, column) + " FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk); final String sql = "SELECT " + info.getSQLColumn(null, column) + " FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk);
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql);
conn.setReadOnly(true); conn.setReadOnly(true);
@@ -1494,7 +1606,14 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
ps.setFetchSize(1); ps.setFetchSize(1);
final ResultSet set = ps.executeQuery(); final ResultSet set = ps.executeQuery();
Serializable val = defValue; Serializable val = defValue;
if (set.next()) val = (Serializable) set.getObject(1); if (set.next()) {
if (attr.type() == byte[].class) {
Blob blob = set.getBlob(1);
if (blob != null) val = blob.getBytes(1, (int) blob.length());
} else {
val = (Serializable) set.getObject(1);
}
}
set.close(); set.close();
ps.close(); ps.close();
return val == null ? defValue : val; return val == null ? defValue : val;
@@ -1521,6 +1640,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
final Connection conn = createReadSQLConnection(); final Connection conn = createReadSQLConnection();
try { try {
final Attribute<T, Serializable> attr = info.getAttribute(column);
final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis(); final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis();
final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info); final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis);
@@ -1531,7 +1651,14 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
ps.setFetchSize(1); ps.setFetchSize(1);
final ResultSet set = ps.executeQuery(); final ResultSet set = ps.executeQuery();
Serializable val = defValue; Serializable val = defValue;
if (set.next()) val = (Serializable) set.getObject(1); if (set.next()) {
if (attr.type() == byte[].class) {
Blob blob = set.getBlob(1);
if (blob != null) val = blob.getBytes(1, (int) blob.length());
} else {
val = (Serializable) set.getObject(1);
}
}
set.close(); set.close();
ps.close(); ps.close();
return val == null ? defValue : val; return val == null ? defValue : val;

View File

@@ -99,6 +99,7 @@ public interface DataSource {
/** /**
* 更新单个记录的单个字段 <br> * 更新单个记录的单个字段 <br>
* <b>注意</b>:即使字段标记为&#064;Column(updatable=false)也会被更新 <br>
* 等价SQL: UPDATE {table} SET {column} = {value} WHERE {primary} = {id} <br> * 等价SQL: UPDATE {table} SET {column} = {value} WHERE {primary} = {id} <br>
* *
* @param <T> Entity泛型 * @param <T> Entity泛型
@@ -113,6 +114,7 @@ public interface DataSource {
/** /**
* 更新符合过滤条件记录的单个字段 <br> * 更新符合过滤条件记录的单个字段 <br>
* <b>注意</b>:即使字段标记为&#064;Column(updatable=false)也会被更新 <br>
* 等价SQL: UPDATE {table} SET {column} = {value} WHERE {filter node} <br> * 等价SQL: UPDATE {table} SET {column} = {value} WHERE {filter node} <br>
* *
* @param <T> Entity泛型 * @param <T> Entity泛型
@@ -173,7 +175,7 @@ public interface DataSource {
/** /**
* 更新单个记录的指定字段 <br> * 更新单个记录的指定字段 <br>
* <b>注意</b>Entity类中标记为&#064;Column(updatable=false)不会被更新 <br> * <b>注意</b>Entity类中标记为&#064;Column(updatable=false)不会被更新 <br>
* 等价SQL: UPDATE {table} SET {column1} = {value1}, {column2} += {value2}, {column3} *= {value3}, &#183;&#183;&#183; WHERE {primary} = {bean.id} <br> * 等价SQL: UPDATE {table} SET {column1} = {value1}, {column2} = {value2}, {column3} = {value3}, &#183;&#183;&#183; WHERE {primary} = {bean.id} <br>
* *
* @param <T> Entity泛型 * @param <T> Entity泛型
* @param bean 待更新的Entity对象 * @param bean 待更新的Entity对象
@@ -186,7 +188,7 @@ public interface DataSource {
/** /**
* 更新符合过滤条件记录的指定字段 <br> * 更新符合过滤条件记录的指定字段 <br>
* <b>注意</b>Entity类中标记为&#064;Column(updatable=false)不会被更新 <br> * <b>注意</b>Entity类中标记为&#064;Column(updatable=false)不会被更新 <br>
* 等价SQL: UPDATE {table} SET {column1} = {value1}, {column2} += {value2}, {column3} *= {value3}, &#183;&#183;&#183; WHERE {filter node} <br> * 等价SQL: UPDATE {table} SET {column1} = {value1}, {column2} = {value2}, {column3} = {value3}, &#183;&#183;&#183; WHERE {filter node} <br>
* *
* @param <T> Entity泛型 * @param <T> Entity泛型
* @param bean 待更新的Entity对象 * @param bean 待更新的Entity对象
@@ -197,6 +199,33 @@ public interface DataSource {
*/ */
public <T> int updateColumn(final T bean, final FilterNode node, final String... columns); public <T> int updateColumn(final T bean, final FilterNode node, final String... columns);
/**
* 更新单个记录的指定字段 <br>
* <b>注意</b>Entity类中标记为&#064;Column(updatable=false)不会被更新 <br>
* 等价SQL: UPDATE {table} SET {column1} = {value1}, {column2} = {value2}, {column3} = {value3}, &#183;&#183;&#183; WHERE {primary} = {bean.id} <br>
*
* @param <T> Entity泛型
* @param bean 待更新的Entity对象
* @param selects 指定字段
*
* @return 影响的记录条数
*/
public <T> int updateColumn(final T bean, final SelectColumn selects);
/**
* 更新符合过滤条件记录的指定字段 <br>
* <b>注意</b>Entity类中标记为&#064;Column(updatable=false)不会被更新 <br>
* 等价SQL: UPDATE {table} SET {column1} = {value1}, {column2} = {value2}, {column3} = {value3}, &#183;&#183;&#183; WHERE {filter node} <br>
*
* @param <T> Entity泛型
* @param bean 待更新的Entity对象
* @param node 过滤条件
* @param selects 指定字段
*
* @return 影响的记录条数
*/
public <T> int updateColumn(final T bean, final FilterNode node, final SelectColumn selects);
/** /**
* 由 public int updateColumn(final T bean, final String... columns); 代替 * 由 public int updateColumn(final T bean, final String... columns); 代替
* *

View File

@@ -425,41 +425,51 @@ public final class EntityInfo<T> {
T obj = creator.create(); T obj = creator.create();
for (Attribute<T, Serializable> attr : queryAttributes) { for (Attribute<T, Serializable> attr : queryAttributes) {
if (sels == null || sels.test(attr.field())) { if (sels == null || sels.test(attr.field())) {
Serializable o = (Serializable) set.getObject(this.getSQLColumn(null, attr.field()));
final Class t = attr.type(); final Class t = attr.type();
if (t.isPrimitive()) { Serializable o;
if (o != null) { if (t == byte[].class) {
if (t == int.class) { Blob blob = set.getBlob(this.getSQLColumn(null, attr.field()));
o = ((Number) o).intValue(); if (blob == null) {
o = null;
} else { //不支持超过2G的数据
o = blob.getBytes(1, (int) blob.length());
}
} else {
o = (Serializable) set.getObject(this.getSQLColumn(null, attr.field()));
if (t.isPrimitive()) {
if (o != null) {
if (t == int.class) {
o = ((Number) o).intValue();
} else if (t == long.class) {
o = ((Number) o).longValue();
} else if (t == short.class) {
o = ((Number) o).shortValue();
} else if (t == float.class) {
o = ((Number) o).floatValue();
} else if (t == double.class) {
o = ((Number) o).doubleValue();
} else if (t == byte.class) {
o = ((Number) o).byteValue();
} else if (t == char.class) {
o = (char) ((Number) o).intValue();
}
} else if (t == int.class) {
o = 0;
} else if (t == long.class) { } else if (t == long.class) {
o = ((Number) o).longValue(); o = 0L;
} else if (t == short.class) { } else if (t == short.class) {
o = ((Number) o).shortValue(); o = (short) 0;
} else if (t == float.class) { } else if (t == float.class) {
o = ((Number) o).floatValue(); o = 0.0f;
} else if (t == double.class) { } else if (t == double.class) {
o = ((Number) o).doubleValue(); o = 0.0d;
} else if (t == byte.class) { } else if (t == byte.class) {
o = ((Number) o).byteValue(); o = (byte) 0;
} else if (t == boolean.class) {
o = false;
} else if (t == char.class) { } else if (t == char.class) {
o = (char) ((Number) o).intValue(); o = (char) 0;
} }
} else if (t == int.class) {
o = 0;
} else if (t == long.class) {
o = 0L;
} else if (t == short.class) {
o = (short) 0;
} else if (t == float.class) {
o = 0.0f;
} else if (t == double.class) {
o = 0.0d;
} else if (t == byte.class) {
o = (byte) 0;
} else if (t == boolean.class) {
o = false;
} else if (t == char.class) {
o = (char) 0;
} }
} }
attr.set(obj, o); attr.set(obj, o);