0 0

springside框架在IBATIS上如何实现的CRUD?10


现在我就拿这个方法做比喻:
	/**
	 * 新增对象
	 */
	public void insert(Object o) {
		getSqlMapClientTemplate().insert(o.getClass().getName() + POSTFIX_INSERT, o);
	}


IBATIS里面如果不去配置一个sqlmap写 insert语句,这个方法就能实现insert么? 不是很明白原理



他的泛型DAO如下:
package org.springside.core.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ibatis.common.util.PaginatedList;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.util.Assert;
import org.springside.core.dao.support.Page;

/**
 * IBatis Dao的泛型基类.
 * 

* 继承于Spring的SqlMapClientDaoSupport,提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换. * * @author suwei * @see SqlMapClientDaoSupport */ @SuppressWarnings("unchecked") public class IBatisGenericDao extends SqlMapClientDaoSupport { public static final String POSTFIX_INSERT = ".insert"; public static final String POSTFIX_UPDATE = ".update"; public static final String POSTFIX_DELETE = ".delete"; public static final String POSTFIX_DELETE_PRIAMARYKEY = ".deleteByPrimaryKey"; public static final String POSTFIX_SELECT = ".select"; public static final String POSTFIX_SELECTMAP = ".selectByMap"; public static final String POSTFIX_SELECTSQL = ".selectBySql"; public static final String POSTFIX_COUNT = ".count"; /** * 根据ID获取对象 */ public <t> T get(Class<t> entityClass, Serializable id) { T o = (T) getSqlMapClientTemplate().queryForObject(entityClass.getName() + POSTFIX_SELECT, id); if (o == null) throw new ObjectRetrievalFailureException(entityClass, id); return o; } /** * 获取全部对象 */ public <t> List<t> getAll(Class<t> entityClass) { return getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null); } /** * 新增对象 */ public void insert(Object o) { getSqlMapClientTemplate().insert(o.getClass().getName() + POSTFIX_INSERT, o); } /** * 保存对象 */ public void update(Object o) { getSqlMapClientTemplate().update(o.getClass().getName() + POSTFIX_UPDATE, o); } /** * 删除对象 */ public void remove(Object o) { getSqlMapClientTemplate().delete(o.getClass().getName() + POSTFIX_DELETE, o); } /** * 根据ID删除对象 */ public <t> void removeById(Class<t> entityClass, Serializable id) { getSqlMapClientTemplate().delete(entityClass.getName() + POSTFIX_DELETE_PRIAMARYKEY, id); } /** * map查询. * * @param map 包含各种属性的查询 */ public <t> List<t> find(Class<t> entityClass, Map map) { if (map == null) return this.getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null); else { map.put("findBy", "True"); return this.getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECTMAP, map); } } /** * sql 查询. * * @param sql 直接sql的语句(需要防止注入式攻击) */ public <t> List<t> find(Class<t> entityClass, String sql) { Assert.hasText(sql); if (StringUtils.isEmpty(sql)) return this.getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null); else return this.getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECTSQL, sql); } /** * 根据属性名和属性值查询对象. * * @return 符合条件的对象列表 */ public <t> List<t> findBy(Class<t> entityClass, String name, Object value) { Assert.hasText(name); Map map = new HashMap(); map.put(name, value); return find(entityClass, map); } /** * 根据属性名和属性值查询对象. * * @return 符合条件的唯一对象 */ public <t> T findUniqueBy(Class<t> entityClass, String name, Object value) { Assert.hasText(name); Map map = new HashMap(); try { PropertyUtils.getProperty(entityClass.newInstance(), name); map.put(name, value); map.put("findUniqueBy", "True"); return (T) getSqlMapClientTemplate().queryForObject(entityClass.getName() + POSTFIX_SELECTMAP, map); } catch (Exception e) { logger.error("Error when propertie on entity," + e.getMessage(), e.getCause()); return null; } } /** * 根据属性名和属性值以Like AnyWhere方式查询对象. */ public <t> List<t> findByLike(Class<t> entityClass, String name, String value) { Assert.hasText(name); Map map = new HashMap(); map.put(name, value); map.put("findLikeBy", "True"); return getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECTMAP, map); } /** * 判断对象某些属性的值在数据库中不存在重复 * * @param tableName 数据表名字 * @param names 在POJO里不能重复的属性列表,以逗号分割 如"name,loginid,password" FIXME how about in different schema? */ public boolean isNotUnique(Object entity, String tableName, String names) { try { String primarykey; Connection con = getSqlMapClient().getCurrentConnection(); ResultSet dbMetaData = con.getMetaData().getPrimaryKeys(con.getCatalog(), null, tableName); dbMetaData.next(); if (dbMetaData.getRow() > 0) { primarykey = dbMetaData.getString(4); if (names.indexOf(primarykey) > -1) return false; } else { return true; } } catch (SQLException e) { logger.error(e.getMessage(), e); return false; } return false; } /** * 分页查询函数,使用PaginatedList. * * @param pageNo 页号,从0开始. */ public Page pagedQuery(Class entityClass, Object parameterObject, int pageNo, int pageSize) { int startIndex = Page.getStartOfPage(pageNo, pageSize); Integer totalCount = (Integer) this.getSqlMapClientTemplate().queryForObject( entityClass.getName() + POSTFIX_COUNT, null); if (totalCount == null) return new Page(); List list; int totalPageCount=0; if (pageSize > 0 && pageNo > 0) { totalPageCount=(totalCount/pageSize); totalPageCount+=((totalCount%pageSize)>0)?1:0; list = getSqlMapClientTemplate().queryForPaginatedList(entityClass.getName() + POSTFIX_SELECT, parameterObject, pageSize); if (totalPageCount >= pageNo) { ((PaginatedList) list).gotoPage(pageNo); } else { // FIXME is this logic correct? // FIX list.size() error,use totalPageCount ((PaginatedList) list).gotoPage(totalPageCount-1); } } else { list = getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null); } return new Page(startIndex, totalCount, pageSize, list); } }

2008年8月31日 20:20

1个答案 按时间排序 按投票排序

0 0

我想可能有两种情况:
1.springside会自动生成你想要的xml文件。(可能性不是很大)
2.springside对ibatis封装了一层,因为ibatis会将所有的sql map映射文件生成相应的MappedStatement,放在sqlmapsession中。而我们可以通过反射机制提取出这个生成过程,也就是说可以动态生成你需要的insert功能。

不过,也不排除文档在某个地方会提到需要开发人员自己写.xml文件!

2008年9月01日 13:38

相关推荐

    springside框架

    SpringSide框架在整合上述技术的基础上,提供了完善的权限管理功能。这通常涉及到用户认证(Authentication)、授权(Authorization)以及角色(Role)和权限(Permission)的管理。通过集成Spring Security或Apache...

    SpringSide3框架

    SpringSide3框架,SpringSide3框架SpringSide3框架SpringSide3框架

    SpringSide安全框架demo实例

    在SpringSide安全框架中,认证通常通过实现UserDetailsService接口来完成。你可以自定义一个服务类,重写loadUserByUsername方法,将用户名与数据库中的用户信息进行匹配。这样,当用户尝试登录时,Spring Security...

    Springside-core-4.1.0/Springside-core-4.1.0

    《SpringSide核心库4.1.0...如果你在寻找一个稳定且易用的Java开发框架,SpringSide-core-4.1.0无疑是一个值得考虑的选择。同时,对于那些已经使用SpringSide的开发者,这个版本的更新和改进将带来更高效的开发体验。

    springside-3.2.2源码

    SpringSide 3.2.2 版本是一个成熟的版本,它在之前的版本基础上进行了优化和完善,为开发者提供了更稳定、更高效的支持。通过分析其源码,我们可以深入理解 SpringSide 的设计理念和实现方式,进一步提升我们的 Java...

    SpringSide

    ### SpringSide框架详解 #### 一、SpringSide框架概述 ...综上所述,SpringSide框架为企业级应用开发提供了一个全面且高效的解决方案,无论是对于新手还是有经验的开发者,都值得深入了解和应用。

    SpringSide4 参考手册

    Shiro Security框架部分则介绍了如何在SpringSide项目中进行安全控制。 在介绍了常规模块之后,文档还专门提供了一节关于加密技术的章节,包括消息摘要和加密方法,以及如何在SpringSide中使用Crypto组件。 ...

    springside开发全面讲解

    在学习springside的过程中,首先需要理解Spring框架的基本原理,包括依赖注入、AOP、事务管理等核心概念。然后,深入学习springside各模块的功能及使用方法,如如何配置和启动项目,如何进行模块间的通信等。最后,...

    有springside4.2.3-GA.jar 包

    在Java开发领域,SpringSide框架以其高效、灵活和强大的特性深受开发者喜爱。本文将围绕springside4.2.3-GA.jar这个核心组件,探讨其在Java应用中的重要作用以及如何利用它提升开发效率。 首先,我们需要理解什么是...

    springside5

    综上所述,SpringSide5的这些改动涵盖了数据库管理、持久层设计、安全架构、项目构建工具的使用以及用户界面的实现等多个IT领域的知识。这为开发者提供了一个全面的实践案例,展示了如何在实际项目中运用和整合这些...

    springside3.3.4 使用方法

    在Springside 3.3.4中,这些框架的整合非常自然且高效: 1. **Spring**: - Spring框架作为核心,主要负责业务逻辑层的管理。 - 它提供了IoC容器和AOP支持,使得开发人员可以专注于业务逻辑的编写而无需关心底层...

    springside3 框架实例

    SpringSide使用maven的archetype插件 进行项目生成,新版的archetype2.0插件比以往有了大幅提升。 SpringSide3.0在archtypes目录里存放使用Velocity语法的项目模板。

    springside全攻略

    《SpringSide全攻略》 SpringSide是一套针对Java开发者的学习指南,它全面涵盖了Spring框架及其周边生态系统的使用方法。...通过研究并实践SpringSide提供的示例,你将在Java开发领域迈上新的台阶。

    springside 架包

    《SpringSide框架详解》 SpringSide是基于Spring框架的一个开源项目,它为Java开发者提供了一套规范化的开发流程和最佳实践。"springside 架包"中的4.2.3.GA版本,代表着这是一个稳定且经过广泛测试的版本,为用户...

    springside3.0.zip

    《SpringSide 3.0:Java企业开发的高效框架指南》 SpringSide 3.0 是一个基于Spring框架的开源项目,旨在为Java开发者提供一套高效、简洁的开发规范和工具集。它不仅包含了Spring的核心模块,还整合了其他优秀的...

    springside4(showcase)

    在IT领域,SpringSide 4是一个备受推崇的开源项目,它是一个全面展示Spring框架及其生态系统的实战示例。标题"Springside4 (showcase)"暗示了这是一个以展示SpringSide 4核心特性和功能为主的应用实例,而"描述"中的...

    SpringSide3.3.4安装部署

    SpringSide3.3.4 安装部署是指在计算机上安装和部署 SpringSide3.3.4 软件的过程。在这个过程中,我们需要使用 Maven 工具来生成项目模板,安装 mini-web 应用程序,并配置相应的依赖项。下面我们将详细介绍 ...

    springside4-4.1.0.GA

    SpringSide 4.1.0.GA版本是该项目的一个稳定版本,它在前代的基础上进行了诸多优化与改进,旨在提供更高效、更稳定的开发环境。本文将深入探讨SpringSide 4.1.0.GA的关键特性、核心优势以及如何在实际项目中充分利用...

    springside-案例

    【标题】"springside-案例"所涉及的是SpringSide项目,这是一个开源的Java开发框架,旨在简化Spring框架的使用,提高开发效率。SpringSide是一个精心设计的、用于快速构建企业级应用的模板项目,它提供了清晰的代码...

    springside

    在实际应用中,SpringSide可以应用于各种场景,如开发企业级的Web应用、构建微服务、实现数据访问层的自动化等。通过熟练掌握SpringSide,开发者不仅可以提高开发效率,还能确保项目具有良好的可维护性和扩展性。 ...

Global site tag (gtag.js) - Google Analytics