文档章节

定制SqlSessionFactoryBean,扩展typeAliasesPackage配置

ZhenbinLi
 ZhenbinLi
发布于 2016/02/15 11:17
字数 528
阅读 4.8K
收藏 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
深圳
私信 提问
加载中

评论(0)

Mybatis3.2不支持Ant通配符TypeAliasesPackage扫描的解决方案

业务场景 业务场景:首先项目进行分布式拆分之后,按照模块再分为为api层和service层,web层。 其中订单业务的实体类放在com.muses.taoshop.item.entity,而用户相关的实体类放在com.muses.t...

smileNicky
2018/12/02
0
0
Spring整合MyBatis(三)sqlSessionFactory创建

摘要: 本文结合《Spring源码深度解析》来分析Spring 5.0.6版本的源代码。若有描述错误之处,欢迎指正。 目录 一、SqlSessionFactoryBean的初始化 二、获取 SqlSessionFactoryBean 实例 通过S...

osc_k6z4gwqi
2018/08/08
1
0
mybatis配置问题(已经解决)

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

繁华p落幕
2015/07/10
2.5K
1
Mybatis整合Spring 【转】

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

如何让他和
2016/10/17
40
2
Mybatis整合Spring 【转】

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

看到了打开了
2016/10/27
23
1

没有更多内容

加载失败,请刷新页面

加载更多

Flutter 使用Navigator进行局部跳转页面

老孟导读:Navigator组件使用的频率不是很高,但在一些场景下非常适用,比如局部表单多页填写、底部导航一直存在,每个tab各自导航场景。 Navigator 是管理路由的控件,通常情况下直接使用N...

老孟Flutter
31分钟前
28
0
使用site-maven-plugin在github上搭建公有仓库

简介 Maven是我们在开发java程序中经常使用的构建工具,在团队合作开发过程中,如果我们想要将自己写好的jar包共享给别人使用,通常需要自己搭建maven仓库,然后将写好的jar包上传到maven仓库...

flydean
今天
25
1
Python笔记:爬取各国疫情仙去人数数据制作南丁格尔玫瑰图

我凌晨用Python爬虫实时从网上爬取各国在疫情中仙去人数的数据,然后仿人民日报制作成“南丁格尔玫瑰图” 英国37048;意大利32877;西班牙27117都对得上; 但美国、法国、巴西的跟百度大数据...

tengyulong
今天
26
0
PHP Session的用法

在 PHP 中,Session 是一种服务器端的机制,服务器使用一种散列表的结构(类似于 JSON)来保存信息。相比于保存在客户端的 Cookie,Session 将用户交互信息保存在了服务器端,使得同一个客户...

linuxprobe2020
今天
37
0
webpack.03-打包js同时生成html页面

在空文件夹初始化:CMD npm init -y cnpm install -D webpack webpack-cli 文件结构 src(文件夹)--->test.js console.log('hello webpack') src(文件夹)--->index.html <html> ......

_qq507570355
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部