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 @Override
public <T> void delete(T... values) { public <T> int delete(T... values) {
source.delete(values); return source.delete(values);
} }
@Override @Override
public <T> void delete(final Class<T> clazz, final Serializable... ids) { public <T> int delete(final Class<T> clazz, final Serializable... ids) {
source.delete(clazz, ids); return source.delete(clazz, ids);
} }
@Override @Override
public <T> void delete(final Class<T> clazz, FilterNode node) { public <T> int delete(final Class<T> clazz, FilterNode node) {
source.delete(clazz, node); return source.delete(clazz, node);
} }
@Override @Override
public <T> void update(T... values) { public <T> int update(T... values) {
source.update(values); return source.update(values);
} }
@Override @Override

View File

@@ -463,51 +463,53 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* *
* @param <T> Entity类泛型 * @param <T> Entity类泛型
* @param values Entity对象 * @param values Entity对象
*
* @return 删除的数据条数
*/ */
@Override @Override
public <T> void delete(T... values) { public <T> int delete(T... values) {
if (values.length == 0) return; if (values.length == 0) return 0;
final EntityInfo<T> info = loadEntityInfo((Class<T>) values[0].getClass()); final EntityInfo<T> info = loadEntityInfo((Class<T>) values[0].getClass());
if (info.isVirtualEntity()) { //虚拟表只更新缓存Cache if (info.isVirtualEntity()) { //虚拟表只更新缓存Cache
delete(null, info, values); return delete(null, info, values);
return;
} }
Connection conn = createWriteSQLConnection(); Connection conn = createWriteSQLConnection();
try { try {
delete(conn, info, values); return delete(conn, info, values);
} finally { } finally {
closeSQLConnection(conn); closeSQLConnection(conn);
} }
} }
private <T> void delete(final Connection conn, final EntityInfo<T> info, T... values) { private <T> int delete(final Connection conn, final EntityInfo<T> info, T... values) {
if (values.length == 0) return; if (values.length == 0) return 0;
final Attribute primary = info.getPrimary(); final Attribute primary = info.getPrimary();
Serializable[] ids = new Serializable[values.length]; Serializable[] ids = new Serializable[values.length];
int i = 0; int i = 0;
for (final T value : values) { for (final T value : values) {
ids[i++] = (Serializable) primary.get(value); ids[i++] = (Serializable) primary.get(value);
} }
delete(conn, info, ids); return delete(conn, info, ids);
} }
@Override @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); final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) { //虚拟表只更新缓存Cache if (info.isVirtualEntity()) { //虚拟表只更新缓存Cache
delete(null, info, ids); return delete(null, info, ids);
return;
} }
Connection conn = createWriteSQLConnection(); Connection conn = createWriteSQLConnection();
try { try {
delete(conn, info, ids); return delete(conn, info, ids);
} finally { } finally {
closeSQLConnection(conn); closeSQLConnection(conn);
} }
} }
private <T> void delete(final Connection conn, final EntityInfo<T> info, Serializable... keys) { private <T> int delete(final Connection conn, final EntityInfo<T> info, Serializable... keys) {
if (keys.length == 0) return; if (keys.length == 0) return -1;
int c = -1;
int c2 = 0;
try { try {
if (!info.isVirtualEntity()) { if (!info.isVirtualEntity()) {
final Statement stmt = conn.createStatement(); 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); if (debug.get()) logger.finest(info.getType().getSimpleName() + " delete sql=" + sql);
stmt.addBatch(sql); stmt.addBatch(sql);
} }
stmt.executeBatch(); int[] pc = stmt.executeBatch();
c = 0;
for (int p : pc) {
c += p;
}
stmt.close(); stmt.close();
} }
//------------------------------------ //------------------------------------
final EntityCache<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
if (cache == null) return; if (cache == null) return c;
for (Serializable key : keys) { for (Serializable key : keys) {
cache.delete(key); c2 += cache.delete(key);
} }
if (cacheListener != null) cacheListener.deleteCache(info.getType(), keys); if (cacheListener != null) cacheListener.deleteCache(info.getType(), keys);
return c >= 0 ? c : c2;
} catch (SQLException e) { } 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); throw new RuntimeException(e);
} }
} }
@Override @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); final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) { if (info.isVirtualEntity()) {
delete(null, info, node); return delete(null, info, node);
return;
} }
Connection conn = createWriteSQLConnection(); Connection conn = createWriteSQLConnection();
try { try {
delete(conn, info, node); return delete(conn, info, node);
} finally { } finally {
closeSQLConnection(conn); 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 { try {
if (!info.isVirtualEntity()) { if (!info.isVirtualEntity()) {
Map<Class, String> joinTabalis = node.getJoinTabalis(); 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)); 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); if (debug.get()) logger.finest(info.getType().getSimpleName() + " delete sql=" + sql);
final Statement stmt = conn.createStatement(); final Statement stmt = conn.createStatement();
stmt.execute(sql); c = stmt.executeUpdate(sql);
stmt.close(); stmt.close();
} }
//------------------------------------ //------------------------------------
final EntityCache<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
if (cache == null) return; if (cache == null) return c;
Serializable[] ids = cache.delete(node); Serializable[] ids = cache.delete(node);
if (cacheListener != null) cacheListener.deleteCache(info.getType(), ids); if (cacheListener != null) cacheListener.deleteCache(info.getType(), ids);
return c >= 0 ? c : (ids == null ? 0 : ids.length);
} catch (SQLException e) { } 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); throw new RuntimeException(e);
} }
} }
@@ -586,26 +594,28 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
* *
* @param <T> Entity类泛型 * @param <T> Entity类泛型
* @param values Entity对象 * @param values Entity对象
*
* @return 更新的数据条数
*/ */
@Override @Override
public <T> void update(T... values) { public <T> int update(T... values) {
if (values.length == 0) return; if (values.length == 0) return 0;
final EntityInfo<T> info = loadEntityInfo((Class<T>) values[0].getClass()); final EntityInfo<T> info = loadEntityInfo((Class<T>) values[0].getClass());
if (info.isVirtualEntity()) { if (info.isVirtualEntity()) {
update(null, info, values); return update(null, info, values);
return;
} }
Connection conn = createWriteSQLConnection(); Connection conn = createWriteSQLConnection();
try { try {
update(conn, info, values); return update(conn, info, values);
} finally { } finally {
closeSQLConnection(conn); 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 { try {
Class clazz = info.getType(); Class clazz = info.getType();
int c = -1;
if (!info.isVirtualEntity()) { if (!info.isVirtualEntity()) {
final String updateSQL = info.getUpdateSQL(values[0]); final String updateSQL = info.getUpdateSQL(values[0]);
final Attribute<T, Serializable> primary = info.getPrimary(); 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")); 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(); prestmt.close();
} }
//--------------------------------------------------- //---------------------------------------------------
final EntityCache<T> cache = info.getCache(); final EntityCache<T> cache = info.getCache();
if (cache == null) return; if (cache == null) return c;
int c2 = 0;
for (final T value : values) { for (final T value : values) {
cache.update(value); c2 += cache.update(value);
} }
if (cacheListener != null) cacheListener.updateCache(clazz, values); if (cacheListener != null) cacheListener.updateCache(clazz, values);
return c >= 0 ? c : c2;
} catch (SQLException e) { } catch (SQLException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -38,8 +38,10 @@ public interface DataSource {
* *
* @param <T> 泛型 * @param <T> 泛型
* @param values Entity对象 * @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 <T> Entity类的泛型
* @param clazz Entity类 * @param clazz Entity类
* @param ids 主键值 * @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--------------------------- //------------------------update---------------------------
/** /**
@@ -59,8 +63,10 @@ public interface DataSource {
* *
* @param <T> 泛型 * @param <T> 泛型
* @param values Entity对象 * @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); 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) { public int delete(final Serializable id) {
if (id == null) return; if (id == null) return 0;
final T rs = this.map.remove(id); 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) { public Serializable[] delete(final FilterNode node) {
@@ -383,13 +385,14 @@ public final class EntityCache<T> {
return ids; return ids;
} }
public void update(final T value) { public int update(final T value) {
if (value == null) return; if (value == null) return 0;
T rs = this.map.get(this.primary.get(value)); T rs = this.map.get(this.primary.get(value));
if (rs == null) return; if (rs == null) return 0;
synchronized (rs) { synchronized (rs) {
this.chgReproduce.apply(rs, value); this.chgReproduce.apply(rs, value);
} }
return 1;
} }
public T update(final T value, Collection<Attribute<T, Serializable>> attrs) { public T update(final T value, Collection<Attribute<T, Serializable>> attrs) {