`
mr_gxxy
  • 浏览: 3834 次
  • 性别: Icon_minigender_1
  • 来自: 襄阳
社区版块
存档分类
最新评论

spring mvc sql xml配置

阅读更多
package com.gepower.repair.dao.common;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.StringUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 
 * @author  
 * 
 * An Abstract super class for all DAO's.
 * Class provide all common method used in the DAO, like loading the sql resources and setting the hibernate template
 * 
 */
public abstract class AbstaractJDBCTemplate extends JdbcDaoSupport{

	protected static final Logger LOG = Logger.getLogger(AbstaractJDBCTemplate.class);
	private Map<String, String> sqlMap;
	
	//@Resource(name = "sessionFactory")
	
//	@Autowired
//	public void setSuperSessionFactory(SessionFactory sessionFactory) {
//		//super.setSessionFactory(sessionFactory);
//	}
	/** Static block, no changes required for any thread. */
	private static XPathExpression expr;
	private static DocumentBuilder docBuilder;
	static  {
		expr = null;
		docBuilder = null;
		
		 try {
			LOG.info("BaseDAO static initializer");
			LOG.info("\tacquiring document builder...");
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			// dbf.setValidating(true);
			docBuilder = dbf.newDocumentBuilder();

			LOG.info("\tinstalling XPathExpression...");
			XPathFactory xpf = XPathFactory.newInstance();
			XPath xpath = xpf.newXPath();
			expr = xpath.compile("//sql");
		} catch (ParserConfigurationException e) {
			LOG.fatal(e);
		} catch (XPathExpressionException e) {
			LOG.fatal(e);
		}
	}


	/**
	 * getting the SQL from the xml file 
	 * @return the sql xml file
	 */
	protected String[] getSqlXml() {
		SqlSource sqlXml = getClass().getAnnotation(SqlSource.class);
		String[] result = null;
		if (sqlXml != null) {
			result = sqlXml.value();
		}
		return result;
	}

	/**
	 * load the sql content
	 */
	private void loadSqls() {
		if (sqlMap != null && !sqlMap.isEmpty() ) {
			throw new IllegalStateException(
					"loadSqls() already be invoked before!");
		}
		LOG.info("sqlMap ---->"  + sqlMap);
		sqlMap = new HashMap<String, String>();
		
		String[] sqlXml = getSqlXml();
		if (sqlXml == null || sqlXml.length == 0) {
			LOG.warn("no sqlXml file specified in this DAO.");
			return;
		}
		for (String location : sqlXml) {
			loadSqlFrom(location);
		}
		dumpLoadedSqls();
	}

	/**
	 * get the sql xml file from the path
	 * 
	 * @param location
	 *            the file path
	 */
	private final void loadSqlFrom(final String location) {
		if (LOG.isDebugEnabled()) {
			LOG.debug("try to loading sql from: " + location);
		}
		final URL xmlURL = AbstaractJDBCTemplate.class.getResource(location);
		if (xmlURL == null) {
			LOG.error(location + " can not be found in the classpath.");
			return;
		}
		InputStream instream = null;
		NodeList sqls = null;
		try {
			
			instream = xmlURL.openStream();
			synchronized(this){
				Document doc = docBuilder.parse(instream);
				sqls = (NodeList) expr.evaluate(doc,
						XPathConstants.NODESET);
				if (sqls == null || sqls.getLength() == 0) {
					LOG.warn("no <sql> elements can be found in the xml - "
							+ location);
					return;
				}
			}
			
			Element elm = null;
			String id = null;
			String sql = null;
			for (int i = 0; i < sqls.getLength(); i++) {
				elm = (Element) sqls.item(i);
				sql = elm.getTextContent();
				id = elm.getAttribute("id");
				if (!StringUtils.hasText(id) || !StringUtils.hasText(sql)) {
					LOG.warn("id or sql content is empty, ignore the entry.\nid:"
							+ id + "\nsql: " + sql);
					continue;
				}
				sqlMap.put(id.trim(), shrink(sql));
			}
		} catch (IOException e) {
			LOG.fatal("error", e);
		} catch (SAXException e) {
			LOG.fatal("error", e);
		} catch (XPathExpressionException e) {
			LOG.fatal("error", e);
		} finally {
			if (instream != null) {
				try {
					instream.close();
				} catch (IOException e) {
					LOG.warn(e);
				}
			}
		}
	}

	/**
	 * 
	 * @return return the sqls content
	 */
	protected String dumpLoadedSqls() {
		StringBuilder buf = new StringBuilder();
		Map.Entry<String, String> entry = null;
		Iterator<Map.Entry<String, String>> iter = null;
		for (iter = sqlMap.entrySet().iterator(); iter.hasNext();) {
			entry = iter.next();
			buf.append(entry.getKey());
			buf.append("\t => ");
			buf.append(trimToLine(entry.getValue()));
			buf.append("\r\n");
		}
		LOG.debug("Loaded Sqls:\n" + buf.toString());
		return buf.toString();
	}

	/**
	 * 
	 * @param sqlId
	 *            the sql id
	 * @return return the related query by the sql id
	 */
	protected String getSql(String sqlId) {
		LOG.info("sqlId -->" + sqlId);
		if (!StringUtils.hasText(sqlId)) {
			throw new IllegalArgumentException("invalid sqlId: " + sqlId);
		}
		if (sqlMap == null) {
			loadSqls();
		}
		if(sqlMap.isEmpty()){
			LOG.info("===========================----sqlMap is Empty");
			loadSqls();
		}
		String sql =sqlMap.get(sqlId);
		LOG.info("SQL : " + sql);
		return sql;
	}

	/**
	 * 
	 * @return return the query
	 */
	protected String getSql() {
		StackTraceElement stackTrace = null;
		try {
			boolean flag = true;
			if (flag) {
				throw new IllegalArgumentException();
			}
		} catch (IllegalArgumentException e) {
			stackTrace = e.getStackTrace()[1];
		}
		return stackTrace != null ? getSql(stackTrace.getMethodName()) : null;
	}

	/**
	 * 
	 * @param str
	 *            the query content
	 * @return return the query
	 */
	private static String trimToLine(final String str) {
		if (null == str) {
			return str;
		}
		return str.replace("\n", "").replace("\r", "").trim();
	}

	private static String shrink(String input) {
		if (input == null || input.equals("")) {
			return input;
		}
		return input.replaceAll("[\\r\\n\\s]+", " ").trim();
	}
}



 
package com.gepower.repair.dao.common;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Defining an annotation 
 * @author  
 *
 */

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SqlSource {
	String[] value() default "/sql.xml";
}

Dao 
@SqlSource("/resources/sql/calculatecatalogcost-sql.xml")

sql xml文件
<sqls>
	<sql id="findCatalogServices">
	</sql>
</sqls>

 

分享到:
评论

相关推荐

    项目配置文件( spring-mvc.xml spring-mybatis.xml web.xml log4j.properties)

    这里提到的四个关键配置文件——`spring-mvc.xml`、`spring-mybatis.xml`、`web.xml`以及`log4j.properties`,对于一个基于Java的Web应用来说至关重要,特别是使用Spring MVC和MyBatis框架的时候。接下来,我们将...

    spring+spring mvc+mybatis配置Demo

    在`web.xml`中,我们需要配置DispatcherServlet,它是Spring MVC的核心控制器,负责接收请求并转发给相应的处理器。同时,还需要配置视图解析器,如InternalResourceViewResolver,来处理返回的视图名称。 然后,...

    Spring mvc整合mybatis例子

    通过XML配置或注解方式定义SQL语句,MyBatis能自动将结果集映射到Java对象,极大地提高了开发效率。 3. **整合步骤** - **配置Spring MVC** 首先,我们需要创建Spring MVC的配置文件,比如`spring-mvc.xml`,其中...

    SSM整合配置文件、spring-mvc.xml、spring-mybatis.xml、spring.xml、config.properties、log4j.p

    config.properties:数据库配置文件 log4j.properties:mybatis日志文件 spring-mvc.xml:spring-MVC配置文件 spring-mybatis.xml:mybatis的配置文件 spring.xml

    Spring MVC + Mybatis+Spring实现的个人博客系统

    Mybatis允许开发者编写SQL语句,通过XML配置文件或注解将SQL与Java代码绑定,从而实现了DAO层的简单易用。它提供了强大的动态SQL功能,可以方便地处理复杂的查询和更新操作。 **3. Spring框架** Spring是Java企业级...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    - 创建MyBatis的Mapper接口和XML配置文件,定义SQL查询和操作。 - 在Spring MVC的Controller中,通过@Autowired注入Mapper接口,调用其方法进行数据操作。 4. **数据库脚本** - 提供的数据库脚本通常包含创建表...

    SSM框架的配置搭建 spring、 spring mvc、 mybatis 整合详解

    4. **配置Spring MVC**:创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析器(如InternalResourceViewResolver)、拦截器等。 5. **配置MyBatis**:编写MyBatis的全局配置文件...

    Spring MVC+ Spring+ Mybatis 框架搭建

    这个案例可能包括了Spring MVC的Controller,Spring的配置文件,Mybatis的Mapper和XML文件,以及数据库相关的配置。通过分析这些文件,初学者可以了解SSM框架的基本结构和使用方法,例如请求处理、服务层调用、...

    spring mvc+ibats实例

    在本实例中,iBatis可能是通过XML配置文件或注解方式与Spring MVC集成,实现数据访问层的事务管理和依赖注入。 3. Maven: Maven是Java项目管理工具,用于构建、依赖管理和项目信息管理。`pom.xml`文件是Maven的...

    spring mvc demo

    5. 集成 Spring MVC:在 Spring MVC 的配置文件(如:servlet-context.xml)中,配置 DispatcherServlet、ViewResolver、MVC 配置等。同时,使用 @Controller 注解创建 Controller 类,处理 HTTP 请求,并调用 ...

    spring mvc mybatis 整合 maven

    3. 配置 Spring MVC:创建Spring的配置文件(如:applicationContext.xml),配置DispatcherServlet,定义视图解析器(比如:InternalResourceViewResolver),并配置Spring MVC的组件扫描。 4. 配置 MyBatis:创建...

    Spring mvc + Spring + Mybatis 整合demo

    3. **配置Spring MVC**:创建Spring MVC的配置文件(如`servlet-context.xml`),配置DispatcherServlet,声明视图解析器,定义拦截器,以及处理器映射器和处理器适配器。 4. **配置Mybatis**:编写Mybatis的全局...

    Spring MVC整合Mybatis

    - **配置Spring MVC**:在Spring MVC的配置文件中,配置HandlerMapping和HandlerAdapter,以处理Controller的请求。 - **创建Controller**:编写Spring MVC的Controller,调用Service层的方法处理业务逻辑。 - **...

    Spring MVC与MYBatis企业应用实战.pdf

    - 定义MYBatis的Mapper接口和XML配置文件,实现SQL语句的动态编写。 - 实现Service层,通过@Autowired注解注入DAO层,调用业务方法。 - 使用ModelAndView或者ModelAndView和Thymeleaf/FreeMarker等模板引擎展示...

    简单的Spring MVC(含sql文件)(sql server 2008)

    在这个项目中,我们看到"简单的Spring MVC"应用结合了JDBC(Java Database Connectivity)和数据库连接池,使用的是SQL Server 2008作为数据库。 **JDBC与数据库连接池** JDBC是Java中用于访问数据库的标准API,它...

    Spring+Spring MVC+Spring JDBC+MySql实现简单登录注册

    5. **配置文件**:项目中的配置文件(可能在`config`目录下)包括Spring的bean配置文件(如`applicationContext.xml`)和Spring MVC的配置文件(如`servlet-context.xml`)。这些文件定义了Bean的实例化、依赖关系...

    Spring+mvc+mybatis Mapper xml自动加载

    "Spring+mvc+mybatis Mapper xml自动加载"这个主题聚焦于如何在开发过程中优化配置,使得改动Mapper XML文件后,无需重启Tomcat服务器,就可以立即生效,从而提高开发效率。 Spring MVC是Spring框架的一部分,它...

    Spring MVC简单例子

    8. **配置文件**:理解Spring MVC的配置文件,如`servlet-context.xml`,它定义了Spring MVC的组件,如视图解析器、HandlerMapping和HandlerAdapter等。 9. **Maven或者Gradle构建**:项目可能使用Maven或Gradle...

    spring mvc mysql hibernate

    例如,Spring的配置文件(如applicationContext.xml或spring-servlet.xml)会定义Spring MVC的bean和依赖注入;Hibernate的配置文件(hibernate.cfg.xml)会设置数据库连接信息和实体映射;数据库脚本(可能是.sql...

    spring-spring mvc-mybaties整合dome

    6. **单元测试和集成测试**:编写测试用例以验证每个组件的正确性,包括MyBatis的SQL执行、Spring的依赖注入以及Spring MVC的请求处理流程。 在“school”这个文件夹中,可能包含了一个关于学校管理系统的示例,...

Global site tag (gtag.js) - Google Analytics