`
lwj0212
  • 浏览: 49642 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis配置支持通配符

阅读更多
最近做项目,要求<sqlMap resource="">支持通配符,翻了翻ibatis的源码,修改了原来的类com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser 的addSqlMapNodelets()方法,
可以像这样
<sqlMap resource="classpath*:com/liwj/example/ibatis/sql/*.xml" />
来配置
原方法源码如下
parser.addNodelet("/sqlMapConfig/sqlMap", new Nodelet() {
      public void process(Node node) throws Exception {
        vars.errorCtx.setActivity("loading the SQL Map resource");

        Properties attributes = NodeletUtils.parseAttributes(node, vars.properties);

        String resource = attributes.getProperty("resource");
        String url = attributes.getProperty("url");

        if (usingStreams) {
          InputStream inputStream = null;
          if (resource != null) {
            vars.errorCtx.setResource(resource);
            inputStream = Resources.getResourceAsStream(resource);
          } else if (url != null) {
            vars.errorCtx.setResource(url);
            inputStream = Resources.getUrlAsStream(url);
          } else {
            throw new SqlMapException("The <sqlMap> element requires either a resource or a url attribute.");
          }

          if (vars.sqlMapConv != null) {
            inputStream = vars.sqlMapConv.convertXml(inputStream);
          }
          new SqlMapParser(vars).parse(inputStream);
        } else {
          Reader reader = null;
          if (resource != null) {
            vars.errorCtx.setResource(resource);
            reader = Resources.getResourceAsReader(resource);
          } else if (url != null) {
            vars.errorCtx.setResource(url);
            reader = Resources.getUrlAsReader(url);
          } else {
            throw new SqlMapException("The <sqlMap> element requires either a resource or a url attribute.");
          }

          if (vars.sqlMapConv != null) {
            reader = vars.sqlMapConv.convertXml(reader);
          }
          new SqlMapParser(vars).parse(reader);
        }
      }
    });

针对此方法,修改后的代为如下
  private class ResourceUtil extends PathMatchingResourcePatternResolver{
	  protected String determineRootDir(String arg0) {
			// TODO Auto-generated method stub
			String rootDir= super.determineRootDir(arg0);
			if(rootDir.startsWith(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX));
				rootDir=rootDir.substring(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX.length());
				
			return rootDir;
	  }
  }
  protected String[] getAllResource(String resource){
	  String[] file_resource=null;
	  ResourceLoader resourceLoader=new PathMatchingResourcePatternResolver();
	  try{
		  Resource[]  a_resource=((ResourcePatternResolver) resourceLoader).getResources(resource);
		  ResourceUtil resourceUtil=new ResourceUtil();
		  String rootDir=resourceUtil.determineRootDir(resource);
		  if(a_resource!=null){
			  file_resource=new String[a_resource.length];
			  for(int i=0;i<a_resource.length;i++){
				  file_resource[i]=rootDir+"/"+a_resource[i].getFilename();
				  System.out.println("fileName="+file_resource[i]);
			  }
		  }
	  }catch(IOException e){
		 throw new SqlMapException("The <sqlMap> element requires either a resource or a url attribute.");
	  }
	  return file_resource;
  }
  protected void addSqlMapNodelets() {
    parser.addNodelet("/sqlMapConfig/sqlMap", new Nodelet() {
      public void process(Node node) throws Exception {
        vars.errorCtx.setActivity("loading the SQL Map resource");

        Properties attributes = NodeletUtils.parseAttributes(node, vars.properties);

        String resource = attributes.getProperty("resource");
        String url = attributes.getProperty("url");
        if(resource.indexOf("*")>0){
        	String[] files=getAllResource(resource);
        	for(int i=0;i<files.length;i++){
        		addSqlMapConfigFiles(files[i], url);
        	}
        }else{
        	addSqlMapConfigFiles(resource, url);
        }
      }

代码中使用了spring的PathMatchingResourcePatternResolver类来分析带有通配符的resource的值。由于PathMatchingResourcePatternResolver.determineRootDir方法是protected,故写了内部类继承PathMatchingResourcePatternResolver。

由于水平有限,只能改源代码如上,大家有什么改进或者优化之类的,可以继续修改,大家共同学习,共同进步
分享到:
评论
7 楼 cucumber 2008-10-17  
2.3.3配合spring2.5.5可以默认支持了
6 楼 FAT0708 2008-09-19  
iBATIS引入SqlMap的顺序,被引入的片段,要优先于欲引入的sql部分被导入。
单纯做通配好像不太好吧。
5 楼 超级潜水员 2008-09-18  
如果是使用spring 2.5.5,直接使用
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="mappingLocations">
        	<value>classpath:/org/company/demo/model/**/*SqlMap.xml</value>
        </property>
    </bean>

就行了。
4 楼 FAT0708 2008-09-18  
cnpollux 写道
比如一个SqlMap xml文件依赖于另外一个xml文件时,会如何处理呢?

我也想知道这个。
3 楼 cnpollux 2008-03-27  
比如一个SqlMap xml文件依赖于另外一个xml文件时,会如何处理呢?
2 楼 宏基小键盘 2008-03-26  
挺不错的,挺不错的。
1 楼 elice 2008-03-26  
是啊,有问题就看别人的源码就可以了

相关推荐

    常用ibatis配置

    标题中提到的“常用ibatis配置”指的是在使用iBatis这一数据持久层框架中,常见的配置用法和技术点。iBatis(现称为MyBatis)是一个流行的Java持久层框架,它通过使用XML或注解的方式,将SQL语句与对象进行映射,...

    ibatis-sqlmap-2.3.0中sqlmap支持通配符

    本篇文章将深入探讨Ibatis SqlMap在2.3.0版本中对通配符的支持,帮助开发者更好地理解和利用这一特性。 SqlMap是Ibatis的核心组件,它负责管理和执行SQL语句。在处理动态SQL时,有时我们需要在查询条件中使用通配符...

    IBatis完成单表基本的数据库操作 模糊查询

    首先,你需要配置iBatis的核心文件`sqlmapconfig.xml`,在这个文件中,你会定义数据源、事务管理器以及你的SQL映射文件的位置。数据源定义了如何连接到数据库,而SQL映射文件则包含了具体的SQL语句。 然后,创建一...

    操作数据库 iBATIS查询

    #### 二、iBATIS配置文件详解 iBATIS的配置文件主要通过XML格式来定义,其中包含了全局设置、事务管理器、数据源等关键组件的配置。 ##### 2.1 配置文件结构 ```xml &lt;!DOCTYPE sqlMapConfig PUBLIC "-//ibatis....

    传智播客 ibatis 讲义 word版

    同时,Ibatis 还支持自动生成主键,方便插入新记录时获取唯一标识。 总的来说,传智播客的 Ibatis 讲义旨在帮助初学者掌握 Ibatis 的基本用法和配置,包括数据库连接、事务管理、SQL 映射和实体类的交互。通过学习...

    ibatisDemo

    Ibatis通过XML或注解的方式配置和映射SQL,使数据库操作更加简洁。 2. **MySQL数据库**: MySQL是一个开源的关系型数据库管理系统,广泛应用于Web应用中。它的特点是速度快、稳定性好、易于维护。在"ibatisDemo"中,...

    ibatis增删查改实现

    在IT行业中,数据库操作是应用程序开发的核心部分...总的来说,Ibatis通过简单的配置和直观的API,极大地简化了Java应用中的数据库操作。无论是新手还是经验丰富的开发者,都能从中受益,快速高效地完成数据交互任务。

    07_ibatis教程_模糊查询实体对象.zip

    除此之外,iBatis还支持更复杂的动态SQL,例如`if`, `choose`, `when`, `otherwise`, `where`, `trim`, `foreach`等元素,可以根据不同的条件构造SQL语句。通过熟练掌握这些元素,你可以编写出灵活且易于维护的查询...

    07_ibatis教程_模糊查询实体对象.rar )

    Ibatis,全称为MyBatis,是一个支持定制化SQL、存储过程以及高级映射的Java持久层框架。它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Ibatis使得开发者能够将注意力集中在使用SQL来编写业务逻辑上,而...

    iBATOR-V1.1.0

    iBATIS本身是一个优秀的轻量级数据访问框架,它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java代码的分离,提高了可维护性和灵活性。而iBATOR则是iBATIS的扩展,它通过简单的配置,可以根据数据库中的...

    跟我学Spring系列1

    - **Resource通配符路径:** 支持使用通配符来匹配多个文件资源。 ### 四、Spring表达式语言(SpEL) SpEL是一种强大的表达式语言,可以用来执行运算、属性访问等操作。 - **SpEL基础:** 了解SpEL的基本语法和...

    SSH和SSI等框架常用基础配置web.xml

    对于使用SSH(Struts + Spring + Hibernate)和SSI(Struts + Spring + iBatis)等框架的应用程序而言,合理的`web.xml`配置至关重要。本文将详细介绍`web.xml`中的关键配置项,并解释其作用。 #### 一、`web.xml`...

    Spring的监听器ContextLoaderListener的作用

    这时,applicationContext-*.xml 采用通配符,可以载入多个 xml 文件,例如applicationContext-ibatis-base.xml、applicationContext-action.xml、applicationContext-ibatis-dao.xml 等文件。 最后,...

    mybatis逆向工程.zip

    这些实体类通常使用了MyBatis的注解或Ibatis的XML配置,便于在业务代码中进行数据绑定。 在实际应用中,MyBatis逆向工程可以显著减少手动编写代码的工作量,特别是在数据库表结构复杂或者需要频繁更新的情况下。...

    struts2留存小demo

    5. **持久层代码**:可能是Hibernate或iBatis的配置和映射文件,用于与数据库交互。 6. **拦截器类**:自定义拦截器可以扩展Struts2的功能,例如登录验证、日志记录等。 7. **资源文件**:如properties文件,用于...

    Spring杂谈

    - **对ORM的支持**:支持主流ORM框架的集成,如Hibernate、iBatis等。提供了一些辅助类,如LocalSessionFactoryBean,用于简化与ORM框架的集成。 ### Spring MVC Spring MVC是一个基于Servlet API的MVC框架,用于...

    跟我学spring

    8.1节概述对ORM的支持,8.2节介绍如何集成Hibernate3,8.3节介绍如何集成iBATIS,8.4节介绍如何集成JPA(Java Persistence API)。 【第九章】Spring的事务管理。事务是数据库管理系统执行过程中的一个逻辑单位,由...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 ...

    spring chm文档

    4.7.2. Application context构造器中资源路径的通配符 4.7.3. FileSystemResource 提示 5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到...

    ibator插件+ibatorConfig文件

    ibator是iBatis的增强版,它是MyBatis的前身,后来发展为MyBatis Generator(MBG)。在这个压缩包文件IbatorForEclipse1.2.1中,包含的主要是ibator插件的相关内容以及ibator的配置文件。 首先,ibator插件是集成在...

Global site tag (gtag.js) - Google Analytics