All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.org.atool.fluent.mybatis.spring.MapperFactory Maven / Gradle / Ivy

There is a newer version: 1.9.9
Show newest version
package cn.org.atool.fluent.mybatis.spring;

import cn.org.atool.fluent.mybatis.base.IEntity;
import cn.org.atool.fluent.mybatis.base.intf.IRelation;
import cn.org.atool.fluent.mybatis.base.mapper.IEntityMapper;
import cn.org.atool.fluent.mybatis.functions.IExecutor;
import cn.org.atool.fluent.mybatis.functions.TableDynamic;
import cn.org.atool.fluent.mybatis.metadata.DbType;
import cn.org.atool.fluent.mybatis.typehandler.IConvertor;
import cn.org.atool.fluent.mybatis.utility.MybatisUtil;
import cn.org.atool.fluent.mybatis.utility.RefKit;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import java.lang.reflect.Type;
import java.util.*;

import static cn.org.atool.fluent.mybatis.utility.MybatisUtil.assertNotEmpty;

/**
 * 所有Mapper实例登记, 需spring bean初始化
 *
 * @author wudarui
 */
@SuppressWarnings({"all"})
@Slf4j
public class MapperFactory implements IMapperFactory {
    private ApplicationContext context;

    @Getter
    private static boolean isInitialized = false;

    @Getter
    private Collection sessionFactories;

    @Getter
    private final List initializers = new ArrayList<>();

    @Autowired
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        this.context = context;
        this.sessionFactories = context.getBeansOfType(SqlSessionFactory.class).values();
        assertNotEmpty("SqlSessionFactory", this.sessionFactories);
        if (MapperFactory.isInitialized) {
            return;
        }
        this.init();

        log.info(MybatisUtil.getVersionBanner());
        MapperFactory.isInitialized = true;
    }

    @Override
    public Set getMappers() {
        Map mappers = context.getBeansOfType(IEntityMapper.class);
        return new HashSet<>(mappers.values());
    }

    @Override
    public Set getRelations() {
        Map relations = context.getBeansOfType(IRelation.class);
        return new HashSet<>(relations.values());
    }

    /**
     * 修改实体类对应的数据库类型
     *
     * @param dbType   DbType
     * @param eClasses if empty 修改所有实体对应数据库类型
     * @return ignore
     */
    public MapperFactory dbType(DbType dbType, Class... eClasses) {
        return this.initializer(() -> RefKit.dbType(dbType, eClasses));
    }

    /**
     * 更改实体对应的数据库表名称
     *
     * @param tableSupplier 表名称更改器
     * @param eClasses      if empty, 修改所有实体对应的表名称
     * @return ignore
     */
    public MapperFactory tableSupplier(TableDynamic tableSupplier, Class... eClasses) {
        return this.initializer(() -> RefKit.tableSupplier(tableSupplier, eClasses));
    }

    /**
     * 注册PoJoHelper.toPoJo时特定类型的转换器
     *
     * @param type      类型
     * @param convertor 类型转换器
     */
    public MapperFactory register(Type type, IConvertor convertor) {
        return this.initializer(() -> RefKit.register(type, convertor));
    }

    /**
     * 注册PoJoHelper.toPoJo时特定类型的转换器
     *
     * @param type      类型
     * @param convertor 类型转换器
     */
    public MapperFactory register(String type, IConvertor convertor) {
        return this.initializer(() -> RefKit.register(type, convertor));
    }

    /**
     * 增加环境设置脚本
     *
     * @param initializer 环境设置
     * @return ignore
     */
    public MapperFactory initializer(IExecutor initializer) {
        this.initializers.add(initializer);
        return this;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy