- 浏览: 236897 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (76)
- HQL (1)
- Hibernate (1)
- Oracle (6)
- Struts (1)
- Java (9)
- Android (5)
- oracle字符串截取函数 (1)
- Linux (6)
- DOS (1)
- HTML (1)
- IO (1)
- LOG4J (1)
- MyEclipse (0)
- native2ascii (1)
- JBox (2)
- jUploader (1)
- Eclipse (2)
- Maven (2)
- Jetty (2)
- SpringMVC (1)
- SpringSecurity (2)
- MySql (4)
- JavaScript (1)
- 正则表达式 (1)
- jQuery (4)
- Telnet (1)
- Kindeditor (1)
- JSP (1)
- Tomcat (1)
- WebService (2)
- CXF (1)
- MyBabits (1)
- Nginx (1)
- 反射 (1)
- EXT (1)
- OSX (2)
- MAC (4)
- Intellj IDEA (1)
- PHP (2)
- FTP (1)
- SSH (1)
- PEM (1)
- NTFS (1)
- Tools (1)
最新评论
-
Johnny_L:
lilihongmm 写道这样实现是有问题的。。。。Custo ...
Spring Security 3.0数据库动态实现权限控制 -
lilihongmm:
这样实现是有问题的。。。。CustomInvocationSe ...
Spring Security 3.0数据库动态实现权限控制 -
SundayHa:
SundayHa 写道楼主你好 为什么 我按你的配置完后 没有 ...
Spring Security 3.0数据库动态实现权限控制 -
SundayHa:
楼主你好 为什么 我按你的配置完后 没有进入CustomAcc ...
Spring Security 3.0数据库动态实现权限控制 -
java-lxm:
在哪个地方重新加载?
Spring Security 3.0数据库动态实现权限控制
今天看到《银行主数据项目(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版本。
实例:
SQL标签tempateType值;simple和freeMarker, simple直接按照spring jdbc template方式书写。
使用freemarker 可以很好的解决in参数的问题。
StarFlow之前使用了mybatis,最近替换成了spring jdbc.月底会发布0.7版本。
- public class CustomSQL {
- private static Logger logger = LoggerFactory.getLogger(CustomSQL.class);
- private Map<String, SQLBean> _sqlPool;
- private static final String GROUP_BY_CLAUSE = " GROUP BY ";
- private static final String ORDER_BY_CLAUSE = " ORDER BY ";
- private static final String STRING_SPACE = " ";
- private final SAXReader saxReader = new SAXReader();
- private Configuration configuration = null;
- private StringTemplateLoader stringTemplateLoader = null;
- public CustomSQL() throws SQLException {
- _sqlPool = new HashMap<String, SQLBean>();
- try {
- ClassLoader classLoader = getClass().getClassLoader();
- configuration = new Configuration();
- stringTemplateLoader = new StringTemplateLoader();
- configuration.setDefaultEncoding("UTF-8");
- String[] configs = getConfigs();
- for (String _config : configs) {
- read(classLoader, _config);
- }
- configuration.setTemplateLoader(stringTemplateLoader);
- }
- catch (Exception e) {
- logger.error("", e);
- }
- }
- protected String[] getConfigs() {
- return new String[] {"custom-sql/default.xml"};
- }
- public String appendCriteria(String sql, String criteria) {
- if (StringUtils.isBlank(criteria)) {
- return sql;
- }
- if (!criteria.startsWith(STRING_SPACE)) {
- criteria = STRING_SPACE.concat(criteria);
- }
- if (!criteria.endsWith(STRING_SPACE)) {
- criteria = criteria.concat(STRING_SPACE);
- }
- int pos = sql.indexOf(GROUP_BY_CLAUSE);
- if (pos != -1) {
- return sql.substring(0, pos + 1).concat(criteria).concat(
- sql.substring(pos + 1));
- }
- pos = sql.indexOf(ORDER_BY_CLAUSE);
- if (pos != -1) {
- return sql.substring(0, pos + 1).concat(criteria).concat(
- sql.substring(pos + 1));
- }
- return sql.concat(criteria);
- }
- public String get(String id) {
- SQLBean bean = _sqlPool.get(id);
- if("simple".equals(bean.getTempateType())) {
- return _sqlPool.get(id).getContent();
- } else
- throw new RuntimeException("SQL 模板类型不正确,只可以是simple类型");
- }
- public String get(String id, Map<String, Object> model) {
- try {
- Template template = configuration.getTemplate(id);
- StringWriter writer = new StringWriter();
- template.process(model, writer);
- return writer.toString();
- } catch (TemplateException e) {
- throw new RuntimeException("Parse sql failed", e);
- } catch (IOException e) {
- throw new RuntimeException("Parse sql failed", e);
- }
- }
- protected void read(ClassLoader classLoader, String source)
- throws Exception {
- InputStream is = classLoader.getResourceAsStream(source);
- if (is == null) {
- return;
- }
- logger.info("Loading " + source);
- Document document = saxReader.read(is);
- Element rootElement = document.getRootElement();
- for (Object sqlObj : rootElement.elements("sql")) {
- Element sqlElement = (Element)sqlObj;
- String file = sqlElement.attributeValue("file");
- if (StringUtils.isNotBlank(file)) {
- read(classLoader, file);
- } else {
- String id = sqlElement.attributeValue("id");
- String sqlType = sqlElement.attributeValue("sqlType");
- String tempateType = sqlElement.attributeValue("tempateType");
- if("simple".equals(tempateType) || "freeMarker".equals(tempateType)) {
- String content = transform(sqlElement.getText());
- SQLBean bean = new SQLBean();
- bean.setTempateType(tempateType);
- bean.setSqlType(sqlType);
- bean.setContent(content);
- if("freeMarker".equals(tempateType))
- stringTemplateLoader.putTemplate(id, content);
- _sqlPool.put(id, bean);
- } else {
- logger.warn("{} 对应 tempateType 值 {} 不正确,可选值为:simple和freeMarker", id, sqlType);
- }
- }
- }
- }
- protected String transform(String sql) {
- StringBuilder sb = new StringBuilder();
- try {
- BufferedReader bufferedReader =
- new BufferedReader(new StringReader(sql));
- String line = null;
- while ((line = bufferedReader.readLine()) != null) {
- sb.append(line.trim());
- sb.append(STRING_SPACE);
- }
- bufferedReader.close();
- }
- catch (IOException ioe) {
- return sql;
- }
- return sb.toString();
- }
- public static class SQLBean {
- /**
- * 两种可选类型:simple和freeMarker
- */
- private String tempateType = "simple";
- /**
- * 两种可选类型:SQL和HQL
- */
- private String sqlType = "SQL";
- private String content = "";
- public String getTempateType() {
- return tempateType;
- }
- public void setTempateType(String tempateType) {
- this.tempateType = tempateType;
- }
- public String getSqlType() {
- return sqlType;
- }
- public void setSqlType(String sqlType) {
- this.sqlType = sqlType;
- }
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- }
- }
public class CustomSQL { private static Logger logger = LoggerFactory.getLogger(CustomSQL.class); private Map<String, SQLBean> _sqlPool; private static final String GROUP_BY_CLAUSE = " GROUP BY "; private static final String ORDER_BY_CLAUSE = " ORDER BY "; private static final String STRING_SPACE = " "; private final SAXReader saxReader = new SAXReader(); private Configuration configuration = null; private StringTemplateLoader stringTemplateLoader = null; public CustomSQL() throws SQLException { _sqlPool = new HashMap<String, SQLBean>(); try { ClassLoader classLoader = getClass().getClassLoader(); configuration = new Configuration(); stringTemplateLoader = new StringTemplateLoader(); configuration.setDefaultEncoding("UTF-8"); String[] configs = getConfigs(); for (String _config : configs) { read(classLoader, _config); } configuration.setTemplateLoader(stringTemplateLoader); } catch (Exception e) { logger.error("", e); } } protected String[] getConfigs() { return new String[] {"custom-sql/default.xml"}; } public String appendCriteria(String sql, String criteria) { if (StringUtils.isBlank(criteria)) { return sql; } if (!criteria.startsWith(STRING_SPACE)) { criteria = STRING_SPACE.concat(criteria); } if (!criteria.endsWith(STRING_SPACE)) { criteria = criteria.concat(STRING_SPACE); } int pos = sql.indexOf(GROUP_BY_CLAUSE); if (pos != -1) { return sql.substring(0, pos + 1).concat(criteria).concat( sql.substring(pos + 1)); } pos = sql.indexOf(ORDER_BY_CLAUSE); if (pos != -1) { return sql.substring(0, pos + 1).concat(criteria).concat( sql.substring(pos + 1)); } return sql.concat(criteria); } public String get(String id) { SQLBean bean = _sqlPool.get(id); if("simple".equals(bean.getTempateType())) { return _sqlPool.get(id).getContent(); } else throw new RuntimeException("SQL 模板类型不正确,只可以是simple类型"); } public String get(String id, Map<String, Object> model) { try { Template template = configuration.getTemplate(id); StringWriter writer = new StringWriter(); template.process(model, writer); return writer.toString(); } catch (TemplateException e) { throw new RuntimeException("Parse sql failed", e); } catch (IOException e) { throw new RuntimeException("Parse sql failed", e); } } protected void read(ClassLoader classLoader, String source) throws Exception { InputStream is = classLoader.getResourceAsStream(source); if (is == null) { return; } logger.info("Loading " + source); Document document = saxReader.read(is); Element rootElement = document.getRootElement(); for (Object sqlObj : rootElement.elements("sql")) { Element sqlElement = (Element)sqlObj; String file = sqlElement.attributeValue("file"); if (StringUtils.isNotBlank(file)) { read(classLoader, file); } else { String id = sqlElement.attributeValue("id"); String sqlType = sqlElement.attributeValue("sqlType"); String tempateType = sqlElement.attributeValue("tempateType"); if("simple".equals(tempateType) || "freeMarker".equals(tempateType)) { String content = transform(sqlElement.getText()); SQLBean bean = new SQLBean(); bean.setTempateType(tempateType); bean.setSqlType(sqlType); bean.setContent(content); if("freeMarker".equals(tempateType)) stringTemplateLoader.putTemplate(id, content); _sqlPool.put(id, bean); } else { logger.warn("{} 对应 tempateType 值 {} 不正确,可选值为:simple和freeMarker", id, sqlType); } } } } protected String transform(String sql) { StringBuilder sb = new StringBuilder(); try { BufferedReader bufferedReader = new BufferedReader(new StringReader(sql)); String line = null; while ((line = bufferedReader.readLine()) != null) { sb.append(line.trim()); sb.append(STRING_SPACE); } bufferedReader.close(); } catch (IOException ioe) { return sql; } return sb.toString(); } public static class SQLBean { /** * 两种可选类型:simple和freeMarker */ private String tempateType = "simple"; /** * 两种可选类型:SQL和HQL */ private String sqlType = "SQL"; private String content = ""; public String getTempateType() { return tempateType; } public void setTempateType(String tempateType) { this.tempateType = tempateType; } public String getSqlType() { return sqlType; } public void setSqlType(String sqlType) { this.sqlType = sqlType; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } }
- public class CustomSQLUtil {
- private static Logger logger = LoggerFactory.getLogger(CustomSQLUtil.class);
- private static CustomSQLUtil _instance = new CustomSQLUtil();
- private CustomSQL _customSQL;
- private CustomSQLUtil() {
- try {
- _customSQL = new CustomSQL();
- }
- catch (Exception e) {
- logger.error("", e);
- }
- }
- public static String appendCriteria(String sql, String criteria) {
- return _instance._customSQL.appendCriteria(sql, criteria);
- }
- public static String get(String id) {
- return _instance._customSQL.get(id);
- }
- public static String get(String id, Map<String, Object> model) {
- return _instance._customSQL.get(id, model);
- }
- }
public class CustomSQLUtil { private static Logger logger = LoggerFactory.getLogger(CustomSQLUtil.class); private static CustomSQLUtil _instance = new CustomSQLUtil(); private CustomSQL _customSQL; private CustomSQLUtil() { try { _customSQL = new CustomSQL(); } catch (Exception e) { logger.error("", e); } } public static String appendCriteria(String sql, String criteria) { return _instance._customSQL.appendCriteria(sql, criteria); } public static String get(String id) { return _instance._customSQL.get(id); } public static String get(String id, Map<String, Object> model) { return _instance._customSQL.get(id, model); } }
实例:
- <sql id="com.*.service.home.CvToolMenuService.queryToolMenusByUser" sqlType="SQL" tempateType="freeMarker">
- <![CDATA[
- select
- a.*, (select count(*) from CV_TOOL_MENU d where d.PARENT_MENU_ID = a.RES_ID) COUNT
- from
- CV_TOOL_MENU a
- where
- exists (
- select b.TOOL_MENU_ID from ST_ROLE_TOOL_MENU b
- where a.RES_ID = b.TOOL_MENU_ID and
- <#if (paretMenuId??)>
- a.PARENT_MENU_ID = ?
- <#else>
- a.PARENT_MENU_ID is null
- </#if>
- and b.ROLE_ID in (
- <#list roleIds as id>
- ?<#if id_has_next>, </#if>
- </#list>
- ))
- ]]>
- </sql>
<sql id="com.*.service.home.CvToolMenuService.queryToolMenusByUser" sqlType="SQL" tempateType="freeMarker"> <![CDATA[ select a.*, (select count(*) from CV_TOOL_MENU d where d.PARENT_MENU_ID = a.RES_ID) COUNT from CV_TOOL_MENU a where exists ( select b.TOOL_MENU_ID from ST_ROLE_TOOL_MENU b where a.RES_ID = b.TOOL_MENU_ID and <#if (paretMenuId??)> a.PARENT_MENU_ID = ? <#else> a.PARENT_MENU_ID is null </#if> and b.ROLE_ID in ( <#list roleIds as id> ?<#if id_has_next>, </#if> </#list> )) ]]> </sql>
- private static String QUERY_TOOL_MENUS_BY_USER = CvToolMenuService.class.getName()+".queryToolMenusByUser";
- String sql = CustomSQLUtil.get(QUERY_TOOL_MENUS_BY_USER, model);
- List<Map<String, Object>> maps = null;
- if(parentMenuId == null)
- maps = toolMenuDao.getJdbcTemplate().queryForList(sql, roleIds.toArray());
- else {
- roleIds.add(0, parentMenuId);
- maps = toolMenuDao.getJdbcTemplate().queryForList (sql, roleIds.toArray());
- }
引用:
相关推荐
Spring 还包含了一个全面的事务管理、数据访问集成框架,支持JDBC、Hibernate等持久层技术。 Direct Web Remoting (DWR) 是一种允许JavaScript在浏览器中直接调用服务器端Java方法的库,实现了Ajax的无刷新通信。...
Spring与Hibernate结合,可以简化数据访问层的实现,通过Spring JDBC或MyBatis等,可以更方便地处理数据库操作。此外,Spring的MVC模块可以与Struts一起使用,增强应用的控制层功能。 在"J2EE--Eclipse+Struts+...
此外,Spring还包含大量模块,如Spring JDBC、Spring ORM(集成Hibernate等ORM工具)、Spring MVC(可以替代Struts2作为MVC框架)、Spring Boot等,形成了一站式解决方案。 **SSH整合** SSH整合的主要目的是实现各...
Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责不同的职责,共同构建了一个强大的企业级应用架构。本篇文章将详细讲解如何利用这三个框架进行整合搭建,旨在为初学者提供一个清晰的入门指南。...
综合上述技术,这个项目可能是一个使用SpringBoot作为基础框架,通过Spring Data JPA进行数据库操作,使用FreeMarker作为模板引擎展示页面,Shiro负责安全控制,而Log4jdbc则用于记录数据库查询日志的Web应用。...
在实际操作中,你可能还会接触到JDBC、模板引擎(如Thymeleaf或FreeMarker)、单元测试和集成测试等概念。 在压缩包文件"Ksoftware"中,你可能会找到以下文件和目录: - `pom.xml`:Maven的项目对象模型文件,包含...
在Java Web开发中,SSHF(Struts2、Spring、Hibernate和FreeMarker)是一个常见的技术栈,用于构建高效、可维护的MVC应用程序。这些框架的整合能够提供强大的功能,如模型-视图-控制器架构、依赖注入、持久化管理和...
Spring的其他模块还包括Spring JDBC、Spring ORM(整合ORM框架如Hibernate)、Spring AOP等。 【Hibernate3】 Hibernate是一个强大的Java持久层框架,它实现了对象关系映射(ORM),使得开发者可以使用面向对象的...
使用Spring的JDBC模板或者集成Hibernate SessionFactory,以便管理数据库连接。 3. 配置Struts2:在struts.xml文件中定义Action和结果类型,设置拦截器栈。同时,需要在web.xml中配置Struts2的前端控制器。 4. ...
它提供了一个容器来管理对象的生命周期和装配,同时包含了大量的模块,如Spring MVC、Spring JDBC、Spring ORM(包括对Hibernate的支持)、Spring AOP等。Spring还能与各种其他框架(如Struts2和Hibernate)无缝集成...
Struts2、Hibernate和Spring是Java Web开发中的三大主流框架,它们各自负责应用程序的不同层面:Struts2专注于表现层,Hibernate处理数据持久化,而Spring则在业务逻辑和依赖注入方面发挥重要作用。将这三个框架整合...
Spring还集成了其他模块,如Spring JDBC和Spring ORM,可以与Hibernate无缝配合,提供更高级的事务管理。 整合Struts2、Hibernate和Spring,首先需要在项目中引入这三个框架的库。然后,配置Spring的...
SSH是Java开发中的一种经典架构,全称为Struts2、Spring和Hibernate的组合。这个"Java项目之移动SSH项目"提供了使用这些技术构建的完整应用源代码,对于学习和理解SSH框架集成以及移动开发有着极大的帮助。以下是...
Spring还提供了数据访问抽象,包括JDBC模板和对ORM框架(如Hibernate)的支持。此外,Spring MVC是Spring框架的一部分,也是一个MVC框架,可以与Struts2协同工作,提供更灵活的Web应用开发解决方案。 在"Struts2+...
Spring还提供了对数据访问(如JDBC、Hibernate)、Web MVC、事务管理、缓存等多方面的支持,可以方便地与Struts2和Hibernate进行集成,形成一个完整的开发解决方案。 在实际开发中,这三大框架的整合使得开发者可以...
【正文】 在IT行业中,Java开发领域有一种经典的组合技术,...通过阅读提供的"图解MyEclipse配置struts+hibernate+spring+FreeMarker_欢迎来到国国的博客!_新浪博客.htm"文档,可以更深入地学习和掌握这一配置过程。
Spring JDBC模块中的`JdbcTemplate`或`NamedParameterJdbcTemplate`可以方便地实现分页查询,通过设置页码和每页大小来获取所需数据。 **Struts2** Struts2作为MVC框架,负责处理用户的请求并展示结果。它提供了...
Hibernate通过Spring的JDBC模板或者HibernateTemplate来实现数据访问,使得业务对象可以专注于业务逻辑,而不是数据库操作。Struts2则作为前端控制器,接收HTTP请求,调用Spring管理的业务服务,然后将处理结果返回...
Spring还提供了事务管理、数据源配置、JDBC抽象等众多服务,方便了SpringMVC和Hibernate的整合。 整合这三个框架,首先需要配置Spring的ApplicationContext,定义Bean的定义及依赖关系。接着,配置SpringMVC的...
Spring还提供了大量的模块,如Spring MVC用于构建Web应用,Spring JDBC和MyBatis集成用于数据访问,以及Spring Security用于安全控制。 **ExtJS** 是一个JavaScript库,专注于构建富客户端的Web应用。它提供了丰富...