Sfoglia il codice sorgente

优化mybatis创建实体接口

zhouhao 7 anni fa
parent
commit
d80942cfd8

+ 6 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/MyBatisAutoConfiguration.java

@@ -25,6 +25,7 @@ import org.apache.ibatis.session.TransactionIsolationLevel;
 import org.apache.ibatis.transaction.Transaction;
 import org.hsweb.ezorm.rdb.executor.AbstractJdbcSqlExecutor;
 import org.hsweb.ezorm.rdb.executor.SqlExecutor;
+import org.hswebframework.web.commons.entity.factory.EntityFactory;
 import org.hswebframework.web.dao.datasource.DataSourceHolder;
 import org.hswebframework.web.dao.datasource.DatabaseType;
 import org.hswebframework.web.dao.mybatis.dynamic.DynamicDataSourceSqlSessionFactoryBuilder;
@@ -68,6 +69,8 @@ public class MyBatisAutoConfiguration {
     @Autowired(required = false)
     private DatabaseIdProvider databaseIdProvider;
 
+    @Autowired(required = false)
+    private EntityFactory entityFactory;
 
     @Bean
     @Primary
@@ -79,6 +82,9 @@ public class MyBatisAutoConfiguration {
     @Bean(name = "sqlSessionFactory")
     public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
         SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
+        if (null != entityFactory) {
+            factory.setObjectFactory(new MybatisEntityFactory(entityFactory));
+        }
         factory.setVfs(SpringBootVFS.class);
         if (mybatisProperties.isDynamicDatasource()) {
             factory.setSqlSessionFactoryBuilder(new DynamicDataSourceSqlSessionFactoryBuilder());

+ 38 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/MybatisEntityFactory.java

@@ -0,0 +1,38 @@
+package org.hswebframework.web.dao.mybatis;
+
+import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
+import org.hswebframework.web.commons.entity.factory.EntityFactory;
+
+import java.util.*;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class MybatisEntityFactory extends DefaultObjectFactory {
+
+    private EntityFactory entityFactory;
+
+    public MybatisEntityFactory(EntityFactory entityFactory) {
+        this.entityFactory = entityFactory;
+    }
+
+    @Override
+    protected Class<?> resolveInterface(Class<?> type) {
+        Class<?> classToCreate;
+        if (type == List.class || type == Collection.class || type == Iterable.class) {
+            classToCreate = ArrayList.class;
+        } else if (type == Map.class) {
+            classToCreate = HashMap.class;
+        } else if (type == SortedSet.class) { // issue #510 Collections Support
+            classToCreate = TreeSet.class;
+        } else if (type == Set.class) {
+            classToCreate = HashSet.class;
+        } else {
+            // entity interface
+            classToCreate = entityFactory.getInstanceType(type);
+        }
+        return classToCreate;
+    }
+}