最近做项目,要求<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。
由于水平有限,只能改源代码如上,大家有什么改进或者优化之类的,可以继续修改,大家共同学习,共同进步
分享到:
相关推荐
标题中提到的“常用ibatis配置”指的是在使用iBatis这一数据持久层框架中,常见的配置用法和技术点。iBatis(现称为MyBatis)是一个流行的Java持久层框架,它通过使用XML或注解的方式,将SQL语句与对象进行映射,...
本篇文章将深入探讨Ibatis SqlMap在2.3.0版本中对通配符的支持,帮助开发者更好地理解和利用这一特性。 SqlMap是Ibatis的核心组件,它负责管理和执行SQL语句。在处理动态SQL时,有时我们需要在查询条件中使用通配符...
首先,你需要配置iBatis的核心文件`sqlmapconfig.xml`,在这个文件中,你会定义数据源、事务管理器以及你的SQL映射文件的位置。数据源定义了如何连接到数据库,而SQL映射文件则包含了具体的SQL语句。 然后,创建一...
#### 二、iBATIS配置文件详解 iBATIS的配置文件主要通过XML格式来定义,其中包含了全局设置、事务管理器、数据源等关键组件的配置。 ##### 2.1 配置文件结构 ```xml <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis....
同时,Ibatis 还支持自动生成主键,方便插入新记录时获取唯一标识。 总的来说,传智播客的 Ibatis 讲义旨在帮助初学者掌握 Ibatis 的基本用法和配置,包括数据库连接、事务管理、SQL 映射和实体类的交互。通过学习...
Ibatis通过XML或注解的方式配置和映射SQL,使数据库操作更加简洁。 2. **MySQL数据库**: MySQL是一个开源的关系型数据库管理系统,广泛应用于Web应用中。它的特点是速度快、稳定性好、易于维护。在"ibatisDemo"中,...
在IT行业中,数据库操作是应用程序开发的核心部分...总的来说,Ibatis通过简单的配置和直观的API,极大地简化了Java应用中的数据库操作。无论是新手还是经验丰富的开发者,都能从中受益,快速高效地完成数据交互任务。
除此之外,iBatis还支持更复杂的动态SQL,例如`if`, `choose`, `when`, `otherwise`, `where`, `trim`, `foreach`等元素,可以根据不同的条件构造SQL语句。通过熟练掌握这些元素,你可以编写出灵活且易于维护的查询...
Ibatis,全称为MyBatis,是一个支持定制化SQL、存储过程以及高级映射的Java持久层框架。它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Ibatis使得开发者能够将注意力集中在使用SQL来编写业务逻辑上,而...
iBATIS本身是一个优秀的轻量级数据访问框架,它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java代码的分离,提高了可维护性和灵活性。而iBATOR则是iBATIS的扩展,它通过简单的配置,可以根据数据库中的...
- **Resource通配符路径:** 支持使用通配符来匹配多个文件资源。 ### 四、Spring表达式语言(SpEL) SpEL是一种强大的表达式语言,可以用来执行运算、属性访问等操作。 - **SpEL基础:** 了解SpEL的基本语法和...
对于使用SSH(Struts + Spring + Hibernate)和SSI(Struts + Spring + iBatis)等框架的应用程序而言,合理的`web.xml`配置至关重要。本文将详细介绍`web.xml`中的关键配置项,并解释其作用。 #### 一、`web.xml`...
这时,applicationContext-*.xml 采用通配符,可以载入多个 xml 文件,例如applicationContext-ibatis-base.xml、applicationContext-action.xml、applicationContext-ibatis-dao.xml 等文件。 最后,...
这些实体类通常使用了MyBatis的注解或Ibatis的XML配置,便于在业务代码中进行数据绑定。 在实际应用中,MyBatis逆向工程可以显著减少手动编写代码的工作量,特别是在数据库表结构复杂或者需要频繁更新的情况下。...
5. **持久层代码**:可能是Hibernate或iBatis的配置和映射文件,用于与数据库交互。 6. **拦截器类**:自定义拦截器可以扩展Struts2的功能,例如登录验证、日志记录等。 7. **资源文件**:如properties文件,用于...
- **对ORM的支持**:支持主流ORM框架的集成,如Hibernate、iBatis等。提供了一些辅助类,如LocalSessionFactoryBean,用于简化与ORM框架的集成。 ### Spring MVC Spring MVC是一个基于Servlet API的MVC框架,用于...
8.1节概述对ORM的支持,8.2节介绍如何集成Hibernate3,8.3节介绍如何集成iBATIS,8.4节介绍如何集成JPA(Java Persistence API)。 【第九章】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里更为简单的声明性事务配置 ...
4.7.2. Application context构造器中资源路径的通配符 4.7.3. FileSystemResource 提示 5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到...
ibator是iBatis的增强版,它是MyBatis的前身,后来发展为MyBatis Generator(MBG)。在这个压缩包文件IbatorForEclipse1.2.1中,包含的主要是ibator插件的相关内容以及ibator的配置文件。 首先,ibator插件是集成在...