diff --git a/sqli-builder/src/main/java/io/xream/sqli/builder/Q.java b/sqli-builder/src/main/java/io/xream/sqli/builder/Q.java index e30080d..5d71ac7 100644 --- a/sqli-builder/src/main/java/io/xream/sqli/builder/Q.java +++ b/sqli-builder/src/main/java/io/xream/sqli/builder/Q.java @@ -21,8 +21,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import io.xream.sqli.api.Routable; import io.xream.sqli.mapping.Mappable; -import io.xream.sqli.mapping.XHelpful; import io.xream.sqli.mapping.SqlNormalizer; +import io.xream.sqli.mapping.XHelpful; import io.xream.sqli.page.Paged; import io.xream.sqli.parser.Parsed; import io.xream.sqli.util.BeanUtil; diff --git a/sqli-builder/src/main/java/io/xream/sqli/builder/internal/DefaultQ2Sql.java b/sqli-builder/src/main/java/io/xream/sqli/builder/internal/DefaultQ2Sql.java index 34a1105..755f308 100644 --- a/sqli-builder/src/main/java/io/xream/sqli/builder/internal/DefaultQ2Sql.java +++ b/sqli-builder/src/main/java/io/xream/sqli/builder/internal/DefaultQ2Sql.java @@ -19,16 +19,16 @@ package io.xream.sqli.builder.internal; import io.xream.sqli.builder.*; -import io.xream.sqli.exception.QSyntaxException; import io.xream.sqli.exception.ParsingException; +import io.xream.sqli.exception.QSyntaxException; import io.xream.sqli.exception.SqlBuildException; import io.xream.sqli.filter.BaseTypeFilter; import io.xream.sqli.mapping.Mappable; import io.xream.sqli.parser.BeanElement; import io.xream.sqli.parser.Parsed; import io.xream.sqli.parser.Parser; -import io.xream.sqli.support.XSingleSourceSupport; import io.xream.sqli.support.TimeSupport; +import io.xream.sqli.support.XSingleSourceSupport; import io.xream.sqli.util.EnumUtil; import io.xream.sqli.util.SqliJsonUtil; import io.xream.sqli.util.SqliStringUtil; diff --git a/sqli-builder/src/main/java/io/xream/sqli/parser/Parser.java b/sqli-builder/src/main/java/io/xream/sqli/parser/Parser.java index 50bfdfc..84cb2fb 100644 --- a/sqli-builder/src/main/java/io/xream/sqli/parser/Parser.java +++ b/sqli-builder/src/main/java/io/xream/sqli/parser/Parser.java @@ -21,7 +21,6 @@ import io.xream.sqli.annotation.X; import io.xream.sqli.builder.Q; import io.xream.sqli.exception.NotSupportedException; -import io.xream.sqli.exception.ParsingException; import io.xream.sqli.util.BeanUtil; import io.xream.sqli.util.ParserUtil; import io.xream.sqli.util.SqliExceptionUtil; diff --git a/sqli-core/src/main/java/io/xream/sqli/api/BaseRepository.java b/sqli-core/src/main/java/io/xream/sqli/api/BaseRepository.java index 3413e97..cc74658 100644 --- a/sqli-core/src/main/java/io/xream/sqli/api/BaseRepository.java +++ b/sqli-core/src/main/java/io/xream/sqli/api/BaseRepository.java @@ -58,9 +58,11 @@ public interface BaseRepository extends Typed { */ boolean refreshUnSafe(Qr qr); - boolean remove(String keyOne); + boolean remove(String id); - boolean remove(long keyOne); + boolean remove(long id); + + boolean removeIn(List idList); /** * diff --git a/sqli-core/src/main/java/io/xream/sqli/cache/internal/CacheKeyBuilder.java b/sqli-core/src/main/java/io/xream/sqli/cache/internal/CacheKeyBuilder.java index cfab0c1..fc09fc5 100644 --- a/sqli-core/src/main/java/io/xream/sqli/cache/internal/CacheKeyBuilder.java +++ b/sqli-core/src/main/java/io/xream/sqli/cache/internal/CacheKeyBuilder.java @@ -19,8 +19,8 @@ package io.xream.sqli.cache.internal; import io.xream.sqli.builder.Bb; -import io.xream.sqli.builder.Q; import io.xream.sqli.builder.KV; +import io.xream.sqli.builder.Q; import io.xream.sqli.builder.Sort; import io.xream.sqli.cache.CacheKeyBuildable; import io.xream.sqli.util.SqliStringUtil; diff --git a/sqli-core/src/main/java/io/xream/sqli/cache/internal/DefaultL2CacheResolver.java b/sqli-core/src/main/java/io/xream/sqli/cache/internal/DefaultL2CacheResolver.java index 1775441..c3bae40 100644 --- a/sqli-core/src/main/java/io/xream/sqli/cache/internal/DefaultL2CacheResolver.java +++ b/sqli-core/src/main/java/io/xream/sqli/cache/internal/DefaultL2CacheResolver.java @@ -18,8 +18,8 @@ */ package io.xream.sqli.cache.internal; -import io.xream.sqli.builder.Q; import io.xream.sqli.builder.In; +import io.xream.sqli.builder.Q; import io.xream.sqli.cache.QueryForCache; import io.xream.sqli.exception.L2CacheException; import io.xream.sqli.exception.NoResultUnderProtectionException; diff --git a/sqli-core/src/main/java/io/xream/sqli/core/Keys.java b/sqli-core/src/main/java/io/xream/sqli/core/Keys.java new file mode 100644 index 0000000..5d62d3a --- /dev/null +++ b/sqli-core/src/main/java/io/xream/sqli/core/Keys.java @@ -0,0 +1,30 @@ +/* + * Copyright 2020 io.xream.sqli + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.xream.sqli.core; + +import java.util.List; + +/** + * @author Sim + */ +public interface Keys { + + List list(); + Class getClzz(); +} diff --git a/sqli-core/src/main/java/io/xream/sqli/core/Repository.java b/sqli-core/src/main/java/io/xream/sqli/core/Repository.java index 4f673d6..164e326 100644 --- a/sqli-core/src/main/java/io/xream/sqli/core/Repository.java +++ b/sqli-core/src/main/java/io/xream/sqli/core/Repository.java @@ -34,47 +34,26 @@ */ public interface Repository extends QueryForCache { - /** - * @param clz - */ void refreshCache(Class clz); - /** - * @param obj - */ + boolean create(Object obj); boolean createOrReplace(Object obj); - /** - * @param qr - * @return true | false - */ + boolean refresh(Qr qr); - /** - * @param keyOne - */ + boolean remove(KeyOne keyOne); + boolean removeIn(Keys keys); + + T get(KeyOne keyOne); - /** - * @param cond - * - */ + List list(Object cond); - /** - * @param q - */ Page find(Q q); - /** - * @param xq - * - */ Page> find(Q.X xq); - /** - * - * @param xq - * - */ + List> list(Q.X xq); List listPlainValue(Class clzz, Q.X xq); diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/core/CacheableRepository.java b/sqli-repo/src/main/java/io/xream/sqli/repository/core/CacheableRepository.java index cbbd09c..5fe03df 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/core/CacheableRepository.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/core/CacheableRepository.java @@ -19,14 +19,11 @@ package io.xream.sqli.repository.core; -import io.xream.sqli.builder.Q; import io.xream.sqli.builder.In; import io.xream.sqli.builder.KV; +import io.xream.sqli.builder.Q; import io.xream.sqli.builder.Qr; -import io.xream.sqli.core.KeyOne; -import io.xream.sqli.core.NativeSupport; -import io.xream.sqli.core.Repository; -import io.xream.sqli.core.RowHandler; +import io.xream.sqli.core.*; import io.xream.sqli.exception.QueryException; import io.xream.sqli.page.Page; import io.xream.sqli.parser.Parsed; @@ -175,6 +172,30 @@ public boolean remove(KeyOne keyOne) { String key = String.valueOf(keyOne.get()); cacheResolver.refresh(clz, key); } + + return flag; + } + + @Override + public boolean removeIn(Keys keys) { + + Class clz = keys.getClzz(); + Parsed parsed = Parser.get(clz); + + if (parsed.getKey() == null) + throw new IllegalStateException("no primary key, can not call remove(id)"); + + boolean flag = dao.removeIn(keys); + + if (!flag) return flag; + + if (isCacheEnabled(parsed)) { + for (Object o : keys.list()) { + String key = String.valueOf(o); + cacheResolver.refresh(clz, key); + } + } + return flag; } diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/dao/Dao.java b/sqli-repo/src/main/java/io/xream/sqli/repository/dao/Dao.java index b3656db..b44d646 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/dao/Dao.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/dao/Dao.java @@ -18,11 +18,12 @@ */ package io.xream.sqli.repository.dao; -import io.xream.sqli.builder.Q; import io.xream.sqli.builder.In; +import io.xream.sqli.builder.Q; import io.xream.sqli.builder.Qr; import io.xream.sqli.cache.QueryForCache; import io.xream.sqli.core.KeyOne; +import io.xream.sqli.core.Keys; import io.xream.sqli.core.RowHandler; import io.xream.sqli.page.Page; @@ -45,6 +46,8 @@ public interface Dao extends QueryForCache { boolean remove(KeyOne keyOne); + boolean removeIn(Keys keys); + boolean refreshByCondition(Qr conditon); List list(Object conditionObj); @@ -76,4 +79,5 @@ List> list(String sql, void findToHandle(Q.X xq, RowHandler> handler); boolean exists(Q q); + } \ No newline at end of file diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/dao/DaoImpl.java b/sqli-repo/src/main/java/io/xream/sqli/repository/dao/DaoImpl.java index 8333b38..3b8c8f6 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/dao/DaoImpl.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/dao/DaoImpl.java @@ -22,6 +22,7 @@ import io.xream.sqli.builder.internal.PageBuilderHelper; import io.xream.sqli.converter.ObjectDataConverter; import io.xream.sqli.core.KeyOne; +import io.xream.sqli.core.Keys; import io.xream.sqli.core.RowHandler; import io.xream.sqli.dialect.Dialect; import io.xream.sqli.exception.ExceptionTranslator; @@ -72,8 +73,8 @@ public Dialect getDialect(){ return this.dialect; } - public void set2Sql(Q2Sql condToSql) { - this.q2Sql = condToSql; + public void set2Sql(Q2Sql q2Sql) { + this.q2Sql = q2Sql; } public void setJdbcHelper(JdbcHelper jdbcHelper) { @@ -121,6 +122,19 @@ public boolean remove(KeyOne keyOne) { return this.jdbcHelper.remove(sql, keyOne.get()); } + @Override + public boolean removeIn(Keys keys) { + + Class clz = keys.getClzz(); + String sql = getSql(clz, SqlInit.REMOVE_IN); + + sql = sqlBuilder.buildQueryByInCondition(sql, clz, keys.list()); + + SqliLoggerProxy.debug(clz, sql); + + return this.jdbcHelper.execute(sql); + } + @Override public boolean create(Object obj) { diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/dao/SqlBuilder.java b/sqli-repo/src/main/java/io/xream/sqli/repository/dao/SqlBuilder.java index c1a2aeb..461a5a8 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/dao/SqlBuilder.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/dao/SqlBuilder.java @@ -95,6 +95,16 @@ protected String buildQueryByInCondition(String sqlSegment, String mapper, BeanE return sb.toString(); } + protected String buildQueryByInCondition(String sqlSegment, Class keyType, List inList) { + + StringBuilder sb = new StringBuilder(); + sb.append(sqlSegment); + + buildIn(sb,keyType,inList); + + return sb.toString(); + } + protected SqlBuilt buildQueryByQ(List valueList, Q q, Q2Sql qParser, Dialect dialect) { final SqlBuilt sqlBuilt = new SqlBuilt(); diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/init/DefaultSqlInit.java b/sqli-repo/src/main/java/io/xream/sqli/repository/init/DefaultSqlInit.java index 43d99c5..4804f65 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/init/DefaultSqlInit.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/init/DefaultSqlInit.java @@ -82,6 +82,26 @@ public String getRemoveSql(Class clz) { return sql; } + public String getRemoveInSql(Class clz) { + Parsed parsed = Parser.get(clz); + StringBuilder sb = new StringBuilder(); + sb.append(dialect.getAlterTableDelete()).append(SqlScript.SPACE); + sb.append(BeanUtil.getByFirstLower(parsed.getClzName())).append(dialect.getCommandDelete()); + sb.append("WHERE "); + + parseKeyIns(sb, clz); + + String sql = sb.toString(); + + sql = SqlParserUtil.mapper(sql, parsed); + + getSqlMap(clz).put(REMOVE_IN, sql); + + SqliLoggerProxy.debug(clz, sb); + + return sql; + } + public String getOneSql(Class clz) { Parsed parsed = Parser.get(clz); String space = " "; @@ -112,6 +132,15 @@ public void parseKey(StringBuilder sb, Class clz) { } } + public void parseKeyIns(StringBuilder sb, Class clz) { + Parsed parsed = Parser.get(clz); + + if (parsed.getClzName() != null) { + sb.append(parsed.getKey()); + sb.append(" IN"); + } + } + public String getLoadSql(Class clz) { Parsed parsed = Parser.get(clz); diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlInit.java b/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlInit.java index aca0ccc..7beb989 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlInit.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlInit.java @@ -31,10 +31,12 @@ public interface SqlInit extends SqlTemplate{ String getRemoveSql(Class clz); + String getRemoveInSql(Class clz); default void tryToParse(Class clz) { getRemoveSql(clz); + getRemoveInSql(clz); getOneSql(clz); getLoadSql(clz); getCreateSql(clz); diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlTemplate.java b/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlTemplate.java index afa30f2..97445dd 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlTemplate.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/init/SqlTemplate.java @@ -32,6 +32,7 @@ public interface SqlTemplate { String CREATE = "CREATE"; String REMOVE = "REMOVE"; + String REMOVE_IN = "REMOVE_IN"; String LOAD = "LOAD"; String GET_ONE = "GET_ONE"; diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/internal/DefaultRepositoryX.java b/sqli-repo/src/main/java/io/xream/sqli/repository/internal/DefaultRepositoryX.java index e702414..d91f11c 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/internal/DefaultRepositoryX.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/internal/DefaultRepositoryX.java @@ -21,19 +21,20 @@ import io.xream.sqli.api.BaseRepository; import io.xream.sqli.api.RepositoryX; -import io.xream.sqli.builder.Q; import io.xream.sqli.builder.In; +import io.xream.sqli.builder.Q; import io.xream.sqli.builder.Qr; import io.xream.sqli.builder.RemoveRefreshCreate; import io.xream.sqli.core.*; -import io.xream.sqli.exception.QSyntaxException; import io.xream.sqli.exception.PersistenceException; +import io.xream.sqli.exception.QSyntaxException; import io.xream.sqli.page.Page; import io.xream.sqli.parser.Parser; import io.xream.sqli.util.SqliStringUtil; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -155,16 +156,16 @@ public boolean removeRefreshCreate(RemoveRefreshCreate removeRefreshCreate){ } @Override - public boolean remove(String keyOne) { + public boolean remove(String id) { - if (SqliStringUtil.isNullOrEmpty(keyOne)) + if (SqliStringUtil.isNullOrEmpty(id)) return false; return repository.remove(new KeyOne() { @Override public Object get() { - return keyOne; + return id; } @Override @@ -175,15 +176,15 @@ public Class getClzz() { } @Override - public boolean remove(long keyOne) { + public boolean remove(long id) { - if (keyOne == 0) + if (id == 0) return false; return repository.remove(new KeyOne() { @Override public Object get() { - return keyOne; + return id; } @Override @@ -193,6 +194,25 @@ public Class getClzz() { }); } + @Override + public boolean removeIn(List idList) { + if (idList == null || idList.isEmpty()) + return false; + + return this.repository.removeIn(new Keys() { + @Override + public List list() { + return idList; + } + + @Override + public Class getClzz() { + return clzz; + } + }); + + } + @Override public T get(long keyOne) { diff --git a/sqli-repo/src/main/java/io/xream/sqli/repository/util/ResultSortUtil.java b/sqli-repo/src/main/java/io/xream/sqli/repository/util/ResultSortUtil.java index 583a11c..5d48cce 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/repository/util/ResultSortUtil.java +++ b/sqli-repo/src/main/java/io/xream/sqli/repository/util/ResultSortUtil.java @@ -18,8 +18,8 @@ */ package io.xream.sqli.repository.util; -import io.xream.sqli.builder.Q; import io.xream.sqli.builder.KV; +import io.xream.sqli.builder.Q; import io.xream.sqli.exception.ParsingException; import io.xream.sqli.parser.BeanElement; import io.xream.sqli.parser.Parsed; diff --git a/sqli-repo/src/main/java/io/xream/sqli/starter/SqliStarter.java b/sqli-repo/src/main/java/io/xream/sqli/starter/SqliStarter.java index 2353076..03fc0d1 100644 --- a/sqli-repo/src/main/java/io/xream/sqli/starter/SqliStarter.java +++ b/sqli-repo/src/main/java/io/xream/sqli/starter/SqliStarter.java @@ -63,7 +63,7 @@ public Q2Sql q2Sql(){ return DefaultQ2Sql.newInstance(); } - public Repository repository(Q2Sql condToSql, JdbcHelper jdbcHelper, + public Repository repository(Q2Sql q2Sql, JdbcHelper jdbcHelper, Dialect dialect, L2CacheResolver l2CacheResolver ){ @@ -72,7 +72,7 @@ public Repository repository(Q2Sql condToSql, JdbcHelper jdbcHelper, CacheableRepository repository = CacheableRepository.newInstance(); repository.setDao(dao); - ((DaoImpl)dao).set2Sql(condToSql); + ((DaoImpl)dao).set2Sql(q2Sql); ((DaoImpl)dao).setJdbcHelper(jdbcHelper); ((DaoImpl)dao).setDialect(dialect); @@ -81,12 +81,12 @@ public Repository repository(Q2Sql condToSql, JdbcHelper jdbcHelper, return repository; } - public TemporaryRepository temporaryRepository(Q2Sql condToSql, JdbcHelper jdbcHelper, Dialect dialect, Repository repository){ + public TemporaryRepository temporaryRepository(Q2Sql q2Sql, JdbcHelper jdbcHelper, Dialect dialect, Repository repository){ DefaultTemporaryTableParser temporaryTableParser = DefaultTemporaryTableParser.newInstance(); temporaryTableParser.setDialect(dialect); TemporaryDao temporaryDao = TemporaryDaoImpl.newInstance(); ((TemporaryDaoImpl)temporaryDao).setJdbcHelper(jdbcHelper); - ((TemporaryDaoImpl)temporaryDao).setQ2Sql(condToSql); + ((TemporaryDaoImpl)temporaryDao).setQ2Sql(q2Sql); ((TemporaryDaoImpl)temporaryDao).setDialect(dialect); TemporaryRepository tr = DefaultTemporaryRepository.newInstance();