<mybatis.version>3.2.8</mybatis.version>
<mybatis.spring.version>1.2.2</mybatis.spring.version>
<mybatis.generator.version>1.3.2</mybatis.generator.version>

MBG

http://www.mybatis.org/spring/apidocs/reference/org/mybatis/spring/SqlSessionFactoryBean.html

这几天搭建了spring4.1.2+mybatis3.2.8一个简单的框架。

发现mybatis的SqlSessionFactoryBean可以配置typeAliasesPackage属性,自动为domain起别名。

如果我的domain在不同包下面,那么这个配置不支持通配符扫描包路径?如下改造:

改造前:applicationContext.xml配置:

  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  2. <property name="dataSource" ref="dataSource" />
  3. <property name="configLocation" value="classpath:/SqlMapConfig.xml"></property>
  4. <property name="mapperLocations" value="classpath*:/sqlmaps/**/*-sql.xml"></property>
  5. <property name="typeAliasesPackage" value="com.demo.domain" />
  6. </bean>

改造后:applicationContext.xml配置:

  1. <bean id="sqlSessionFactory" class="com.demo.core.mybatis.TQSqlSessionFactoryBean">
  2. <property name="dataSource" ref="dataSource" />
  3. <property name="configLocation" value="classpath:/SqlMapConfig.xml"></property>
  4. <property name="mapperLocations" value="classpath*:/sqlmaps/**/*-sql.xml"></property>
  5. <property name="typeAliasesPackage" value="com.demo.**.domain" />
  6. </bean>

com.demo.core.mybatis.TQSqlSessionFactoryBean类源码:

  1. package com.demo.core.mybatis;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.core.io.Resource;
  8. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  9. import org.springframework.core.io.support.ResourcePatternResolver;
  10. import com.demo.core.utils.StringUtil;
  11. /**
  12. * @ClassName: TQSqlSessionFactoryBean
  13. * @Description: mybatis自动扫描别名路径(新增通配符匹配功能)
  14. * @author wangxiaohu wsmalltiger@163.com
  15. * @date 2014年12月9日 上午9:36:23
  16. */
  17. public class TQSqlSessionFactoryBean extends SqlSessionFactoryBean {
  18. Logger logger = LoggerFactory.getLogger(getClass());
  19. private static final String ROOT_PATH = "com" + File.separator + "demo"
  20. + File.separator;
  21. private static final String ROOT_PATH_SPLIT = ",";
  22. private static final String[] PATH_REPLACE_ARRAY = { "]" };
  23. public void setTypeAliasesPackage(String typeAliasesPackage) {
  24. if (!StringUtil.isStringAvaliable(typeAliasesPackage)) {
  25. super.setTypeAliasesPackage(typeAliasesPackage);
  26. return;
  27. }
  28. ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  29. StringBuffer typeAliasesPackageStringBuffer = new StringBuffer();
  30. try {
  31. for (String location : typeAliasesPackage.split(",")) {
  32. if (!StringUtil.isStringAvaliable(location)) {
  33. continue;
  34. }
  35. location = "classpath*:"
  36. + location.trim().replace(".", File.separator);
  37. typeAliasesPackageStringBuffer.append(getResources(resolver,
  38. location));
  39. }
  40. } catch (IOException e) {
  41. logger.error(e.getMessage(), e);
  42. }
  43. if ("".equals(typeAliasesPackageStringBuffer.toString())) {
  44. throw new RuntimeException(
  45. "mybatis typeAliasesPackage 路径扫描错误!请检查applicationContext.xml@sqlSessionFactory配置!");
  46. }
  47. typeAliasesPackage = replaceResult(
  48. typeAliasesPackageStringBuffer.toString()).replace(
  49. File.separator, ".");
  50. super.setTypeAliasesPackage(typeAliasesPackage);
  51. }
  52. private String getResources(ResourcePatternResolver resolver,
  53. String location) throws IOException {
  54. StringBuffer resourcePathStringBuffer = new StringBuffer();
  55. for (Resource resource : resolver.getResources(location)) {
  56. String description = resource == null ? "" : resource
  57. .getDescription();
  58. if (!StringUtil.isStringAvaliable(resource.getDescription())
  59. || description.indexOf(ROOT_PATH) == -1) {
  60. continue;
  61. }
  62. resourcePathStringBuffer.append(
  63. description.substring(description.indexOf(ROOT_PATH)))
  64. .append(ROOT_PATH_SPLIT);
  65. }
  66. return resourcePathStringBuffer.toString();
  67. }
  68. private String replaceResult(String resultStr) {
  69. for (String replaceStr : PATH_REPLACE_ARRAY) {
  70. resultStr = resultStr.replace(replaceStr, "");
  71. }
  72. return resultStr;
  73. }
  74. }

题外话:

typeAliasesPackage配置路径下的domain中可以添加@org.apache.ibatis.type.Alias(value = "user")注解;如果添加此注解,则别名使用此注解所指定的名称。如果没有配置,则默认为类名首字母小写。

http://blog.csdn.net/wsmalltiger/article/details/41825375

