This commit is contained in:
Redkale
2016-11-07 12:42:02 +08:00
parent 0d8f7a4fa2
commit 63099b72be
4 changed files with 78 additions and 53 deletions

View File

@@ -34,23 +34,23 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
}
@Override
public <T> void delete(T... values) {
source.delete(values);
public <T> int delete(T... values) {
return source.delete(values);
}
@Override
public <T> void delete(final Class<T> clazz, final Serializable... ids) {
source.delete(clazz, ids);
public <T> int delete(final Class<T> clazz, final Serializable... ids) {
return source.delete(clazz, ids);
}
@Override
public <T> void delete(final Class<T> clazz, FilterNode node) {
source.delete(clazz, node);
public <T> int delete(final Class<T> clazz, FilterNode node) {
return source.delete(clazz, node);
}
@Override
public <T> void update(T... values) {
source.update(values);
public <T> int update(T... values) {
return source.update(values);
}
@Override

View File

@@ -463,51 +463,53 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
*
* @param <T> Entity类泛型
* @param values Entity对象
*
* @return 删除的数据条数
*/
@Override
public <T> void delete(T... values) {
if (values.length == 0) return;
public <T> int delete(T... values) {
if (values.length == 0) return 0;
final EntityInfo<T> info = loadEntityInfo((Class<T>) values[0].getClass());
if (info.isVirtualEntity()) { //虚拟表只更新缓存Cache
delete(null, info, values);
return;
return delete(null, info, values);
}
Connection conn = createWriteSQLConnection();
try {
delete(conn, info, values);
return delete(conn, info, values);
} finally {
closeSQLConnection(conn);
}
}
private <T> void delete(final Connection conn, final EntityInfo<T> info, T... values) {
if (values.length == 0) return;
private <T> int delete(final Connection conn, final EntityInfo<T> info, T... values) {
if (values.length == 0) return 0;
final Attribute primary = info.getPrimary();
Serializable[] ids = new Serializable[values.length];
int i = 0;
for (final T value : values) {
ids[i++] = (Serializable) primary.get(value);
}
delete(conn, info, ids);
return delete(conn, info, ids);
}
@Override
public <T> void delete(Class<T> clazz, Serializable... ids) {
public <T> int delete(Class<T> clazz, Serializable... ids) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) { //虚拟表只更新缓存Cache
delete(null, info, ids);
return;
return delete(null, info, ids);
}
Connection conn = createWriteSQLConnection();
try {
delete(conn, info, ids);
return delete(conn, info, ids);
} finally {
closeSQLConnection(conn);
}
}
private <T> void delete(final Connection conn, final EntityInfo<T> info, Serializable... keys) {
if (keys.length == 0) return;
private <T> int delete(final Connection conn, final EntityInfo<T> info, Serializable... keys) {
if (keys.length == 0) return -1;
int c = -1;
int c2 = 0;
try {
if (!info.isVirtualEntity()) {
final Statement stmt = conn.createStatement();
@@ -516,38 +518,43 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
if (debug.get()) logger.finest(info.getType().getSimpleName() + " delete sql=" + sql);
stmt.addBatch(sql);
}
stmt.executeBatch();
int[] pc = stmt.executeBatch();
c = 0;
for (int p : pc) {
c += p;
}
stmt.close();
}
//------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
for (Serializable key : keys) {
cache.delete(key);
c2 += cache.delete(key);
}
if (cacheListener != null) cacheListener.deleteCache(info.getType(), keys);
return c >= 0 ? c : c2;
} catch (SQLException e) {
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + e.getSQLState() + ';')) return;
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + e.getSQLState() + ';')) return c >= 0 ? c : c2;
throw new RuntimeException(e);
}
}
@Override
public <T> void delete(Class<T> clazz, FilterNode node) {
public <T> int delete(Class<T> clazz, FilterNode node) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
delete(null, info, node);
return;
return delete(null, info, node);
}
Connection conn = createWriteSQLConnection();
try {
delete(conn, info, node);
return delete(conn, info, node);
} finally {
closeSQLConnection(conn);
}
}
private <T> void delete(final Connection conn, final EntityInfo<T> info, final FilterNode node) {
private <T> int delete(final Connection conn, final EntityInfo<T> info, final FilterNode node) {
int c = -1;
try {
if (!info.isVirtualEntity()) {
Map<Class, String> joinTabalis = node.getJoinTabalis();
@@ -556,16 +563,17 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
String sql = "DELETE " + (this.readPool.isMysql() ? "a" : "") + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
if (debug.get()) logger.finest(info.getType().getSimpleName() + " delete 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;
Serializable[] ids = cache.delete(node);
if (cacheListener != null) cacheListener.deleteCache(info.getType(), ids);
return c >= 0 ? c : (ids == null ? 0 : ids.length);
} catch (SQLException e) {
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + e.getSQLState() + ';')) return;
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + e.getSQLState() + ';')) return c;
throw new RuntimeException(e);
}
}
@@ -586,26 +594,28 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
*
* @param <T> Entity类泛型
* @param values Entity对象
*
* @return 更新的数据条数
*/
@Override
public <T> void update(T... values) {
if (values.length == 0) return;
public <T> int update(T... values) {
if (values.length == 0) return 0;
final EntityInfo<T> info = loadEntityInfo((Class<T>) values[0].getClass());
if (info.isVirtualEntity()) {
update(null, info, values);
return;
return update(null, info, values);
}
Connection conn = createWriteSQLConnection();
try {
update(conn, info, values);
return update(conn, info, values);
} finally {
closeSQLConnection(conn);
}
}
private <T> void update(final Connection conn, final EntityInfo<T> info, T... values) {
private <T> int update(final Connection conn, final EntityInfo<T> info, T... values) {
try {
Class clazz = info.getType();
int c = -1;
if (!info.isVirtualEntity()) {
final String updateSQL = info.getUpdateSQL(values[0]);
final Attribute<T, Serializable> primary = info.getPrimary();
@@ -639,16 +649,22 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
logger.finest(info.getType().getSimpleName() + " update sql=" + sb.toString().replaceAll("(\r|\n)", "\\n"));
} //打印结束
}
prestmt.executeBatch();
int[] pc = prestmt.executeBatch();
c = 0;
for (int p : pc) {
c += p;
}
prestmt.close();
}
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return;
if (cache == null) return c;
int c2 = 0;
for (final T value : values) {
cache.update(value);
c2 += cache.update(value);
}
if (cacheListener != null) cacheListener.updateCache(clazz, values);
return c >= 0 ? c : c2;
} catch (SQLException e) {
throw new RuntimeException(e);
}

View File

@@ -38,8 +38,10 @@ public interface DataSource {
*
* @param <T> 泛型
* @param values Entity对象
*
* @return 删除的数据条数
*/
public <T> void delete(final T... values);
public <T> int delete(final T... values);
/**
* 根据主键值删除数据
@@ -48,10 +50,12 @@ public interface DataSource {
* @param <T> Entity类的泛型
* @param clazz Entity类
* @param ids 主键值
*
* @return 删除的数据条数
*/
public <T> void delete(final Class<T> clazz, final Serializable... ids);
public <T> int delete(final Class<T> clazz, final Serializable... ids);
public <T> void delete(final Class<T> clazz, final FilterNode node);
public <T> int delete(final Class<T> clazz, final FilterNode node);
//------------------------update---------------------------
/**
@@ -59,8 +63,10 @@ public interface DataSource {
*
* @param <T> 泛型
* @param values Entity对象
*
* @return 更新的数据条数
*/
public <T> void update(final T... values);
public <T> int update(final T... values);
public <T> int updateColumn(final Class<T> clazz, final Serializable id, final String column, final Serializable value);

View File

@@ -363,10 +363,12 @@ public final class EntityCache<T> {
}
}
public void delete(final Serializable id) {
if (id == null) return;
public int delete(final Serializable id) {
if (id == null) return 0;
final T rs = this.map.remove(id);
if (rs != null) this.list.remove(rs);
if (rs == null) return 0;
this.list.remove(rs);
return 1;
}
public Serializable[] delete(final FilterNode node) {
@@ -383,13 +385,14 @@ public final class EntityCache<T> {
return ids;
}
public void update(final T value) {
if (value == null) return;
public int update(final T value) {
if (value == null) return 0;
T rs = this.map.get(this.primary.get(value));
if (rs == null) return;
if (rs == null) return 0;
synchronized (rs) {
this.chgReproduce.apply(rs, value);
}
return 1;
}
public T update(final T value, Collection<Attribute<T, Serializable>> attrs) {