文档章节

定制SqlSessionFactoryBean,扩展typeAliasesPackage配置

ZhenbinLi
 ZhenbinLi
发布于 2016/02/15 11:17
字数 528
阅读 616
收藏 0
点赞 1
评论 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 ⋅ 1

mybatis中,如何在自动扫描 xml后,能排除某个xml?

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

jackyrong ⋅ 2016/04/05 ⋅ 3

搭建框架的时候不用写dao实现层代码

<!-- sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:typeAliasesPackage="com.jumei.wms.dataaccess.domain"> <property name="......

小小小七 ⋅ 2015/04/02 ⋅ 0

Mybatis整合Spring

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

如何让他和 ⋅ 2016/08/16 ⋅ 1

Mybatis整合Spring 【转】

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

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

Mybatis整合Spring 【转】

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

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

spring boot mybatis druid snaker配合使用的问题?

最近使用spring-boot,druid,Mybatis写了一些东西 其中@MapperScan("com.varicom.mapper") 扫描 到这里都没问题,eclipse启动和打包运行都没问题 后来工程引入snaker,根据snaker 2.4的myb...

java10001 ⋅ 2015/01/27 ⋅ 4

mybatis与spring3.1整合

spring的配置文件中加入以下内容 1.SqlSessionFactoryBean (必需) 就是中间件所需的处理类 2.dataSource (必需) spring中数据源引用 3.configLocation (可选) Mybatis自身的配置文件,一般用...

livvyguo ⋅ 2013/08/15 ⋅ 0

求解:spring结合mybatis配置多数据源报错

项目中要操作多个数据库的表,因此要配置多个数据源,配置如下:

曾鹏 ⋅ 2014/06/04 ⋅ 5

Mybatis_PageHelper采用spring方式集成报错

@Liuzh533 你好,想跟你请教个问题: 使用spring方式集成,web功能启动的时候报错,错误信息如下: 2014-12-27 21:13:51 ERROR [org.springframework.web.context.ContextLoader] Context in...

itpkm ⋅ 2014/12/27 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

R计算IV

参考文章 #读取文件 rawdata = read.csv("/path/to/csv/file",header=T) colnames(rawdata)[18] <- "y" //重命名因变量y #数据分区 训练集测试集 trainIdx <- sample(nrow(rawdata), round(......

火力全開 ⋅ 20分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

阿里云云栖社区 ⋅ 20分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

猫耳m ⋅ 31分钟前 ⋅ 0

关于ireport自定义变量类型为list的时候

自己摸石头过河,我真的应该去趟市中心图书馆,借本真正靠谱的教材 网上的东西,只有0.01%是有用的,还有0.99%是垃圾,剩下的99%是垃圾的复制品。。 哎!~ 问题是这样的,报表带sql,从db中获...

炑炑milina ⋅ 32分钟前 ⋅ 0

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载spring上下文信息,最主要的功能是解析applicationContex...

轨迹_ ⋅ 32分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云官方博客 ⋅ 34分钟前 ⋅ 0

Redis安装异常解决办法

官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹:c...

slagga ⋅ 38分钟前 ⋅ 0

006. 深入JVM学习—年轻代

1. 年轻代图片 年轻代(Young)属于JVM堆内存空间的一个组成部分 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了...

影狼 ⋅ 39分钟前 ⋅ 0

如何成为一个合格的程序员

偶尔的,我会被人问道:如何成为一名优秀的程序员,更或者,如何成为一名程序员。每次人们问起,我都力图给出不同的答案。因此,我的答案是各种各样的。下面就是我认为的成为一名优秀的程序员...

柳猫 ⋅ 40分钟前 ⋅ 0

cups error_log日志暴增

日志内容 File \"/usr/lib/cups/notifier/dbus\" has insecure permissions 解决(未验证适用范围) sudo service cups stopsudo rm /etc/cups/subscriptions.conf*sudo rm -r /var/cac......

一介码夫_Hum ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部