ref[orm]: use generic type interface

This commit is contained in:
godotg
2024-07-01 18:40:48 +08:00
parent d86f7b1713
commit d9e0728d2f
9 changed files with 61 additions and 67 deletions
@@ -60,7 +60,7 @@ public class OrmContext implements ApplicationListener<ApplicationContextEvent>,
return instance.accessor;
}
public static <E extends IEntity<?>> IQueryBuilder<E> getQuery(Class<E> entityClazz) {
public static <PK extends Comparable<PK>, E extends IEntity<PK>> IQueryBuilder<PK, E> getQuery(Class<E> entityClazz) {
return instance.query.builder(entityClazz);
}
@@ -25,23 +25,23 @@ import java.util.List;
*/
public interface IAccessor {
<E extends IEntity<?>> boolean insert(E entity);
<PK extends Comparable<PK>, E extends IEntity<PK>> boolean insert(E entity);
<E extends IEntity<?>> void batchInsert(List<E> entities);
<PK extends Comparable<PK>, E extends IEntity<PK>> void batchInsert(List<E> entities);
<E extends IEntity<?>> boolean update(E entity);
<PK extends Comparable<PK>, E extends IEntity<PK>> boolean update(E entity);
<E extends IEntity<?>> void batchUpdate(List<E> entities);
<PK extends Comparable<PK>, E extends IEntity<PK>> void batchUpdate(List<E> entities);
<E extends IEntity<?>> boolean delete(E entity);
<PK extends Comparable<PK>, E extends IEntity<PK>> boolean delete(E entity);
<E extends IEntity<?>> boolean delete(Object pk, Class<E> entityClazz);
<PK extends Comparable<PK>, E extends IEntity<PK>> boolean delete(PK pk, Class<E> entityClazz);
<E extends IEntity<?>> void batchDelete(List<E> entities);
<PK extends Comparable<PK>, E extends IEntity<PK>> void batchDelete(List<E> entities);
<E extends IEntity<?>> void batchDelete(List<?> pks, Class<E> entityClazz);
<PK extends Comparable<PK>, E extends IEntity<PK>> void batchDelete(List<PK> pks, Class<E> entityClazz);
@Nullable
<E extends IEntity<?>> E load(Object pk, Class<E> entityClazz);
<PK extends Comparable<PK>, E extends IEntity<PK>> E load(PK pk, Class<E> entityClazz);
}
@@ -35,7 +35,7 @@ public class MongodbAccessor implements IAccessor {
@Override
public <E extends IEntity<?>> boolean insert(E entity) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> boolean insert(E entity) {
@SuppressWarnings("unchecked")
var entityClazz = (Class<E>) entity.getClass();
var collection = OrmContext.getOrmManager().getCollection(entityClazz);
@@ -44,7 +44,7 @@ public class MongodbAccessor implements IAccessor {
}
@Override
public <E extends IEntity<?>> void batchInsert(List<E> entities) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> void batchInsert(List<E> entities) {
if (CollectionUtils.isEmpty(entities)) {
return;
}
@@ -55,7 +55,7 @@ public class MongodbAccessor implements IAccessor {
}
@Override
public <E extends IEntity<?>> boolean update(E entity) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> boolean update(E entity) {
try {
@SuppressWarnings("unchecked")
var entityClazz = (Class<E>) entity.getClass();
@@ -76,7 +76,7 @@ public class MongodbAccessor implements IAccessor {
}
@Override
public <E extends IEntity<?>> void batchUpdate(List<E> entities) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> void batchUpdate(List<E> entities) {
if (CollectionUtils.isEmpty(entities)) {
return;
}
@@ -101,7 +101,7 @@ public class MongodbAccessor implements IAccessor {
}
@Override
public <E extends IEntity<?>> boolean delete(E entity) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> boolean delete(E entity) {
@SuppressWarnings("unchecked")
var entityClazz = (Class<E>) entity.getClass();
var collection = OrmContext.getOrmManager().getCollection(entityClazz);
@@ -110,14 +110,14 @@ public class MongodbAccessor implements IAccessor {
}
@Override
public <E extends IEntity<?>> boolean delete(Object pk, Class<E> entityClazz) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> boolean delete(PK pk, Class<E> entityClazz) {
var collection = OrmContext.getOrmManager().getCollection(entityClazz);
var result = collection.deleteOne(Filters.eq("_id", pk));
return result.getDeletedCount() > 0;
}
@Override
public <E extends IEntity<?>> void batchDelete(List<E> entities) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> void batchDelete(List<E> entities) {
if (CollectionUtils.isEmpty(entities)) {
return;
}
@@ -129,13 +129,13 @@ public class MongodbAccessor implements IAccessor {
}
@Override
public <E extends IEntity<?>> void batchDelete(List<?> pks, Class<E> entityClazz) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> void batchDelete(List<PK> pks, Class<E> entityClazz) {
var collection = OrmContext.getOrmManager().getCollection(entityClazz);
collection.deleteMany(Filters.in("_id", pks));
}
@Override
public <E extends IEntity<?>> E load(Object pk, Class<E> entityClazz) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> E load(PK pk, Class<E> entityClazz) {
var collection = OrmContext.getOrmManager().getCollection(entityClazz);
var result = new ArrayList<E>(1);
collection.find(Filters.eq("_id", pk)).forEach(document -> result.add(document));
@@ -15,7 +15,6 @@ package com.zfoo.orm.manager;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.zfoo.orm.cache.IEntityCache;
import com.zfoo.orm.model.IEntity;
import org.bson.Document;
@@ -39,14 +38,14 @@ public interface IOrmManager {
*/
MongoClient mongoClient();
<E extends IEntity<?>> IEntityCache<?, E> getEntityCaches(Class<E> clazz);
<PK extends Comparable<PK>, E extends IEntity<PK>> IEntityCache<PK, E> getEntityCaches(Class<E> clazz);
Collection<IEntityCache<?, ?>> getAllEntityCaches();
/**
* 基于对象的orm操作
*/
<E extends IEntity<?>> MongoCollection<E> getCollection(Class<E> entityClazz);
<PK extends Comparable<PK>, E extends IEntity<PK>> MongoCollection<E> getCollection(Class<E> entityClazz);
/**
* 更加细粒度的操作
@@ -142,7 +142,7 @@ public class OrmManager implements IOrmManager {
var entityDef = entry.getValue();
var indexDefMap = entityDef.getIndexDefMap();
if (CollectionUtils.isNotEmpty(indexDefMap)) {
var collection = getCollection(entityClass);
var collection = mongodbDatabase.getCollection(collectionName(entityClass), entityClass);
for (var indexDef : indexDefMap.entrySet()) {
var fieldName = indexDef.getKey();
var index = indexDef.getValue();
@@ -174,7 +174,7 @@ public class OrmManager implements IOrmManager {
if (CollectionUtils.isNotEmpty(indexTextDefMap)) {
AssertionUtils.isTrue(indexTextDefMap.size() == 1
, StringUtils.format("A collection can have only one text index [{}]", JsonUtils.object2String(indexTextDefMap.keySet())));
var collection = getCollection(entityClass);
var collection = mongodbDatabase.getCollection(collectionName(entityClass), entityClass);
for (var indexTextDef : indexTextDefMap.entrySet()) {
var fieldName = indexTextDef.getKey();
var hasIndex = false;
@@ -240,7 +240,7 @@ public class OrmManager implements IOrmManager {
}
@Override
public <E extends IEntity<?>> IEntityCache<?, E> getEntityCaches(Class<E> clazz) {
public <PK extends Comparable<PK>, E extends IEntity<PK>> IEntityCache<PK, E> getEntityCaches(Class<E> clazz) {
var usable = allEntityCachesUsableMap.get(clazz);
if (usable == null) {
throw new RunException("EntityCaches that do not have [] defined", clazz.getCanonicalName());
@@ -250,7 +250,7 @@ public class OrmManager implements IOrmManager {
throw new RunException("Orm does not use [] EntityCacheAutowired annotation, which are released in advance to save memory", clazz.getCanonicalName());
}
@SuppressWarnings("unchecked")
var entityCache = (IEntityCache<?, E>) entityCachesMap.get(clazz);
var entityCache = (IEntityCache<PK, E>) entityCachesMap.get(clazz);
return entityCache;
}
@@ -259,14 +259,18 @@ public class OrmManager implements IOrmManager {
return Collections.unmodifiableCollection(entityCachesMap.values());
}
@Override
public <E extends IEntity<?>> MongoCollection<E> getCollection(Class<E> entityClazz) {
private String collectionName(Class<? extends IEntity<?>> entityClazz) {
var collectionName = collectionNameMap.get(entityClazz);
if (collectionName == null) {
collectionName = StringUtils.substringBeforeLast(StringUtils.uncapitalize(entityClazz.getSimpleName()), "Entity");
collectionNameMap.put(entityClazz, collectionName);
}
return mongodbDatabase.getCollection(collectionName, entityClazz);
return collectionName;
}
@Override
public <PK extends Comparable<PK>, E extends IEntity<PK>> MongoCollection<E> getCollection(Class<E> entityClazz) {
return mongodbDatabase.getCollection(collectionName(entityClazz), entityClazz);
}
@@ -20,8 +20,8 @@ import com.zfoo.orm.model.IEntity;
*
* @author godotg
*/
public interface IQuery {
public interface IQuery<PK extends Comparable<PK>, E extends IEntity<PK>> {
<E extends IEntity<?>> IQueryBuilder<E> builder(Class<E> entityClazz);
IQueryBuilder<PK, E> builder(Class<E> entityClazz);
}
@@ -22,33 +22,33 @@ import java.util.List;
/**
* @author sinprog
*/
public interface IQueryBuilder<E extends IEntity> {
public interface IQueryBuilder<PK extends Comparable<PK>, E extends IEntity<PK>> {
// EQ、= 等于(=
IQueryBuilder<E> eq(String fieldName, Object fieldValue);
IQueryBuilder<PK, E> eq(String fieldName, Object fieldValue);
// NE、<> 不等于(<>
IQueryBuilder<E> ne(String fieldName, Object fieldValue);
IQueryBuilder<PK, E> ne(String fieldName, Object fieldValue);
IQueryBuilder<E> in(String fieldName, List<?> fieldValueList);
IQueryBuilder<PK, E> in(String fieldName, List<?> fieldValueList);
// [n] in (不在)IN 查询
IQueryBuilder<E> nin(String fieldName, List<?> fieldValueList);
IQueryBuilder<PK, E> nin(String fieldName, List<?> fieldValueList);
// LT、< 小于(<
IQueryBuilder<E> lt(String fieldName, Object fieldValue);
IQueryBuilder<PK, E> lt(String fieldName, Object fieldValue);
// lte、<= 小于等于(<=
IQueryBuilder<E> lte(String fieldName, Object fieldValue);
IQueryBuilder<PK, E> lte(String fieldName, Object fieldValue);
// GT、> 大于(>
IQueryBuilder<E> gt(String fieldName, Object fieldValue);
IQueryBuilder<PK, E> gt(String fieldName, Object fieldValue);
// GTE、>= 大于等于(>=
IQueryBuilder<E> gte(String fieldName, Object fieldValue);
IQueryBuilder<PK, E> gte(String fieldName, Object fieldValue);
// LIKE 模糊查询
IQueryBuilder<E> like(String fieldName, String fieldValue);
IQueryBuilder<PK, E> like(String fieldName, String fieldValue);
List<E> queryAll();
@@ -24,7 +24,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class MongoQueryBuilder<E extends IEntity<?>> implements IQueryBuilder<E> {
public class MongoQueryBuilder<PK extends Comparable<PK>, E extends IEntity<PK>> implements IQueryBuilder<PK, E> {
private final Class<E> entity;
private Bson builder = Filters.empty();
@@ -38,63 +38,63 @@ public class MongoQueryBuilder<E extends IEntity<?>> implements IQueryBuilder<E>
}
@Override
public IQueryBuilder<E> eq(String fieldName, Object fieldValue) {
public IQueryBuilder<PK, E> eq(String fieldName, Object fieldValue) {
var bson = Filters.eq(fieldName, fieldValue);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> ne(String fieldName, Object fieldValue) {
public IQueryBuilder<PK, E> ne(String fieldName, Object fieldValue) {
var bson = Filters.ne(fieldName, fieldValue);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> lt(String fieldName, Object fieldValue) {
public IQueryBuilder<PK, E> lt(String fieldName, Object fieldValue) {
var bson = Filters.lt(fieldName, fieldValue);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> lte(String fieldName, Object fieldValue) {
public IQueryBuilder<PK, E> lte(String fieldName, Object fieldValue) {
var bson = Filters.lte(fieldName, fieldValue);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> gt(String fieldName, Object fieldValue) {
public IQueryBuilder<PK, E> gt(String fieldName, Object fieldValue) {
var bson = Filters.gt(fieldName, fieldValue);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> gte(String fieldName, Object fieldValue) {
public IQueryBuilder<PK, E> gte(String fieldName, Object fieldValue) {
var bson = Filters.gte(fieldName, fieldValue);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> in(String fieldName, List<?> fieldValueList) {
public IQueryBuilder<PK, E> in(String fieldName, List<?> fieldValueList) {
var bson = Filters.in(fieldName, fieldValueList);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> nin(String fieldName, List<?> fieldValueList) {
public IQueryBuilder<PK, E> nin(String fieldName, List<?> fieldValueList) {
var bson = Filters.nin(fieldName, fieldValueList);
wrapBuilder(bson);
return this;
}
@Override
public IQueryBuilder<E> like(String fieldName, String fieldValue) {
public IQueryBuilder<PK, E> like(String fieldName, String fieldValue) {
var regex = StringUtils.format("^{}.*", fieldValue);
var bson = Filters.regex(fieldName, regex);
wrapBuilder(bson);
@@ -106,14 +106,7 @@ public class MongoQueryBuilder<E extends IEntity<?>> implements IQueryBuilder<E>
var collection = OrmContext.getOrmManager().getCollection(entity);
var list = new ArrayList<E>();
var result = collection.find(builder);
result.forEach(new Consumer<IEntity<?>>() {
@Override
public void accept(IEntity<?> entity) {
@SuppressWarnings("unchecked")
var e = (E) entity;
list.add(e);
}
});
result.forEach(entity -> list.add(entity));
return list;
}
@@ -127,12 +120,10 @@ public class MongoQueryBuilder<E extends IEntity<?>> implements IQueryBuilder<E>
var list = new ArrayList<E>();
result.skip(p.skipNum())
.limit(p.getItemsPerPage())
.forEach(new Consumer<IEntity<?>>() {
.forEach(new Consumer<E>() {
@Override
public void accept(IEntity<?> entity) {
@SuppressWarnings("unchecked")
var e = (E) entity;
list.add(e);
public void accept(E entity) {
list.add(entity);
}
});
@@ -18,11 +18,11 @@ import com.zfoo.orm.model.IEntity;
/**
* @author godotg
*/
public class MongodbQuery implements IQuery {
public class MongodbQuery<PK extends Comparable<PK>, E extends IEntity<PK>> implements IQuery<PK, E> {
@Override
public <E extends IEntity<?>> IQueryBuilder<E> builder(Class<E> entityClazz) {
return new MongoQueryBuilder<E>(entityClazz);
public IQueryBuilder<PK, E> builder(Class<E> entityClazz) {
return new MongoQueryBuilder<PK, E>(entityClazz);
}
}