`

Hibernate+Spring+JDBC+Freemarker

阅读更多
今天看到《银行主数据项目(MDM)的数据持久层,你选择hibernate还是ibatis(MyBatis)》跑到首页来了, 把我最近使用方式分享一下。Hiberante+(Spring JDBC + freemarker)两次结合,hibernate对简单的数据操作很方便,可以大量减少SQL语句的维护。对于复杂的sql和性能考虑使用Spring JDBC + freemarker,动态生成SQL。不使用hiberante的二级缓存,在业务层面进行数据缓存。

SQL标签tempateType值;simple和freeMarker, simple直接按照spring jdbc template方式书写。

使用freemarker 可以很好的解决in参数的问题。

StarFlow之前使用了mybatis,最近替换成了spring jdbc.月底会发布0.7版本。
Java代码 复制代码 收藏代码
  1. public class CustomSQL {
  2. private static Logger logger = LoggerFactory.getLogger(CustomSQL.class);
  3. private Map<String, SQLBean> _sqlPool;
  4. private static final String GROUP_BY_CLAUSE = " GROUP BY ";
  5. private static final String ORDER_BY_CLAUSE = " ORDER BY ";
  6. private static final String STRING_SPACE = " ";
  7. private final SAXReader saxReader = new SAXReader();
  8. private Configuration configuration = null;
  9. private StringTemplateLoader stringTemplateLoader = null;
  10. public CustomSQL() throws SQLException {
  11. _sqlPool = new HashMap<String, SQLBean>();
  12. try {
  13. ClassLoader classLoader = getClass().getClassLoader();
  14. configuration = new Configuration();
  15. stringTemplateLoader = new StringTemplateLoader();
  16. configuration.setDefaultEncoding("UTF-8");
  17. String[] configs = getConfigs();
  18. for (String _config : configs) {
  19. read(classLoader, _config);
  20. }
  21. configuration.setTemplateLoader(stringTemplateLoader);
  22. }
  23. catch (Exception e) {
  24. logger.error("", e);
  25. }
  26. }
  27. protected String[] getConfigs() {
  28. return new String[] {"custom-sql/default.xml"};
  29. }
  30. public String appendCriteria(String sql, String criteria) {
  31. if (StringUtils.isBlank(criteria)) {
  32. return sql;
  33. }
  34. if (!criteria.startsWith(STRING_SPACE)) {
  35. criteria = STRING_SPACE.concat(criteria);
  36. }
  37. if (!criteria.endsWith(STRING_SPACE)) {
  38. criteria = criteria.concat(STRING_SPACE);
  39. }
  40. int pos = sql.indexOf(GROUP_BY_CLAUSE);
  41. if (pos != -1) {
  42. return sql.substring(0, pos + 1).concat(criteria).concat(
  43. sql.substring(pos + 1));
  44. }
  45. pos = sql.indexOf(ORDER_BY_CLAUSE);
  46. if (pos != -1) {
  47. return sql.substring(0, pos + 1).concat(criteria).concat(
  48. sql.substring(pos + 1));
  49. }
  50. return sql.concat(criteria);
  51. }
  52. public String get(String id) {
  53. SQLBean bean = _sqlPool.get(id);
  54. if("simple".equals(bean.getTempateType())) {
  55. return _sqlPool.get(id).getContent();
  56. } else
  57. throw new RuntimeException("SQL 模板类型不正确,只可以是simple类型");
  58. }
  59. public String get(String id, Map<String, Object> model) {
  60. try {
  61. Template template = configuration.getTemplate(id);
  62. StringWriter writer = new StringWriter();
  63. template.process(model, writer);
  64. return writer.toString();
  65. } catch (TemplateException e) {
  66. throw new RuntimeException("Parse sql failed", e);
  67. } catch (IOException e) {
  68. throw new RuntimeException("Parse sql failed", e);
  69. }
  70. }
  71. protected void read(ClassLoader classLoader, String source)
  72. throws Exception {
  73. InputStream is = classLoader.getResourceAsStream(source);
  74. if (is == null) {
  75. return;
  76. }
  77. logger.info("Loading " + source);
  78. Document document = saxReader.read(is);
  79. Element rootElement = document.getRootElement();
  80. for (Object sqlObj : rootElement.elements("sql")) {
  81. Element sqlElement = (Element)sqlObj;
  82. String file = sqlElement.attributeValue("file");
  83. if (StringUtils.isNotBlank(file)) {
  84. read(classLoader, file);
  85. } else {
  86. String id = sqlElement.attributeValue("id");
  87. String sqlType = sqlElement.attributeValue("sqlType");
  88. String tempateType = sqlElement.attributeValue("tempateType");
  89. if("simple".equals(tempateType) || "freeMarker".equals(tempateType)) {
  90. String content = transform(sqlElement.getText());
  91. SQLBean bean = new SQLBean();
  92. bean.setTempateType(tempateType);
  93. bean.setSqlType(sqlType);
  94. bean.setContent(content);
  95. if("freeMarker".equals(tempateType))
  96. stringTemplateLoader.putTemplate(id, content);
  97. _sqlPool.put(id, bean);
  98. } else {
  99. logger.warn("{} 对应 tempateType 值 {} 不正确,可选值为:simple和freeMarker", id, sqlType);
  100. }
  101. }
  102. }
  103. }
  104. protected String transform(String sql) {
  105. StringBuilder sb = new StringBuilder();
  106. try {
  107. BufferedReader bufferedReader =
  108. new BufferedReader(new StringReader(sql));
  109. String line = null;
  110. while ((line = bufferedReader.readLine()) != null) {
  111. sb.append(line.trim());
  112. sb.append(STRING_SPACE);
  113. }
  114. bufferedReader.close();
  115. }
  116. catch (IOException ioe) {
  117. return sql;
  118. }
  119. return sb.toString();
  120. }
  121. public static class SQLBean {
  122. /**
  123. * 两种可选类型:simple和freeMarker
  124. */
  125. private String tempateType = "simple";
  126. /**
  127. * 两种可选类型:SQL和HQL
  128. */
  129. private String sqlType = "SQL";
  130. private String content = "";
  131. public String getTempateType() {
  132. return tempateType;
  133. }
  134. public void setTempateType(String tempateType) {
  135. this.tempateType = tempateType;
  136. }
  137. public String getSqlType() {
  138. return sqlType;
  139. }
  140. public void setSqlType(String sqlType) {
  141. this.sqlType = sqlType;
  142. }
  143. public String getContent() {
  144. return content;
  145. }
  146. public void setContent(String content) {
  147. this.content = content;
  148. }
  149. }
  150. }

Java代码 复制代码 收藏代码
  1. public class CustomSQLUtil {
  2. private static Logger logger = LoggerFactory.getLogger(CustomSQLUtil.class);
  3. private static CustomSQLUtil _instance = new CustomSQLUtil();
  4. private CustomSQL _customSQL;
  5. private CustomSQLUtil() {
  6. try {
  7. _customSQL = new CustomSQL();
  8. }
  9. catch (Exception e) {
  10. logger.error("", e);
  11. }
  12. }
  13. public static String appendCriteria(String sql, String criteria) {
  14. return _instance._customSQL.appendCriteria(sql, criteria);
  15. }
  16. public static String get(String id) {
  17. return _instance._customSQL.get(id);
  18. }
  19. public static String get(String id, Map<String, Object> model) {
  20. return _instance._customSQL.get(id, model);
  21. }
  22. }


实例:
Java代码 复制代码 收藏代码
  1. <sql id="com.*.service.home.CvToolMenuService.queryToolMenusByUser" sqlType="SQL" tempateType="freeMarker">
  2. <![CDATA[
  3. select
  4. a.*, (select count(*) from CV_TOOL_MENU d where d.PARENT_MENU_ID = a.RES_ID) COUNT
  5. from
  6. CV_TOOL_MENU a
  7. where
  8. exists (
  9. select b.TOOL_MENU_ID from ST_ROLE_TOOL_MENU b
  10. where a.RES_ID = b.TOOL_MENU_ID and
  11. <#if (paretMenuId??)>
  12. a.PARENT_MENU_ID = ?
  13. <#else>
  14. a.PARENT_MENU_ID is null
  15. </#if>
  16. and b.ROLE_ID in (
  17. <#list roleIds as id>
  18. ?<#if id_has_next>, </#if>
  19. </#list>
  20. ))
  21. ]]>
  22. </sql>



Java代码 复制代码 收藏代码
  1. private static String QUERY_TOOL_MENUS_BY_USER = CvToolMenuService.class.getName()+".queryToolMenusByUser";
  2. String sql = CustomSQLUtil.get(QUERY_TOOL_MENUS_BY_USER, model);
  3. List<Map<String, Object>> maps = null;
  4. if(parentMenuId == null)
  5. maps = toolMenuDao.getJdbcTemplate().queryForList(sql, roleIds.toArray());
  6. else {
  7. roleIds.add(0, parentMenuId);
  8. maps = toolMenuDao.getJdbcTemplate().queryForList (sql, roleIds.toArray());
  9. }

 

 

引用:

分享到:
评论

相关推荐

    struts2+hibernate+spring+dwr整合

    Spring 还包含了一个全面的事务管理、数据访问集成框架,支持JDBC、Hibernate等持久层技术。 Direct Web Remoting (DWR) 是一种允许JavaScript在浏览器中直接调用服务器端Java方法的库,实现了Ajax的无刷新通信。...

    J2EE--Eclipse+Struts+Hibernate+Spring

    Spring与Hibernate结合,可以简化数据访问层的实现,通过Spring JDBC或MyBatis等,可以更方便地处理数据库操作。此外,Spring的MVC模块可以与Struts一起使用,增强应用的控制层功能。 在"J2EE--Eclipse+Struts+...

    Struts2+Hibernate+Spring整合教程

    此外,Spring还包含大量模块,如Spring JDBC、Spring ORM(集成Hibernate等ORM工具)、Spring MVC(可以替代Struts2作为MVC框架)、Spring Boot等,形成了一站式解决方案。 **SSH整合** SSH整合的主要目的是实现各...

    Struts2+Hibernate+Spring框架搭建(一)

    Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责不同的职责,共同构建了一个强大的企业级应用架构。本篇文章将详细讲解如何利用这三个框架进行整合搭建,旨在为初学者提供一个清晰的入门指南。...

    SpringBoot+Spring data JPA+FreeMarker+shiro+log4jdbc

    综合上述技术,这个项目可能是一个使用SpringBoot作为基础框架,通过Spring Data JPA进行数据库操作,使用FreeMarker作为模板引擎展示页面,Shiro负责安全控制,而Log4jdbc则用于记录数据库查询日志的Web应用。...

    idea工具创建的Spring+SpringMVC+Hibernate+maven项目

    在实际操作中,你可能还会接触到JDBC、模板引擎(如Thymeleaf或FreeMarker)、单元测试和集成测试等概念。 在压缩包文件"Ksoftware"中,你可能会找到以下文件和目录: - `pom.xml`:Maven的项目对象模型文件,包含...

    SSHF备忘之依赖包(struts2+spring2.5+hibernate+freemarker)

    在Java Web开发中,SSHF(Struts2、Spring、Hibernate和FreeMarker)是一个常见的技术栈,用于构建高效、可维护的MVC应用程序。这些框架的整合能够提供强大的功能,如模型-视图-控制器架构、依赖注入、持久化管理和...

    SpringMVC3+Spring3+Hibernate3+Freemarker+HTML5的开源项目jeecms

    Spring的其他模块还包括Spring JDBC、Spring ORM(整合ORM框架如Hibernate)、Spring AOP等。 【Hibernate3】 Hibernate是一个强大的Java持久层框架,它实现了对象关系映射(ORM),使得开发者可以使用面向对象的...

    struts2+hibernate+spring整合

    使用Spring的JDBC模板或者集成Hibernate SessionFactory,以便管理数据库连接。 3. 配置Struts2:在struts.xml文件中定义Action和结果类型,设置拦截器栈。同时,需要在web.xml中配置Struts2的前端控制器。 4. ...

    struts2+Hibernate+Spring整合开发代码

    它提供了一个容器来管理对象的生命周期和装配,同时包含了大量的模块,如Spring MVC、Spring JDBC、Spring ORM(包括对Hibernate的支持)、Spring AOP等。Spring还能与各种其他框架(如Struts2和Hibernate)无缝集成...

    struts2+hibernate+spring框架整合实列

    Struts2、Hibernate和Spring是Java Web开发中的三大主流框架,它们各自负责应用程序的不同层面:Struts2专注于表现层,Hibernate处理数据持久化,而Spring则在业务逻辑和依赖注入方面发挥重要作用。将这三个框架整合...

    Struts2+Hibernate+Spring整合实例

    Spring还集成了其他模块,如Spring JDBC和Spring ORM,可以与Hibernate无缝配合,提供更高级的事务管理。 整合Struts2、Hibernate和Spring,首先需要在项目中引入这三个框架的库。然后,配置Spring的...

    Java项目之移动ssh项目(struts+spring+hibernate+oracle)源代码

    SSH是Java开发中的一种经典架构,全称为Struts2、Spring和Hibernate的组合。这个"Java项目之移动SSH项目"提供了使用这些技术构建的完整应用源代码,对于学习和理解SSH框架集成以及移动开发有着极大的帮助。以下是...

    Struts2+Hibernate+Spring搭建

    Spring还提供了数据访问抽象,包括JDBC模板和对ORM框架(如Hibernate)的支持。此外,Spring MVC是Spring框架的一部分,也是一个MVC框架,可以与Struts2协同工作,提供更灵活的Web应用开发解决方案。 在"Struts2+...

    Strtus2+Hibernate+spring常用开发包

    Spring还提供了对数据访问(如JDBC、Hibernate)、Web MVC、事务管理、缓存等多方面的支持,可以方便地与Struts2和Hibernate进行集成,形成一个完整的开发解决方案。 在实际开发中,这三大框架的整合使得开发者可以...

    图解MyEclipse配置struts+hibernate+spring

    【正文】 在IT行业中,Java开发领域有一种经典的组合技术,...通过阅读提供的"图解MyEclipse配置struts+hibernate+spring+FreeMarker_欢迎来到国国的博客!_新浪博客.htm"文档,可以更深入地学习和掌握这一配置过程。

    Hibernate+spring+struts2分页

    Spring JDBC模块中的`JdbcTemplate`或`NamedParameterJdbcTemplate`可以方便地实现分页查询,通过设置页码和每页大小来获取所需数据。 **Struts2** Struts2作为MVC框架,负责处理用户的请求并展示结果。它提供了...

    struts2+hibernate+spring

    Hibernate通过Spring的JDBC模板或者HibernateTemplate来实现数据访问,使得业务对象可以专注于业务逻辑,而不是数据库操作。Struts2则作为前端控制器,接收HTTP请求,调用Spring管理的业务服务,然后将处理结果返回...

    SpringMVC+Hibernate+Spring完美整合代码

    Spring还提供了事务管理、数据源配置、JDBC抽象等众多服务,方便了SpringMVC和Hibernate的整合。 整合这三个框架,首先需要配置Spring的ApplicationContext,定义Bean的定义及依赖关系。接着,配置SpringMVC的...

    J2EE最新精品项目源码Struts2.0+Hibernate+Spring+ExtJS

    Spring还提供了大量的模块,如Spring MVC用于构建Web应用,Spring JDBC和MyBatis集成用于数据访问,以及Spring Security用于安全控制。 **ExtJS** 是一个JavaScript库,专注于构建富客户端的Web应用。它提供了丰富...

Global site tag (gtag.js) - Google Analytics