文档章节

定制SqlSessionFactoryBean,扩展typeAliasesPackage配置

ZhenbinLi
 ZhenbinLi
发布于 2016/02/15 11:17
字数 528
阅读 759
收藏 0
package com.oneplus.wms.mvc;

import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileFilter;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.Set;

/**
 * 功能描述:Mybatis自动化扫描Model扩展
 * <p/>
 * WMS各个Model存放在不同的Package下, 当前需要支持:<package name="com.oneplus.wms.dao.model" />下所有子的配置
 * 避免配置文件过多, 此种配置会扫描配置包下的所有子包
 *
 * @author: Zhenbin.Li
 * Date: 16/2/14 Time: 16:43
 */
public class OneplusSqlSessionFactoryBean extends SqlSessionFactoryBean {

    /**
     * sl4j
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(OneplusSqlSessionFactoryBean.class);

    /**
     * scan file
     */
    protected static final String PATH_FILE = "file";

    /**
     * scan jar
     */
    protected static final String PATH_JAR = "jar";

    /**
     * file suffix
     */
    protected static final String PATH_CLASS = "class";

    /**
     * Packages to search for type aliases.
     *
     * @param typeAliasesPackage package to scan for domain objects
     * @since 1.0.1
     */
    @Override
    public void setTypeAliasesPackage(String typeAliasesPackage) {
        if (StringUtils.isBlank(typeAliasesPackage)) {
            super.setTypeAliasesPackage(typeAliasesPackage);
        }

        LOGGER.info("mybatis自动扫描Model路径:" + typeAliasesPackage);
        Set<String> allPackageAliases = scanAllPackageAliases(typeAliasesPackage);
        if (CollectionUtils.isEmpty(allPackageAliases)) {
            super.setTypeAliasesPackage(typeAliasesPackage);
        }

        LOGGER.debug("mybatis自动扫描Model的所有结果:" + allPackageAliases);
        String joinAliases = Joiner.on(",").join(allPackageAliases);
        super.setTypeAliasesPackage(joinAliases);

    }

    /**
     * 扫描配置文件包下的所有字包
     *
     * @param pack mybatis-config.xml配置扫描model路径
     *             <typeAliases>
     *             <package name="com.oneplus.wms.dao.model" />
     *             </typeAliases>
     * @return 配置路径下的所有子包
     */
    protected Set<String> scanAllPackageAliases(String pack) {
        // 是否循环搜索子包
        boolean recursive = true;
        // 包名字
        String packageName = pack;
        // 包名对应的路径名称
        String packageDirName = packageName.replace('.', '/');
        Enumeration<URL> dirs;

        Set<String> packageAliases = Sets.newLinkedHashSet();
        try {
            dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
            while (dirs.hasMoreElements()) {
                URL url = dirs.nextElement();
                String protocol = url.getProtocol();
                if (StringUtils.equals(PATH_FILE, protocol)) {
                    String filePath = URLDecoder.decode(url.getFile(), Charsets.UTF_8.displayName());
                    listAllChildPackages(packageName, filePath, recursive, packageAliases);
                } else if (StringUtils.equals(PATH_JAR, protocol)) {
                    LOGGER.info(PATH_JAR + "类型的扫描");
                }
            }
        } catch (Exception e) {
            LOGGER.error("mybatis扫描配置路径异常, 配置路径:" + pack, e);
        }

        return packageAliases;
    }

    /**
     * 在package对应的路径下找到所有的child Package
     *
     * @param packageName    路径名称
     * @param filePath       文件路径
     * @param recursive      是否子目录
     * @param packageAliases 子目录名称
     */
    protected void listAllChildPackages(String packageName, String filePath, final boolean recursive, Set<String> packageAliases) {
        File dir = new File(filePath);
        if (!dir.exists() || !dir.isDirectory()) {
            return;
        }
        // 在给定的目录下找到所有的文件,并且进行条件过滤
        File[] dirFiles = dir.listFiles(new FileFilter() {

            @Override
            public boolean accept(File file) {
                // 接受dir目录
                boolean acceptDir = recursive && file.isDirectory();
                // 接受class文件
                boolean acceptClass = StringUtils.endsWith(file.getName(), PATH_CLASS);
                return acceptDir || acceptClass;
            }
        });

        for (File file : dirFiles) {
            if (file.isDirectory()) {
                listAllChildPackages(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, packageAliases);
            } else {
                packageAliases.add(file.getParent());
            }
        }
    }
}


© 著作权归作者所有

共有 人打赏支持
ZhenbinLi
粉丝 0
博文 3
码字总数 2175
作品 0
深圳
mybatis配置问题(已经解决)

问题是这样的,当我每次添加新的实体类的时候,不管是不是放在已经存在的包中,在tomcat启动的时候 总是会报错(好像是一直在校验sql),有时候我弄一下莫名其妙的就好了,想知道为什么会这样.以下是...

繁华p落幕
2015/07/10
1K
1
mybatis中,如何在自动扫描 xml后,能排除某个xml?

在旧的ibatis中,是在sqlmapcoinfg.xml中,写一大堆映射文件.xml的,而在mybatis中,可以用下面的方法自动配置

jackyrong
2016/04/05
589
3
Mybatis整合Spring 【转】

根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Myb...

看到了打开了
2016/10/27
6
1
Mybatis整合Spring

根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Myb...

如何让他和
2016/08/16
31
1
Mybatis整合Spring 【转】

根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Myb...

如何让他和
2016/10/17
7
2

没有更多内容

加载失败,请刷新页面

加载更多

arcgis jsapi接口入门系列:总览

开发环境: arcgis jsapi版本4.9 由于我们这套代码是基于vue,webpack开发的,会有少数vue代码,但总体不影响 里面还有些我们公司的js库和html css,给出的代码不能百分百直接运行,主要还是...

canneljls
2分钟前
0
0
月薪80k阿里架构师漫谈他是如何从一名小码农走到架构师的

01 刚当程序员时,我是属于那种勤勤恳恳类型的员工,工作态度用认真来形容不为过,每天我几乎是团队里最早到公司,又最晚下班的一个。而组员张工一般情况下都是准时上下班的,即使项目进度比...

Java填坑之路
4分钟前
0
0
oracle的resetlogs机制浅析

oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用? 它的原理机制是什么?他都起哪些作用? 我...

突突突酱
5分钟前
0
0
JAVA 获取两个日期间的所有日期

public static List<String> getDates(String startDate, String endDate){    Date d1 = new SimpleDateFormat("yyyyMMdd").parse(startDate);//定义起始日期    Date d2 = new Simple......

尘叙缘
12分钟前
0
0
Innodb中的事务隔离级别和锁的关系

#一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。...

Skqing
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部