zhouhao 8 éve
szülő
commit
d755c039a6

+ 10 - 0
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/CloneableBean.java

@@ -0,0 +1,10 @@
+package org.hswebframework.web.commons.beans;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public interface CloneableBean extends Bean, Cloneable {
+    CloneableBean clone();
+}

+ 1 - 3
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/GenericBean.java

@@ -25,13 +25,11 @@ import java.util.Map;
  * @author zhouhao
  * @since 3.0
  */
-public interface GenericBean<PK> extends Bean {
+public interface GenericBean<PK> extends CloneableBean {
     String id = "id";
 
     String properties = "properties";
 
-    GenericBean<PK> cloneBean();
-
     PK getId();
 
     void setId(PK id);

+ 3 - 0
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/SimpleGenericBean.java

@@ -68,4 +68,7 @@ public abstract class SimpleGenericBean<PK> implements GenericBean<PK> {
         if (null == properties) properties = new LinkedHashMap<>();
         properties.put(propertyName, value);
     }
+
+    @Override
+    public abstract SimpleGenericBean<PK> clone();
 }

+ 0 - 18
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/dsl/QueryBean.java

@@ -1,18 +0,0 @@
-package org.hswebframework.web.commons.beans.dsl;
-
-import org.hswebframework.web.commons.beans.Bean;
-
-/**
- * TODO 完成注释
- *
- * @author zhouhao
- */
-public interface QueryBean<T extends QueryBean> extends Bean {
-
-
-    T like(Object value);
-
-    T gt(Object value);
-
-
-}

+ 22 - 3
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/factory/BeanFactory.java

@@ -21,13 +21,32 @@ package org.hswebframework.web.commons.beans.factory;
 import org.hswebframework.web.commons.beans.Bean;
 
 /**
- * TODO 完成注释
+ * 实体工厂接口,系统各个地方使用此接口来创建实体,在实际编码中也应该使用此接口来创建实体,而不是使用new方式来创建
  *
  * @author zhouhao
+ * @see Bean
  * @since 3.0
  */
 public interface BeanFactory {
-    <T extends Bean> T getInstance(Class<T> beanClass);
+    /**
+     * 根据类型创建实体,类型必须为{@link Bean}的子类。
+     *
+     * @param beanClass 类型
+     * @param <T>       泛型,需实现{@link Bean}
+     * @return 实体
+     */
+    <T extends Bean> T newInstance(Class<T> beanClass);
 
-    <T extends Bean> Class<T> getRealType(Class<T> beanClass);
+    /**
+     * 根据类型获取实体的真实的实体类型,
+     * 可通过此方法获取获取已拓展的实体类型,如:<br>
+     * <code>
+     * factory.getInstanceType(MyBeanInterface.class); -> class SimpleMyBeanInterface
+     * </code>
+     *
+     * @param beanClass 类型
+     * @param <T>       泛型
+     * @return 实体类型
+     */
+    <T extends Bean> Class<T> getInstanceType(Class<T> beanClass);
 }

+ 54 - 18
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/factory/MapperBeanFactory.java

@@ -23,6 +23,7 @@ import org.hswebframework.web.commons.beans.Bean;
 import java.lang.reflect.Modifier;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Supplier;
 
 /**
  * TODO 完成注释
@@ -31,38 +32,73 @@ import java.util.Map;
  * @since 3.0
  */
 public class MapperBeanFactory implements BeanFactory {
-    private Map<Class, Class> realTypeMapper = new HashMap<>();
+    private Map<Class, Mapper> realTypeMapper = new HashMap<>();
 
     @Override
-    public <T extends Bean> T getInstance(Class<T> beanClass) {
-        Class<T> realType = getRealType(beanClass);
-        if (realType == null) {
-            if (!Modifier.isInterface(beanClass.getModifiers()) && !Modifier.isAbstract(beanClass.getModifiers())) {
-                realType = beanClass;
-            }
+    @SuppressWarnings("unchecked")
+    public <T extends Bean> T newInstance(Class<T> beanClass) {
+        Mapper<T> mapper = realTypeMapper.get(beanClass);
+        if (mapper != null) return mapper.getInstanceGetter().get();
+        Class<T> realType = null;
+        if (!Modifier.isInterface(beanClass.getModifiers()) && !Modifier.isAbstract(beanClass.getModifiers())) {
+            realType = beanClass;
         }
         //尝试使用 Simple类,如: package.SimpleUserBean
         if (realType == null) {
             String simpleClassName = beanClass.getPackage().getName().concat(".Simple").concat(beanClass.getSimpleName());
             try {
                 realType = (Class<T>) Class.forName(simpleClassName);
-                realTypeMapper.put(beanClass, realType);
+                mapper = new Mapper<>(realType, new DefaultInstanceGetter(realType));
+                realTypeMapper.put(beanClass, mapper);
+                return mapper.getInstanceGetter().get();
             } catch (ClassNotFoundException e) {
             }
         }
-        if (realType != null) {
+        return null;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T extends Bean> Class<T> getInstanceType(Class<T> beanClass) {
+        Mapper<T> mapper = realTypeMapper.get(beanClass);
+        if (null != mapper) {
+            return mapper.getTarget();
+        }
+        return null;
+    }
+
+    public static class Mapper<T extends Bean> {
+        Class<T>    target;
+        Supplier<T> instanceGetter;
+
+        public Mapper(Class<T> target, Supplier<T> instanceGetter) {
+            this.target = target;
+            this.instanceGetter = instanceGetter;
+        }
+
+        public Class<T> getTarget() {
+            return target;
+        }
+
+        public Supplier<T> getInstanceGetter() {
+            return instanceGetter;
+        }
+    }
+
+    class DefaultInstanceGetter<T extends Bean> implements Supplier<T> {
+        Class<T> type;
+
+        public DefaultInstanceGetter(Class<T> type) {
+            this.type = type;
+        }
+
+        @Override
+        public T get() {
             try {
-                return realType.newInstance();
+                return type.newInstance();
             } catch (Exception e) {
-                throw new RuntimeException("{create_bean_error}", e);
+                throw new RuntimeException(e);
             }
-        } else {
-            throw new UnsupportedOperationException("{create_bean_error}:realType not found!");
         }
     }
-
-    @Override
-    public <T extends Bean> Class<T> getRealType(Class<T> beanClass) {
-        return realTypeMapper.get(beanClass);
-    }
 }

+ 16 - 1
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/param/DeleteParamBean.java

@@ -4,9 +4,24 @@ import org.hsweb.ezorm.core.param.Param;
 import org.hswebframework.web.commons.beans.Bean;
 
 /**
- * TODO 完成注释
+ * 查询参数实体,使用<a href="https://github.com/hs-web/hsweb-easy-orm">easyorm</a>进行动态查询参数构建<br/>
+ * 可通过静态方法创建:<br/>
+ * {@link DeleteParamBean#build()}<br/>
  *
  * @author zhouhao
+ * @see Param
+ * @see Bean
+ * @since 3.0
  */
 public class DeleteParamBean extends Param implements Bean {
+    /**
+     * 创建一个无条件的删除条件实体
+     * 创建后需自行指定条件({@link DeleteParamBean#where(String, Object)})
+     * 否则可能无法执行更新(dao实现应该禁止无条件的删除)
+     *
+     * @return
+     */
+    public static DeleteParamBean build() {
+        return new DeleteParamBean();
+    }
 }

+ 32 - 1
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/param/QueryParamBean.java

@@ -4,9 +4,40 @@ import org.hsweb.ezorm.core.param.QueryParam;
 import org.hswebframework.web.commons.beans.Bean;
 
 /**
- * TODO 完成注释
+ * 查询参数实体,使用<a href="https://github.com/hs-web/hsweb-easy-orm">easyorm</a>进行动态查询参数构建<br/>
+ * 可通过静态方法创建:<br/>
+ * {@link QueryParamBean#empty()}<br/>
+ * {@link QueryParamBean#single(String, Object)}<br/>
+ * 如:
+ * <code>
+ * QueryParamBean.single("id",id);
+ * </code>
  *
  * @author zhouhao
+ * @see QueryParam
+ * @see Bean
+ * @since 3.0
  */
 public class QueryParamBean extends QueryParam implements Bean {
+
+    /**
+     * 创建一个空的查询参数实体,该实体无任何参数.
+     *
+     * @return 无条件的参数实体
+     */
+    public static QueryParamBean empty() {
+        return new QueryParamBean();
+    }
+
+    /**
+     * 创建一个含有单个条件的参数实体,条件默认为is
+     *
+     * @param field 参数名称
+     * @param value 参数值
+     * @return 单个条件的参数实体
+     * @see QueryParam#where(String, Object)
+     */
+    public static QueryParamBean single(String field, Object value) {
+        return empty().where(field, value);
+    }
 }

+ 36 - 1
hsweb-commons/hsweb-commons-beans/src/main/java/org/hswebframework/web/commons/beans/param/UpdateParamBean.java

@@ -4,9 +4,12 @@ import org.hsweb.ezorm.core.param.UpdateParam;
 import org.hswebframework.web.commons.beans.Bean;
 
 /**
- * TODO 完成注释
+ * 修改参数实体,使用<a href="https://github.com/hs-web/hsweb-easy-orm">easyorm</a>进行动态参数构建
  *
  * @author zhouhao
+ * @see UpdateParam
+ * @see Bean
+ * @since 3.0
  */
 public class UpdateParamBean<T> extends UpdateParam<T> implements Bean {
     public UpdateParamBean() {
@@ -15,4 +18,36 @@ public class UpdateParamBean<T> extends UpdateParam<T> implements Bean {
     public UpdateParamBean(T data) {
         super(data);
     }
+
+    /**
+     * 创建一个无任何条件并指定数据的更新参数实体
+     * 创建后需自行指定条件({@link UpdateParamBean#where(String, Object)})
+     * 否则可能无法执行更新(dao实现应该禁止无条件的更新)
+     *
+     * @param data 要更新的数据
+     * @param <T>  数据泛型
+     * @return 更新参数实体
+     */
+    public static <T> UpdateParamBean<T> build(T data) {
+        return new UpdateParamBean<>(data);
+    }
+
+    /**
+     * 创建一个单个条件并指定数据的更新参数实体,条件默认为is:
+     * <br>例如:<br>
+     * <code>
+     * // where id = #{id}
+     * <br>
+     * UpdateParamBean.build(data,"id",id);
+     * </code>
+     *
+     * @param data  要更新的数据
+     * @param field 条件名
+     * @param value 条件值
+     * @param <T>   数据泛型
+     * @return 更新参数实体
+     */
+    public static <T> UpdateParamBean<T> build(T data, String field, Object value) {
+        return new UpdateParamBean<>(data).where(field, value);
+    }
 }