文档章节

定制SqlSessionFactoryBean,扩展typeAliasesPackage配置

ZhenbinLi
 ZhenbinLi
发布于 2016/02/15 11:17
字数 528
阅读 691
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
21
5
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部