mybaits3.2.8 别名包扫描通配符的更多相关文章

  1. Mybatis 自定义SqlSessionFactoryBean扫描通配符typeAliasesPackage

    typeAliasesPackage 默认只能扫描某一个路径下,或以逗号等分割的 几个路径下的内容,不支持通配符和正则,采用重写的方式解决 package com.xxxx.xxx.util.comm ...

  2. spring整合mybatis错误:class path resource [config/spring/springmvc.xml] cannot be opened because it does not exist

    spring 整合Mybatis 运行环境:jdk1.7.0_17+tomcat 7 + spring:3.2.0 +mybatis:3.2.7+ eclipse 错误:class path reso ...

  3. Mybatis从认识到了解

    目录 MyBatis的介绍 介绍: 为什么选择MyBatis: 与Hibernate的对比: MyBatis的优点: 入门示例 Mybatis核心组件 四大核心组件 SqlSessionFactory ...

  4. Mybatis-spring 动态代理

    1.UserMapper.java package com.cn.mapper; import java.util.List; import com.cn.pojo.User; public inte ...

  5. Mybatis-spring 传统dao开发

    jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?chara ...

  6. ssm学习的第一个demo---crm(1)

    这是一个普通的CRM项目 (第一步规划好项目设计路线:导入jar包→配置sqlMapConfig.xml(空文件)→配置applicationContext.xml →配置springMVC.xml→ ...

  7. SpringMVC+Spring+MyBatis 整合与图片上传简单示例

    一.思路: (一) Dao层: 1. SqlMapConfig.xml,空文件即可.需要文件头.2. applicationContext_dao.xml. a) 数据库连接池b) SqlSessio ...

  8. Mybatis和Spring整合&逆向工程

    Mybatis和Spring整合&逆向工程Mybatis和Spring整合mybatis整合Spring的思路目的就是将在SqlMapConfig.xml中的配置移植到Spring的appli ...

  9. SpringMVC-Mybatis整合和注解开发

    SpringMVC-Mybatis整合和注解开发SpringMVC-Mybatis整合整合的思路在mybatis和spring整合的基础上 添加springmvc.spring要管理springmvc ...

随机推荐

  1. 第一个完整的cppunit单元测试程序

    在极限编程中,测试程序本应该在编写主程序之前就要写好,然后将写好的类程序放在测试程序中进行测试,但考虑到项目中需求文档等并未将接口定义好,我无从开始,而且,自己对单元测试也是刚刚熟悉,需要一边写测试程 ...

  2. 设置 Eclipse 智能代码提示,大幅度减少 alt+/ 使用频率,打每个字都出现代码提示的办法

    以前网上有个英文版本的,现在自己汉化一下...O(∩_∩)O 哈哈 ~   http://www.cnblogs.com/lidabo/archive/2013/03/05/2944245.html ...

  3. html5 drag api详解

    可以夸张点说,如果你不会拖拽,你不是一个合格的前端开发. 回想下,以前我们是怎么实现拖拽的,主要有以下几步: 1.目标元素绑定mousedown事件,记录下此时鼠标位置和拖拽元素的位置差,分别是 di ...

  4. 【UOJ Easy Round #2】

    然而UER我也照样跪…… 第一题 忘了取模sad || 操作符将整个区间分成了一些段,每个手机只会执行其中某一段,执行次数为这一段中&&的个数?+1? ans=ans*num[i]+1 ...

  5. 【BZOJ】【1034】【ZJOI2008】泡泡堂BNB

    贪心 类似田忌赛马策略的一个贪心= = 随便YY了一个做法居然A了…… 简单来说就是先强对强,弱对弱,能赢就赢,不能赢就让弱的那个去对强的那个,剩下的人继续依次捉对比赛(继续刚刚的策略),现在人数还是 ...

  6. 女性社区TOP10

    “女性和孩子的钱是世界上最好赚的”并不是一句空话.据统计,女性掌管着家庭70%的支出,如果你能让女性为你掏出腰包,那么你基本就掌控了一个家庭的大部分的消费. 有趣的是,女性还是一个喜欢分享的群体,他们 ...

  7. 关于High-Resolution Timer(了解)

    如果一个系统包含高精度性能计数器(HRPC,high-resolution performance counter)则此系统提供高精度定时器.你可以使用API函数QueryPerformanceFre ...

  8. IE如何兼容placeholder属性

    在前端开发中,经常需要为input设置placeholder属性,但是placeholder是HTML5新属性,在IE10以下不兼容,那么如何完美兼容呢? 网上搜索了一下,其实也挺简单的,可以采用以下 ...

  9. Java 性能要点:自动装箱/ 拆箱 (Autoboxing / Unboxing)

    [编者按]本文作者为 Ali Kemal TASCI,最早于2016年4月9日发布于DZONE社区.文章主要介绍通过改进 Java 1.5 就已存在的骨灰级特性大幅度提高应用性能. 本文系 OneAP ...

  10. Ruby中的Profiling工具

    看看如何调试Ruby的性能问题 李哲 - APRIL 08, 2015 Ruby内置的profiler 内置的profiler实现的很简单,在ruby2.2中只有150行代码,大家可以看看它的实现pr ...