This commit is contained in:
Redkale
2016-11-07 12:28:26 +08:00
parent 83f460660b
commit 0d8f7a4fa2
3 changed files with 106 additions and 69 deletions

View File

@@ -54,33 +54,33 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
}
@Override
public <T> void updateColumn(final Class<T> clazz, final Serializable id, final String column, final Serializable value) {
source.updateColumn(clazz, id, column, value);
public <T> int updateColumn(final Class<T> clazz, final Serializable id, final String column, final Serializable value) {
return source.updateColumn(clazz, id, column, value);
}
@Override
public <T> void updateColumn(final Class<T> clazz, final String column, final Serializable value, final FilterNode node) {
source.updateColumn(clazz, column, value, node);
public <T> int updateColumn(final Class<T> clazz, final String column, final Serializable value, final FilterNode node) {
return source.updateColumn(clazz, column, value, node);
}
@Override
public <T> void updateColumn(final Class<T> clazz, final Serializable id, final ColumnValue... values) {
source.updateColumn(clazz, id, values);
public <T> int updateColumn(final Class<T> clazz, final Serializable id, final ColumnValue... values) {
return source.updateColumn(clazz, id, values);
}
@Override
public <T> void updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values) {
source.updateColumn(clazz, node, values);
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values) {
return source.updateColumn(clazz, node, values);
}
@Override
public <T> void updateColumns(T bean, final String... columns) {
source.updateColumns(bean, columns);
public <T> int updateColumns(T bean, final String... columns) {
return source.updateColumns(bean, columns);
}
@Override
public <T> void updateColumns(T bean, final FilterNode node, final String... columns) {
source.updateColumns(bean, node, columns);
public <T> int updateColumns(T bean, final FilterNode node, final String... columns) {
return source.updateColumns(bean, node, columns);
}
@Override

View File

@@ -608,17 +608,36 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
Class clazz = info.getType();
if (!info.isVirtualEntity()) {
final String updateSQL = info.getUpdateSQL(values[0]);
if (debug.get()) logger.finest(clazz.getSimpleName() + " update sql=" + updateSQL);
final Attribute<T, Serializable> primary = info.getPrimary();
final PreparedStatement prestmt = conn.prepareStatement(updateSQL);
Attribute<T, Serializable>[] attrs = info.updateAttributes;
final boolean debugfinest = debug.get();
char[] sqlchars = debugfinest ? updateSQL.toCharArray() : null;
for (final T value : values) {
int i = 0;
int k = 0;
for (Attribute<T, Serializable> attr : attrs) {
prestmt.setObject(++i, attr.get(value));
prestmt.setObject(++k, attr.get(value));
}
prestmt.setObject(++i, primary.get(value));
prestmt.addBatch();
prestmt.setObject(++k, primary.get(value));
prestmt.addBatch();//------------------------------------------------------------
if (debugfinest) { //打印调试信息
//-----------------------------
int i = 0;
StringBuilder sb = new StringBuilder(128);
for (char ch : sqlchars) {
if (ch == '?') {
Object obj = attrs[i++].get(value);
if (obj != null && obj.getClass().isArray()) {
sb.append("'[length=").append(java.lang.reflect.Array.getLength(obj)).append("]'");
} else {
sb.append(FilterNode.formatToString(obj));
}
} else {
sb.append(ch);
}
}
logger.finest(info.getType().getSimpleName() + " update sql=" + sb.toString().replaceAll("(\r|\n)", "\\n"));
} //打印结束
}
prestmt.executeBatch();
prestmt.close();
@@ -643,37 +662,40 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* @param id 主键值
* @param column 过滤字段名
* @param value 过滤字段值
*
* @return 更新的数据条数
*/
@Override
public <T> void updateColumn(Class<T> clazz, Serializable id, String column, Serializable value) {
public <T> int updateColumn(Class<T> clazz, Serializable id, String column, Serializable value) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
updateColumn(null, info, id, column, value);
return;
return updateColumn(null, info, id, column, value);
}
Connection conn = createWriteSQLConnection();
try {
updateColumn(conn, info, id, column, value);
return updateColumn(conn, info, id, column, value);
} finally {
closeSQLConnection(conn);
}
}
private <T> void 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, 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()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
final Statement stmt = conn.createStatement();
stmt.execute(sql);
c = stmt.executeUpdate(sql);
stmt.close();
}
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
T rs = cache.update(id, info.getAttribute(column), value);
if (cacheListener != null) cacheListener.updateCache(info.getType(), rs);
return c >= 0 ? c : (rs == null ? 0 : 1);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
@@ -689,24 +711,26 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* @param column 过滤字段名
* @param value 过滤字段值
* @param node 过滤node 不能为null
*
* @return 更新的数据条数
*/
@Override
public <T> void updateColumn(Class<T> clazz, String column, Serializable value, FilterNode node) {
public <T> int updateColumn(Class<T> clazz, String column, Serializable value, FilterNode node) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
updateColumn(null, info, column, value, node);
return;
return updateColumn(null, info, column, value, node);
}
Connection conn = createWriteSQLConnection();
try {
updateColumn(conn, info, column, value, node);
return updateColumn(conn, info, column, value, node);
} finally {
closeSQLConnection(conn);
}
}
private <T> void 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, Serializable value, FilterNode node) {
try {
int c = -1;
if (!info.isVirtualEntity()) {
Map<Class, String> joinTabalis = node.getJoinTabalis();
CharSequence join = node.createSQLJoin(this, joinTabalis, info);
@@ -716,14 +740,15 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
+ info.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);
c = stmt.executeUpdate(sql);
stmt.close();
}
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
T[] rs = cache.update(info.getAttribute(column), value, node);
if (cacheListener != null) cacheListener.updateCache(info.getType(), rs);
return c >= 0 ? c : (rs == null ? 0 : rs.length);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
@@ -738,24 +763,25 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* @param clazz Entity类
* @param id 主键值
* @param values 字段值
*
* @return 更新的数据条数
*/
@Override
public <T> void updateColumn(final Class<T> clazz, final Serializable id, final ColumnValue... values) {
public <T> int updateColumn(final Class<T> clazz, final Serializable id, final ColumnValue... values) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
updateColumn(null, info, id, values);
return;
return updateColumn(null, info, id, values);
}
Connection conn = createWriteSQLConnection();
try {
updateColumn(conn, info, id, values);
return updateColumn(conn, info, id, values);
} finally {
closeSQLConnection(conn);
}
}
private <T> void updateColumn(final Connection conn, final EntityInfo<T> info, final Serializable id, final ColumnValue... values) {
if (values == null || values.length < 1) return;
private <T> int updateColumn(final Connection conn, final EntityInfo<T> info, final Serializable id, final ColumnValue... values) {
if (values == null || values.length < 1) return -1;
try {
StringBuilder setsql = new StringBuilder();
final List<Attribute<T, Serializable>> attrs = new ArrayList<>();
@@ -772,18 +798,20 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
setsql.append(c).append(" = ").append(info.formatSQLValue(c, col));
}
}
int c = -1;
if (!virtual) {
String sql = "UPDATE " + info.getTable(id) + " SET " + setsql + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id);
if (debug.get()) logger.finest(info.getType().getSimpleName() + ": " + sql);
final Statement stmt = conn.createStatement();
stmt.execute(sql);
c = stmt.executeUpdate(sql);
stmt.close();
}
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
T rs = cache.updateColumn(id, attrs, cols);
if (cacheListener != null) cacheListener.updateCache(info.getType(), rs);
return c >= 0 ? c : (rs == null ? 0 : 1);
} catch (SQLException e) {
throw new RuntimeException(e);
}
@@ -796,24 +824,25 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* @param clazz Entity类
* @param node 过滤条件
* @param values 字段值
*
* @return 更新的数据条数
*/
@Override
public <T> void updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values) {
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
updateColumn(null, info, node, values);
return;
return updateColumn(null, info, node, values);
}
Connection conn = createWriteSQLConnection();
try {
updateColumn(conn, info, node, values);
return updateColumn(conn, info, node, values);
} finally {
closeSQLConnection(conn);
}
}
private <T> void updateColumn(final Connection conn, final EntityInfo<T> info, final FilterNode node, final ColumnValue... values) {
if (values == null || values.length < 1) return;
private <T> int updateColumn(final Connection conn, final EntityInfo<T> info, final FilterNode node, final ColumnValue... values) {
if (values == null || values.length < 1) return -1;
try {
StringBuilder setsql = new StringBuilder();
final List<Attribute<T, Serializable>> attrs = new ArrayList<>();
@@ -830,6 +859,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
setsql.append(c).append(" = ").append(info.formatSQLValue(c, col));
}
}
int c = -1;
if (!virtual) {
Map<Class, String> joinTabalis = node.getJoinTabalis();
CharSequence join = node.createSQLJoin(this, joinTabalis, info);
@@ -838,14 +868,15 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
String sql = "UPDATE " + info.getTable(node) + " 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);
c = stmt.executeUpdate(sql);
stmt.close();
}
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
T[] rs = cache.updateColumn(node, attrs, cols);
if (cacheListener != null) cacheListener.updateCache(info.getType(), rs);
return c >= 0 ? c : (rs == null ? 0 : rs.length);
} catch (SQLException e) {
throw new RuntimeException(e);
}
@@ -857,24 +888,25 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* @param <T> Entity类的泛型
* @param bean Entity对象
* @param columns 需要更新的字段
*
* @return 更新的数据条数
*/
@Override
public <T> void updateColumns(final T bean, final String... columns) {
public <T> int updateColumns(final T bean, final String... columns) {
final EntityInfo<T> info = loadEntityInfo((Class<T>) bean.getClass());
if (info.isVirtualEntity()) {
updateColumns(null, info, bean, columns);
return;
return updateColumns(null, info, bean, columns);
}
Connection conn = createWriteSQLConnection();
try {
updateColumns(conn, info, bean, columns);
return updateColumns(conn, info, bean, columns);
} finally {
closeSQLConnection(conn);
}
}
private <T> void updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final String... columns) {
if (bean == null || columns.length < 1) return;
private <T> int updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final String... columns) {
if (bean == null || columns.length < 1) return -1;
try {
final Class<T> clazz = (Class<T>) bean.getClass();
StringBuilder setsql = new StringBuilder();
@@ -890,18 +922,20 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
setsql.append(info.getSQLColumn(null, col)).append(" = ").append(info.formatToString(attr.get(bean)));
}
}
int c = -1;
if (!virtual) {
String sql = "UPDATE " + info.getTable(id) + " SET " + setsql + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(id);
if (debug.get()) logger.finest(bean.getClass().getSimpleName() + ": " + sql);
final Statement stmt = conn.createStatement();
stmt.execute(sql);
c = stmt.executeUpdate(sql);
stmt.close();
}
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
T rs = cache.update(bean, attrs);
if (cacheListener != null) cacheListener.updateCache(clazz, rs);
return c >= 0 ? c : (rs == null ? 0 : 1);
} catch (SQLException e) {
throw new RuntimeException(e);
}
@@ -914,24 +948,25 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* @param bean Entity对象
* @param node 过滤node 不能为null
* @param columns 需要更新的字段
*
* @return 更新的数据条数
*/
@Override
public <T> void updateColumns(final T bean, final FilterNode node, final String... columns) {
public <T> int updateColumns(final T bean, final FilterNode node, final String... columns) {
final EntityInfo<T> info = loadEntityInfo((Class<T>) bean.getClass());
if (info.isVirtualEntity()) {
updateColumns(null, info, bean, node, columns);
return;
return updateColumns(null, info, bean, node, columns);
}
Connection conn = createWriteSQLConnection();
try {
updateColumns(conn, info, bean, node, columns);
return updateColumns(conn, info, bean, node, columns);
} finally {
closeSQLConnection(conn);
}
}
private <T> void updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final FilterNode node, final String... columns) {
if (bean == null || node == null || columns.length < 1) return;
private <T> int updateColumns(final Connection conn, final EntityInfo<T> info, final T bean, final FilterNode node, final String... columns) {
if (bean == null || node == null || columns.length < 1) return -1;
try {
final Class<T> clazz = (Class<T>) bean.getClass();
StringBuilder setsql = new StringBuilder();
@@ -947,6 +982,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
setsql.append(info.getSQLColumn("a", col)).append(" = ").append(info.formatToString(attr.get(bean)));
}
}
int c = -1;
if (!virtual) {
Map<Class, String> joinTabalis = node.getJoinTabalis();
CharSequence join = node.createSQLJoin(this, joinTabalis, info);
@@ -956,14 +992,15 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
+ (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);
c = stmt.executeUpdate(sql);
stmt.close();
}
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
T[] rs = cache.update(bean, attrs, node);
if (cacheListener != null) cacheListener.updateCache(clazz, rs);
return c >= 0 ? c : (rs == null ? 0 : rs.length);
} catch (SQLException e) {
throw new RuntimeException(e);
}

View File

@@ -62,17 +62,17 @@ public interface DataSource {
*/
public <T> void update(final T... values);
public <T> void updateColumn(final Class<T> clazz, final Serializable id, final String column, final Serializable value);
public <T> int updateColumn(final Class<T> clazz, final Serializable id, final String column, final Serializable value);
public <T> void updateColumn(final Class<T> clazz, final String column, final Serializable value, final FilterNode node);
public <T> int updateColumn(final Class<T> clazz, final String column, final Serializable value, final FilterNode node);
public <T> void updateColumn(final Class<T> clazz, final Serializable id, final ColumnValue... values);
public <T> int updateColumn(final Class<T> clazz, final Serializable id, final ColumnValue... values);
public <T> void updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values);
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values);
public <T> void updateColumns(final T bean, final String... columns);
public <T> int updateColumns(final T bean, final String... columns);
public <T> void updateColumns(final T bean, final FilterNode node, final String... columns);
public <T> int updateColumns(final T bean, final FilterNode node, final String... columns);
//############################################# 查询接口 #############################################
//-----------------------getXXXXResult-----------------------------