This commit is contained in:
地平线
2015-08-20 11:06:36 +08:00
parent 9ebe11af8b
commit 38025243c0
3 changed files with 136 additions and 5 deletions

View File

@@ -844,6 +844,114 @@ public final class DataDefaultSource implements DataSource, Nameable {
}
}
/**
* 根据主键值给对象的column对应的值 & andvalue 必须是Entity Class
*
* @param <T>
* @param clazz
* @param id
* @param column
* @param andvalue
*/
@Override
public <T> void updateColumnAnd(Class<T> clazz, Serializable id, String column, long andvalue) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
updateColumnAnd(null, info, id, column, andvalue);
return;
}
Connection conn = createWriteSQLConnection();
try {
updateColumnAnd(conn, info, id, column, andvalue);
} finally {
closeSQLConnection(conn);
}
}
@Override
public <T> void updateColumnAnd(DataConnection conn, Class<T> clazz, Serializable id, String column, long andvalue) {
updateColumnAnd((Connection) conn.getConnection(), loadEntityInfo(clazz), id, column, andvalue);
}
private <T> void updateColumnAnd(Connection conn, final EntityInfo<T> info, Serializable id, String column, long andvalue) {
try {
if (!info.isVirtualEntity()) {
String col = info.getSQLColumn(column);
String sql = "UPDATE " + info.getTable() + " SET " + col + " = " + col + " & (" + andvalue
+ ") WHERE " + info.getPrimarySQLColumn() + " = " + formatToString(id);
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<T> cache = info.getCache();
if (cache == null) return;
Attribute<T, Serializable> attr = info.getAttribute(column);
T value = cache.updateColumnAnd(id, attr, andvalue);
if (value != null && cacheListener != null) cacheListener.updateCache(info.getType(), value);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
if (conn != null) closeSQLConnection(conn);
}
}
/**
* 根据主键值给对象的column对应的值 | andvalue 必须是Entity Class
*
* @param <T>
* @param clazz
* @param id
* @param column
* @param orvalue
*/
@Override
public <T> void updateColumnOr(Class<T> clazz, Serializable id, String column, long orvalue) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
updateColumnOr(null, info, id, column, orvalue);
return;
}
Connection conn = createWriteSQLConnection();
try {
updateColumnOr(conn, info, id, column, orvalue);
} finally {
closeSQLConnection(conn);
}
}
@Override
public <T> void updateColumnOr(DataConnection conn, Class<T> clazz, Serializable id, String column, long orvalue) {
updateColumnOr((Connection) conn.getConnection(), loadEntityInfo(clazz), id, column, orvalue);
}
private <T> void updateColumnOr(Connection conn, final EntityInfo<T> info, Serializable id, String column, long orvalue) {
try {
if (!info.isVirtualEntity()) {
String col = info.getSQLColumn(column);
String sql = "UPDATE " + info.getTable() + " SET " + col + " = " + col + " | (" + orvalue
+ ") WHERE " + info.getPrimarySQLColumn() + " = " + formatToString(id);
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<T> cache = info.getCache();
if (cache == null) return;
Attribute<T, Serializable> attr = info.getAttribute(column);
T value = cache.updateColumnOr(id, attr, orvalue);
if (value != null && cacheListener != null) cacheListener.updateCache(info.getType(), value);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
if (conn != null) closeSQLConnection(conn);
}
}
/**
* 更新对象指定的一些字段, 必须是Entity对象
*

View File

@@ -100,6 +100,14 @@ public interface DataSource {
public <T> void updateColumnIncrement(final Class<T> clazz, Serializable id, String column, long incvalue);
public <T> void updateColumnIncrement(final DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue);
public <T> void updateColumnAnd(final Class<T> clazz, Serializable id, String column, long incvalue);
public <T> void updateColumnAnd(final DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue);
public <T> void updateColumnOr(final Class<T> clazz, Serializable id, String column, long incvalue);
public <T> void updateColumnOr(final DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue);
//-----------------------getXXXXResult-----------------------------
public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column);

View File

@@ -327,16 +327,31 @@ public final class EntityCache<T> {
return rs;
}
public <V> T updateColumnOr(final Serializable id, Attribute<T, V> attr, final long orvalue) {
if (id == null) return null;
T rs = this.map.get(id);
if (rs == null) return rs;
Number numb = (Number) attr.get(rs);
return updateColumnIncrAndOr(id, attr, rs, (numb == null) ? orvalue : (numb.longValue() & orvalue));
}
public <V> T updateColumnAnd(final Serializable id, Attribute<T, V> attr, final long andvalue) {
if (id == null) return null;
T rs = this.map.get(id);
if (rs == null) return rs;
Number numb = (Number) attr.get(rs);
return updateColumnIncrAndOr(id, attr, rs, (numb == null) ? 0 : (numb.longValue() & andvalue));
}
public <V> T updateColumnIncrement(final Serializable id, Attribute<T, V> attr, final long incvalue) {
if (id == null) return null;
T rs = this.map.get(id);
if (rs == null) return rs;
Number numb = (Number) attr.get(rs);
if (numb == null) {
numb = incvalue;
} else {
numb = numb.longValue() + incvalue;
}
return updateColumnIncrAndOr(id, attr, rs, (numb == null) ? incvalue : (numb.longValue() + incvalue));
}
private <V> T updateColumnIncrAndOr(final Serializable id, Attribute<T, V> attr, final T rs, Number numb) {
final Class ft = attr.type();
if (ft == int.class || ft == Integer.class) {
numb = numb.intValue();