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`,对于一个基于Java的Web应用来说至关重要,特别是使用Spring MVC和MyBatis框架的时候。接下来,我们将...
在`web.xml`中,我们需要配置DispatcherServlet,它是Spring MVC的核心控制器,负责接收请求并转发给相应的处理器。同时,还需要配置视图解析器,如InternalResourceViewResolver,来处理返回的视图名称。 然后,...
通过XML配置或注解方式定义SQL语句,MyBatis能自动将结果集映射到Java对象,极大地提高了开发效率。 3. **整合步骤** - **配置Spring MVC** 首先,我们需要创建Spring MVC的配置文件,比如`spring-mvc.xml`,其中...
config.properties:数据库配置文件 log4j.properties:mybatis日志文件 spring-mvc.xml:spring-MVC配置文件 spring-mybatis.xml:mybatis的配置文件 spring.xml
Mybatis允许开发者编写SQL语句,通过XML配置文件或注解将SQL与Java代码绑定,从而实现了DAO层的简单易用。它提供了强大的动态SQL功能,可以方便地处理复杂的查询和更新操作。 **3. Spring框架** Spring是Java企业级...
- 创建MyBatis的Mapper接口和XML配置文件,定义SQL查询和操作。 - 在Spring MVC的Controller中,通过@Autowired注入Mapper接口,调用其方法进行数据操作。 4. **数据库脚本** - 提供的数据库脚本通常包含创建表...
4. **配置Spring MVC**:创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析器(如InternalResourceViewResolver)、拦截器等。 5. **配置MyBatis**:编写MyBatis的全局配置文件...
这个案例可能包括了Spring MVC的Controller,Spring的配置文件,Mybatis的Mapper和XML文件,以及数据库相关的配置。通过分析这些文件,初学者可以了解SSM框架的基本结构和使用方法,例如请求处理、服务层调用、...
在本实例中,iBatis可能是通过XML配置文件或注解方式与Spring MVC集成,实现数据访问层的事务管理和依赖注入。 3. Maven: Maven是Java项目管理工具,用于构建、依赖管理和项目信息管理。`pom.xml`文件是Maven的...
5. 集成 Spring MVC:在 Spring MVC 的配置文件(如:servlet-context.xml)中,配置 DispatcherServlet、ViewResolver、MVC 配置等。同时,使用 @Controller 注解创建 Controller 类,处理 HTTP 请求,并调用 ...
3. 配置 Spring MVC:创建Spring的配置文件(如:applicationContext.xml),配置DispatcherServlet,定义视图解析器(比如:InternalResourceViewResolver),并配置Spring MVC的组件扫描。 4. 配置 MyBatis:创建...
3. **配置Spring MVC**:创建Spring MVC的配置文件(如`servlet-context.xml`),配置DispatcherServlet,声明视图解析器,定义拦截器,以及处理器映射器和处理器适配器。 4. **配置Mybatis**:编写Mybatis的全局...
- **配置Spring MVC**:在Spring MVC的配置文件中,配置HandlerMapping和HandlerAdapter,以处理Controller的请求。 - **创建Controller**:编写Spring MVC的Controller,调用Service层的方法处理业务逻辑。 - **...
- 定义MYBatis的Mapper接口和XML配置文件,实现SQL语句的动态编写。 - 实现Service层,通过@Autowired注解注入DAO层,调用业务方法。 - 使用ModelAndView或者ModelAndView和Thymeleaf/FreeMarker等模板引擎展示...
在这个项目中,我们看到"简单的Spring MVC"应用结合了JDBC(Java Database Connectivity)和数据库连接池,使用的是SQL Server 2008作为数据库。 **JDBC与数据库连接池** JDBC是Java中用于访问数据库的标准API,它...
5. **配置文件**:项目中的配置文件(可能在`config`目录下)包括Spring的bean配置文件(如`applicationContext.xml`)和Spring MVC的配置文件(如`servlet-context.xml`)。这些文件定义了Bean的实例化、依赖关系...
"Spring+mvc+mybatis Mapper xml自动加载"这个主题聚焦于如何在开发过程中优化配置,使得改动Mapper XML文件后,无需重启Tomcat服务器,就可以立即生效,从而提高开发效率。 Spring MVC是Spring框架的一部分,它...
8. **配置文件**:理解Spring MVC的配置文件,如`servlet-context.xml`,它定义了Spring MVC的组件,如视图解析器、HandlerMapping和HandlerAdapter等。 9. **Maven或者Gradle构建**:项目可能使用Maven或Gradle...
例如,Spring的配置文件(如applicationContext.xml或spring-servlet.xml)会定义Spring MVC的bean和依赖注入;Hibernate的配置文件(hibernate.cfg.xml)会设置数据库连接信息和实体映射;数据库脚本(可能是.sql...
6. **单元测试和集成测试**:编写测试用例以验证每个组件的正确性,包括MyBatis的SQL执行、Spring的依赖注入以及Spring MVC的请求处理流程。 在“school”这个文件夹中,可能包含了一个关于学校管理系统的示例,...