- 浏览: 62838 次
- 性别:
- 来自: 南宁
最新评论
-
diwuci:
用response.setContentType(" ...
spring mvc 系列3 返回JSON以及文件上传 -
dickluo:
得花时间好好看下代码了 多谢
spring mvc 系列1 环境配置 -
muqingren:
这个学习了,歇息
spring mvc 系列3 返回JSON以及文件上传 -
JetMah:
Jophy 写道
@RequestMapping(pa ...
spring mvc 系列3 返回JSON以及文件上传 -
LifeFree:
LZ 1.的实现,貌似有笔误。
应该类似:
<pre n ...
一个小细节现实后的蛋疼结果。
spring mvc 系列1 中:
感谢 ricoyu 提示
1 楼 ricoyu 2010-10-02 引用
DAO层不要用◎Service,用◎Repository(没拼错的话)
基于事务管理,由于小弟一时大意忘了加上去,感谢 icanfly 提醒。
此版本已经修正以上BUG。
泛型需要JDK1.5以上,因此此版本需要运行在JDK1.5以上。
先看代码:
此BaseDao封装了 添加、删除、修改、查询等基本方法。
其它子DAO继承此BaseDao即可,如有不同覆盖基类方法即可:
注:纯存储过程操作,不用加注解:@Transactional
@Transactional 为声名此对象需要事务管理。
大概就是酱紫
感谢 ricoyu 提示
引用
1 楼 ricoyu 2010-10-02 引用
DAO层不要用◎Service,用◎Repository(没拼错的话)
基于事务管理,由于小弟一时大意忘了加上去,感谢 icanfly 提醒。
此版本已经修正以上BUG。
泛型需要JDK1.5以上,因此此版本需要运行在JDK1.5以上。
先看代码:
@Repository public class BaseDao { // 存储过程前缀 protected static String PROCEDURE_NAME_PREFIX = "st_"; /** * 存储过程对应的表名,为空时,从操作对象类名中获取 * 存储过程命名方式:前缀_表名_后缀 * 操作对象如:ProductModel, ProductSellTableModel * 对应获取表名为:productTable, ProductSellTable */ protected static String TABLE_NAME = null; // 存储过程后缀 protected static String PROCEDURE_NAME_ADD_SUFFIX = "Add"; protected static String PROCEDURE_NAME_UPDATE_SUFFIX = "Update"; protected static String PROCEDURE_NAME_DELETE_SUFFIX = "Delete"; protected static String PROCEDURE_NAME_QUERY_BY_PRIMARY_KEY_SUFFIX = "QueryByPrimaryKey"; public BaseDao(){} @Autowired private SimpleJdbcTemplate simpleJdbcTemplate ; //@Autowired是Spring提供的一种注入Bean的方法 @Autowired private JdbcTemplate jdbcTemplate ; public SimpleJdbcTemplate getSimpleJdbcTemplate() { return simpleJdbcTemplate; } public void setSimpleJdbcTemplate(SimpleJdbcTemplate simpleJdbcTemplate) { this.simpleJdbcTemplate = simpleJdbcTemplate; } public SimpleJdbcCall createSimpleJdbcCall() { return new SimpleJdbcCall(this.jdbcTemplate); } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** * * @功能模块: executeProcedure * @方法说明: 执行存储过程 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回此对象操作后的信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要操作的对象信息 * @param returnClass 返回的类型,如果为null 返回类型与查询类型一致 * @param procedureName 存储过程名称 * @return Map<"ReturningResultSet", Object> * @throws */ @SuppressWarnings("unchecked") protected <T> Map executeProcedure(Class returnClass, T t, String procedureName){ SimpleJdbcCall sjc = this.createSimpleJdbcCall(); sjc.getJdbcTemplate().setResultsMapCaseInsensitive(true); sjc.withProcedureName(procedureName).returningResultSet("ReturningResultSet", BeanPropertyRowMapper.newInstance(returnClass==null?t.getClass():returnClass)); SqlParameterSource param = new BeanPropertySqlParameterSource(t); return sjc.execute(param); } /** * * @功能模块: querySelf * @方法说明: 执行存储过程 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回此对象操作后的信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要操作的对象信息 * @param procedureName 存储过程名称 * @return T 执行存储过程后返回的对象,与传入对象类型一致 * @throws */ @SuppressWarnings("unchecked") protected <T> T querySelf(T t, String procedureName){ Map returnResultSet = executeProcedure(null, t, procedureName); List list = (List)returnResultSet.get("ReturningResultSet"); if(list.size()>0){ return (T)list.get(0); }else{ return null; } } /** * * @功能模块: add * @方法说明: 添加一个对象 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回此对象操作后的信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要添加的对象信息 * @param procedureName 存储过程名称 * @return T 泛类型(返回添加后的对象) * @throws */ protected <T> T add(T t, String procedureName){ return this.querySelf(t, procedureName); } /** * * @功能模块: add * @方法说明: 添加一个对象 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回此对象操作后的信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要添加的对象信息 * @return T 泛类型(返回添加后的对象) * @throws */ public <T> T add(T t){ return add(t, getProcedureName(t.getClass(), PROCEDURE_NAME_ADD_SUFFIX)); } /** * * @功能模块: update * @方法说明: 按主键修改一个对象 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回此对象操作后的信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要修改的对象信息 * @param procedureName 存储过程名称 * @return T 泛类型(返回修改后的对象信息) * @throws */ protected <T> T update(T t, String procedureName){ return this.querySelf(t, procedureName); } /** * * @功能模块: update * @方法说明: 按主键修改一个对象 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回此对象操作后的信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要修改的对象信息 * @return T 泛类型(返回修改后的对象信息) * @throws */ public <T> T update(T t){ return update(t, getProcedureName(t.getClass(), PROCEDURE_NAME_UPDATE_SUFFIX)); } /** * * @功能模块: delete * @方法说明: 按主键删除一个对象 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回执行结果信息 * @version: 1.0 * @param <T> 泛型 * @param t 要删除的对象 * @param procedureName 存储过程名称 * @return Result 执行结果信息类 * @throws */ protected <T> Result delete(T t, String procedureName){ Map returnResultSet = executeProcedure(Result.class, t, procedureName); List list = (List)returnResultSet.get("ReturningResultSet"); if(list!=null && list.size()>0){ return (Result)list.get(0); }else{ return null; } } /** * * @功能模块: delete * @方法说明: 按主键删除一个对象 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回执行结果信息 * @version: 1.0 * @param <T> 泛型 * @param t 要删除的对象 * @return Result 执行结果信息类 * @throws */ public <T> Result delete(T t){ return delete(t, getProcedureName(t.getClass(), PROCEDURE_NAME_DELETE_SUFFIX)); } /** * * @功能模块: delete * @方法说明: 按主键字符串删除多个对象 将对象t转换成存储过程参数,并执行存储过程,执行存储过程后返回执行结果信息 * @version: 1.0 * @param ids 要删除的对象ID,多个ID以逗号分割,如:1,2,3 * @return Result 执行结果信息类 * @throws */ protected Result delete(String ids, String procedureName){ SimpleJdbcCall sjc = this.createSimpleJdbcCall(); sjc.getJdbcTemplate().setResultsMapCaseInsensitive(true); sjc.withProcedureName(procedureName).returningResultSet("ReturningResultSet", BeanPropertyRowMapper.newInstance(Result.class)); List list = (List)sjc.execute(ids).get("ReturningResultSet"); if(list!=null && list.size()>0){ return (Result)list.get(0); }else{ return null; } } /** * * @功能模块: query * @方法说明: 按条件,排序,分页信息查询内容 * @version: 1.0 * @param <T> 泛型,查询的对象类型 * @param t 对象实例 * @param condition 条件 * @param order 排序 * @param pagination 分页信息 * @param procedureName 存储过程名称 * @return Map<"Pagination", PaginationModel> * Map<"List", List<T>> * @throws */ @SuppressWarnings("unchecked") protected Map query(Class clazz, Map<String, Object> condition, String order, PaginationModel pagination, String procedureName){ SimpleJdbcCall sjc = this.createSimpleJdbcCall(); sjc.getJdbcTemplate().setResultsMapCaseInsensitive(true); sjc.withProcedureName(procedureName). returningResultSet("Pagination", BeanPropertyRowMapper.newInstance(PaginationModel.class)). returningResultSet("List", BeanPropertyRowMapper.newInstance(clazz)); Map<String, Object> param = new HashMap<String, Object>(); param.putAll(condition==null?new HashMap():condition); param.put("orderby", order==null?"":order); param.put("pageSize", pagination.getPageSize()); param.put("currPage", pagination.getCurrPage()); Map returnResultSet = sjc.execute(param); Map<String, Object> newResult = new HashMap<String, Object>(); newResult.put("List", returnResultSet.get("List")); List list = (List)returnResultSet.get("Pagination"); if(list.size()>0){ newResult.put("Pagination", list.get(0)); } return newResult; } /** * * @功能模块: query * @方法说明: 按条件查询对象列表 * @version: 1.0 * @param <T> 泛型 * @param t 要查询的对象 * @param condition 条件 * @param procedureName 存储过程名称 * @return List 对象列表 * @throws */ @SuppressWarnings("unchecked") protected List query(Class clazz, Map<String, Object> condition, String procedureName){ SimpleJdbcCall sjc = this.createSimpleJdbcCall(); sjc.getJdbcTemplate().setResultsMapCaseInsensitive(true); sjc.withProcedureName(procedureName). returningResultSet("List", BeanPropertyRowMapper.newInstance(clazz)); Map resultSet = sjc.execute(condition); return (List)resultSet.get("List"); } /** * * @功能模块: query * @方法说明: 按对象主键进行查询 将对象t转换成存储过程参数,并执行存储过程进行查询,返回查询后的对象信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要查询的对象信息 * @param procedureName 存储过程名称 * @return T 执行查询存储过程后返回的对象,与传入对象类型一致 * @throws */ protected <T> T query(T t, String procedureName){ return this.querySelf(t, procedureName); } /** * * @功能模块: query * @方法说明: 按对象主键进行查询 将对象t转换成存储过程参数,并执行存储过程进行查询,返回查询后的对象信息 * @version: 1.0 * @param <T> 泛类型 * @param t 要查询的对象信息 * @return T 执行查询存储过程后返回的对象,与传入对象类型一致 * @throws */ public <T> T query(T t){ return query(t, getProcedureName(t.getClass(), PROCEDURE_NAME_QUERY_BY_PRIMARY_KEY_SUFFIX)); } /** * * @功能模块: getProcedureName * @方法说明: 根据查询的对象类,获取此操作此对象存储过程的名称 * @version: 1.0 * @param clazz 查询的对象类 * @param suffix 存储过程后缀 * @return String 存储过程名称 * @throws */ private String getProcedureName(Class clazz, String suffix){ String tableName = TABLE_NAME==null?getTableName(clazz.getSimpleName()):TABLE_NAME; return PROCEDURE_NAME_PREFIX + tableName + (suffix==null?"":("".equals(suffix)?"":"_"+suffix)); } /** * * @功能模块: getTableName * @方法说明: 根据查询的对象类名,获取此对象类对应的表 * @version: 1.0 * @param className * @return String * @throws */ private String getTableName(String className){ if(className.endsWith("Model")){ String name = className.substring(0, className.length()-"Model".length()); return name.endsWith("Table")?name:name+"Table"; }else{ return className.endsWith("Table")?className:className+"Table"; } } }
此BaseDao封装了 添加、删除、修改、查询等基本方法。
其它子DAO继承此BaseDao即可,如有不同覆盖基类方法即可:
@Transactional @Repository public class TestDao extends BaseDao { /** * * @功能模块: selectTestAll * @方法说明: 按分页信息查询内容 * @version: 1.0 * @param <T> 泛型,查询的对象类型 * @param t 对象实例 * @param pagination 分页信息 * @param procedureName 存储过程名称 * @return Map<"Pagination", PaginationModel> * Map<"List", List<T>> * @throws */ public Map selectTestAll(PaginationModel paginationModel) { return super.query(TestModel.class, null, null, paginationModel, "st_TestTable_QueryAll"); } /** * * @功能模块: delete * @方法说明: 按主键字符串删除多个对象 将ids转换成存储过程参数,并执行存储过程,执行存储过程后返回执行结果信息 * @version: 1.0 * @param ids 要删除的对象ID,多个ID以逗号分割,如:1,2,3 * @return Result 执行结果信息类 * @throws */ public Result delete(String ids){ return super.delete(ids, "st_TestTable_Delete"); } }
注:纯存储过程操作,不用加注解:@Transactional
@Transactional 为声名此对象需要事务管理。
- TestSpringMVC.rar (8.6 MB)
- 下载次数: 673
评论
7 楼
oakeye
2010-10-09
我一直以为simpleJdbcTemplate要比JdbcTemplate牛逼,每想到我想反了
在reference上面也没提到这个好像
在reference上面也没提到这个好像
6 楼
phoenix_sun
2010-10-09
有点乱,直接用的是JdbcTemplate,貌似没有这么复杂
5 楼
aninfeel
2010-10-08
貌似还可以在方法里定义事务是否readonly
4 楼
caodegao
2010-10-08
哥··你真厉害··
有些还是不大明白··
注解真强大,希望哥把代码注释多写一下
有助于国人理解··谢谢无私奉献
有些还是不大明白··
注解真强大,希望哥把代码注释多写一下
有助于国人理解··谢谢无私奉献
3 楼
oakeye
2010-10-08
public T getById(int id){ String sql = "select * from "+table+" where id = ?"; logger.info("{}",sql); RowMapper<T> mapper = (RowMapper<T>) ParameterizedBeanPropertyRowMapper.newInstance(entityClass); return simpleJdbcTemplate.queryForObject(sql, mapper, id); }
大概就是酱紫
2 楼
oakeye
2010-10-08
SimpleJdbcTemplate 在spring3里已经建议只用JdbcTemplate了,功能都有了 ?
红豆?
红豆?
1 楼
counters15
2010-10-07
我现在的项目也是用spring mvc3,赞一下楼主的分享精神。
PS:SimpleJdbcTemplate 在spring3里已经建议只用JdbcTemplate了,功能都有了
PS2:spring3中加入了BeanPropertyRowMapper,只要将new BeanPropertyRowMapper<XXXDao>(XXXDao.class)作为参数就好了
PS:SimpleJdbcTemplate 在spring3里已经建议只用JdbcTemplate了,功能都有了
PS2:spring3中加入了BeanPropertyRowMapper,只要将new BeanPropertyRowMapper<XXXDao>(XXXDao.class)作为参数就好了
发表评论
-
一个小细节现实后的蛋疼结果。
2011-03-07 08:37 1180情况是这样子的,比如你用单击按钮在单数次单击里面要求某个数为0 ... -
eclipse3.6 集成 myeclipse 插件
2010-11-16 14:06 4730最近很是邪恶,不想费钱,但又不想邪恶的去找 myeclipse ... -
spring mvc 系列3 返回JSON以及文件上传
2010-10-10 18:58 9747先来看下spring mvc提供返回为json数据的注解 ... -
spring mvc 系列1 环境配置
2010-10-02 18:59 1980废话: 热门?=spring + hibernate + st ... -
finally 浅谈
2010-07-29 10:01 2400近日做程序时突发奇想:try ... finally ... ... -
大量数据访问时,用JPA 对象映射关系会出错?
2009-12-30 09:23 2789昨天在做一JPA调试时出了些莫名其妙的错。 public ... -
单线程处理多任务处理方式
2009-12-27 16:14 4310缘由: 在实际的应用中可能会出现这样一种尴尬:只有一个 ... -
命令模式,解释命令
2009-12-26 21:52 1081用命令模式解释命令 ... -
Hibernate+jpa+spring
2009-12-23 17:34 1350今天搞了一个JPA+HIBERNATE,以下是资料,全英文 h ... -
需要但没有session等会话信息下的程序开发
2009-10-19 09:52 1193本人最近在做个小实现: 需求:类似于聊天室, ... -
jpa 多个对象映射同时加载
2009-10-13 23:18 1373jpa 多个对象映射同时加载 FetchType可设置为EA ... -
利用RMI实现JAVA分布式应用
2009-10-10 15:53 1027Java RMI (Remote Method Invocat ... -
一道SQL面试题
2009-09-22 17:28 1110有两个表, table1, table2, Table tab ... -
java 取随机字符串
2009-09-16 13:51 4655package org.jinsheng.util; ... -
junit4单元测试的注释使用说明
2009-08-24 23:16 4793junit4单元测试的使用说明 右键项目->prope ... -
spring2.5注释型 + jpa + 数据库池的配置(4)
2009-08-10 00:57 1331PersonDao.java package org.ji ... -
spring2.5注释型 + jpa + 数据库池的配置(3)
2009-08-10 00:45 1108Person.java(实体文件) package org ... -
spring2.5注释型 + jpa + 数据库池的配置(2)
2009-08-10 00:41 1267文件配置: applicationContext.xml ... -
spring2.5注释型 + jpa + 数据库池的配置(1)
2009-08-10 00:28 1836本人用的环境是:eclipse 3.0 + jdk 6.0_1 ...
相关推荐
这个基于Spring MVC和MyBatis的泛型代码生成模板就是为此目的设计的。 首先,Spring MVC是一个模型-视图-控制器(MVC)架构模式的实现,它使得开发者能够将业务逻辑、数据模型与用户界面分离,提高了代码的可维护性...
总结来说,"Struts2+hibernate+spring整合泛型DAO"是一种常见的Java Web开发模式,它利用三大框架的优势,结合泛型设计,提高了代码复用,降低了维护成本,使得开发者能更专注于业务逻辑,而不是基础架构。
1. **Struts2**:Struts2是一个基于MVC设计模式的Web应用框架,它继承了Struts1的优点,并引入了更多现代框架的特性,如拦截器(Interceptor)机制,增强了Action类的功能。在S2SH整合中,Struts2主要负责请求分发和...
本文将详细介绍泛型DAO模式在Java Web开发中的应用,包括泛型机制、JPA框架、Struts框架和Spring框架的使用。 一、泛型机制 Java 5.0版本引入了泛型机制,提供了一种解决方案,使用类型参数来代替Object类型的变量...
1. **Struts2**: Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,用于简化Java Web应用的开发。它提供了动作(Action)类来处理用户请求,并通过配置文件或注解来定义URL映射。Struts2提供了...
在Java开发领域,SSH(Struts2、Spring、Hibernate)是一个经典的MVC框架组合,用于构建企业级Web应用。SSH中的DAO(Data Access Object)层是数据访问层,负责与数据库进行交互。在这个主题中,我们将深入探讨"ssh...
总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...
泛型DAO(Data Access Object)是一种设计模式,用于抽象数据访问层的操作,提供通用的CRUD(Create, Read, Update, Delete)方法。通过泛型,DAO可以适用于多种类型的实体,降低了代码重复。例如,一个BaseDAO接口...
标题中的"SSH泛型DAO+Proxool+DisPlayTag+Jquery easyui"涉及到的是一个基于Spring、Struts和Hibernate(SSH)框架的Web应用开发中的几个关键技术和组件。让我们逐一深入探讨这些技术。 1. **Spring**: Spring 是...
在SSH2框架中,我们可以利用Spring的JdbcTemplate或MyBatis等工具来实现DAO层的泛型化。这些工具提供了强大的SQL执行能力,与泛型结合可以大大减少代码量,避免了重复的模板代码。例如,我们可以定义一个泛型方法`...
本文将详细探讨一款基于Spring、iBatis和Struts2框架的学校图书管理系统,它不仅包含了所有必要的jar包和数据库文件,还提供了泛型DAO接口定义,以供开发者参考和使用。 首先,Spring框架作为系统的核心,负责管理...
主要是泛型DAO的配置和应用。同时多数据库连接(权限数据库专门是一个库,业务数据至少一个库,利于权限功能分离和重用)。 版本信息:spring.net 1.2 ,NHibernate 2.0 .net 3.5 全部源码和一个较小的测试示例
Spring1.x对JDBC和ORM的支持相对较弱,而Spring2.x在这一领域有了显著增强,集成了更多ORM框架,如Hibernate、JPA等,提供了Template和DAO支持,简化了数据库操作。此外,还引入了Transaction API,使得事务管理...
在本项目中,"springmvc-jpa-springdata" 是一个基于Java的Web应用程序,它利用了Spring MVC、JPA(Java Persistence API)以及Hibernate作为JPA的具体实现,与PostgreSQL数据库进行数据交互。这个项目的核心是构建...
用spring4 mvc、spring security3、hibernate4、kapctha实现的用户登录系统。baseDao被放在了另外的项目中。因为对泛型不熟悉,多数方法放在Dao里面。简单说,很粗糙啦。
Spring框架的主要组成部分包括Spring IoC容器、Spring AOP、Spring MVC、Spring ORM、Spring JDBC、Spring DAO、Spring Web模块、Spring Context和Spring Web MVC等。 Spring的核心特性之一是依赖注入(DI)和控制...
Spring MVC、Hibernate 和 Spring 是Java开发中非常流行的三大框架,它们分别用于Web应用的视图控制器、对象关系映射和依赖注入。这个压缩包提供的案例是这三个框架的整合使用,涵盖了基本的CRUD(创建、读取、更新...
4. **数据访问集成**:Spring 2.0加强了与各种数据存储的集成,包括JDBC、Hibernate、JPA等,提供了模板类和DAO支持,简化了数据访问层的开发。 5. **Web服务支持**:Spring 2.0引入了Spring-WS项目,提供了一种...
例如,定义一个泛型DAO(Data Access Object)接口,可以针对不同的实体类提供统一的操作,减少代码重复。 在“ssh-template”这个项目中,我们可以假设它提供了一种模板方式来整合SSH框架,并且实现了泛型和反射的...