`
魔力猫咪
  • 浏览: 107085 次
  • 来自: 北京
社区版块
存档分类
最新评论

工具框架“仓库猫”发布0.2重构版,希望大家多多试用,多多提意见和BUG

阅读更多
大家好,继上月底发布“仓库猫”0.1版后,猫咪在昨天发布0.2版。对整个框架结构进行了重构并修复了发现的BUG。欢迎大家下载试用。大家在使用中发现BUG或者有什么好的建议请和猫咪联络。
项目地址为http://code.google.com/p/catstorage/
分享到:
评论
3 楼 魔力猫咪 2009-08-21  
之所以叫仓库猫是因为第一,本人超级爱猫;第二,持久化部分在领域驱动设计中被称为“仓储”。所以就叫仓库猫了。
仓库猫已经发展到0.4版了,我这一两天就发布。也可以直接下载源代码。
2 楼 tangbo530 2009-08-21  
问一下你的这个框架为什么叫“仓库猫”。。。。
1 楼 魔力猫咪 2009-04-06  
下面我提供一个“仓库猫”和Spring集成的例子。这是猫咪正在编写的一个完整使用示例的一部分,该示例将于0.3版时一同发布。
本文使用了Spring MVC、Spring和Hibernate EntityManager分别作为3层的框架。如何创建工程和引用jar包我就不说了,这些东西大家应该都很熟悉。
首先是在Spring中编写“仓库猫”组件的配置。
<bean id="storage" class="org.miao.catstorage.Storage" init-method="config">
    <property name="resource" value="classpath:statement.json" />
</bean>

非常简单,要注意init-method方法和Resource属性。我这个例子的资源文件放在了classpath路径中,Spring能够自动找到它。
然后是编写一个持久化层的接口,我这个接口是我从一个以前编写的项目中修改来的,大家也可以提提建议,需要哪些方法。
/*
 *  @(#)Repository.java    0.1 06/04/2009
 */
package org.miao.repository;

import java.util.List;
import java.util.Map;

/**
 * 通用Repository接口对象
 * 规定了基本的持久化操作
 * @author Miao
 * @version 0.1
 * @since 0.1
 */
public interface Repository<T> {

    /**
     * 持久化指定对象
     * @param entity 持久化对象
     * @since 0.1
     */
    public void persist(T entity);

    /**
     * 持久化上下文受管
     * @param <T> 返回的受管对象类型
     * @param entity 要被上下文管理的对象
     * @return 受管对象
     * @since 0.1
     */
    public <T> T merge(T entity);

    /**
     * 移除受管对象
     * @param entity 移除的对象
     * @since 0.1
     */
    public void remove(T entity);

    /**
     * 移除受管对象
     * @param entityClass 指定类
     * @param id id主键
     * @since 0.1
     */
    public void remove(Class entityClass, Object id);

    /**
     * 判断该对象是否存在
     * @param entity 判断的对象
     * @return 是否存在
     * @since 0.1
     */
    public boolean contains(T entity);

    /**
     * 刷新受管对象状态
     * 从数据库更新受管对象
     * @param entity 刷新的对象
     * @since 0.1
     */
    public void refresh(T entity);

    /**
     * 刷新受管对象,更新数据库
     * @since 0.1
     */
    public void flush();

    /**
     * 清理上下文中的受管对象
     * @since 0.1
     */
    public void clear();

    /**
     * 查询指定类的指定对象
     * @param entityClass 指定类
     * @param id 主键
     * @return 对象
     * @since 0.1
     */
    public T find(Class entityClass, Object id);

    /**
     * 命名查询
     * @param name 命名名称
     * @return 对象列表
     * @since 0.1
     */
    public List<T> findByByNamedQuery(String name);
    
    /**
     * 带参数的命名查询
     * @param name 命名名称
     * @param parameters 参数
     * @return 对象列表
     * @since 0.1
     */
    public List<T> findByByNamedQuery(String name, Object... parameters);

    /**
     * 通过预定义语句查询
     * @param name 预定义语句名
     * @param parameters 参数
     * @return 对象列表
     * @since 0.1
     */
    public List<T> findByNamed(String name, Map<String, Object> parameters);

    /**
     * 通过预定义语句进行分页查询
     * @param name 预定义语句名
     * @param parameters 参数
     * @param currentPage 当前页
     * @param pageSize 单页记录数量
     * @return 分页组件
     * @since 0.1
     */
    public PageBean<T> findPageByNamed(String name, Map<String, Object> parameters, int currentPage, int pageSize);

    /**
     * 对对象使用读锁
     * @param entity 对象
     * @since 0.1
     */
    public void lockByRead(T entity);

    /**
     * 对对象使用写锁
     * @param entity 对象
     * @since 0.1
     */
    public void lockByWrite(T entity);
}

下面是其实现:
/*
 *  @(#)RepositoryImpl.java    0.1 06/04/2009
 */
package org.miao.repository;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import org.miao.catstorage.Storage;
import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.support.JpaDaoSupport;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 持久化仓储对象,实现了Repository接口
 * @author Miao
 * @version 0.1
 * @since 0.1
 */
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public class RepositoryImpl<T> extends JpaDaoSupport implements Repository<T> {

    /**
     * 用于对查询语句进行count统计的匹配正则表达式
     */
    private Pattern countRegex = Pattern.compile("(SELECT) +(\\w+) +(FROM.*)", Pattern.CASE_INSENSITIVE);
    /**
     * 预定义语句库
     */
    private Storage storage;

    @Transactional(readOnly = false)
    public void persist(T entity) {
        getJpaTemplate().persist(entity);
    }

    @Transactional(readOnly = false)
    public <T> T merge(T entity) {
        return getJpaTemplate().merge(entity);

    }

    @Transactional(readOnly = false)
    public void remove(T entity) {
        getJpaTemplate().remove(entity);
    }

    @Transactional(readOnly = false)
    public void remove(Class entityClass, Object id) {
        getJpaTemplate().remove(find(entityClass, id));
    }

    public boolean contains(T entity) {
        return getJpaTemplate().contains(entity);
    }

    @Transactional(readOnly = false)
    public void refresh(T entity) {
        getJpaTemplate().refresh(entity);
    }

    @Transactional(readOnly = false)
    public void flush() {
        getJpaTemplate().flush();
    }

    @Transactional(readOnly = false)
    public void clear() {
        getJpaTemplate().getEntityManager().clear();
    }

    public T find(Class entityClass, Object id) {
        return (T) getJpaTemplate().find(entityClass, id);
    }

    public List<T> findByByNamedQuery(String name) {
        return getJpaTemplate().findByNamedQuery(name);
    }

    public List<T> findByByNamedQuery(String name, Object... parameters) {
        return getJpaTemplate().findByNamedQuery(name, parameters);
    }

    public List<T> findByNamed(String name, Map<String, Object> parameters) {
        String statement = storage.get(name, parameters);
        if (statement != null) {
            return query(statement, parameters);
        } else {
            throw new PersistenceException("没有找到指定的预定义语句");

        }
    }

    public PageBean<T> findPageByNamed(String name, Map<String, Object> parameters, int currentPage, int pageSize) {
        String statement = storage.get(name, parameters);
        String countStatement = countRegex.matcher(statement).replaceAll("$1 count\\($2\\) $3");
        if (statement != null) {
            int first = PageBean.getFirstResult(currentPage, pageSize);
            long totalResult = (Long) queryStat(countStatement, parameters);
            return new PageBean<T>(currentPage, pageSize, totalResult, query(statement, parameters, first, pageSize));
        } else {
            throw new PersistenceException("没有找到指定的预定义语句");
        }
    }

    /**
     * 查询
     * @param statenemt 查询语句
     * @param parameters 参数
     * @return 查询结果
     * @since 0.1
     */
    private List<T> query(final String statenemt, final Map<String, Object> parameters) {
        return getJpaTemplate().executeFind(
                new JpaCallback() {

                    public Object doInJpa(EntityManager arg0) throws PersistenceException {
                        Query query = arg0.createQuery(statenemt);
                        Iterator<Entry<String, Object>> iterator = parameters.entrySet().iterator();
                        while (iterator.hasNext()) {
                            Entry<String, Object> entry = iterator.next();
                            query.setParameter(entry.getKey(), entry.getValue());
                        }
                        return query.getResultList();
                    }
                });
    }

    /**
     * 分页查询
     * @param statenemt 查询语句
     * @param parameters 参数
     * @param first 起始记录
     * @param pageSize 单页记录数量
     * @return 查询结果
     * @since 0.1
     */
    private List<T> query(final String statenemt, final Map<String, Object> parameters, final int first, final int pageSize) {
        return getJpaTemplate().executeFind(
                new JpaCallback() {

                    public Object doInJpa(EntityManager arg0) throws PersistenceException {
                        Query query = arg0.createQuery(statenemt);
                        Iterator<Entry<String, Object>> iterator = parameters.entrySet().iterator();
                        while (iterator.hasNext()) {
                            Entry<String, Object> entry = iterator.next();
                            query.setParameter(entry.getKey(), entry.getValue());
                        }
                        return query.setFirstResult(first).setMaxResults(pageSize).getResultList();
                    }
                });
    }

    /**
     * 统计查询
     * @param statStatenemt 统计查询语句
     * @param parameters 参数
     * @return 查询结果
     * @since 0.1
     */
    private Object queryStat(final String statStatenemt, final Map<String, Object> parameters) {
        return getJpaTemplate().executeFind(
                new JpaCallback() {

                    public Object doInJpa(EntityManager arg0) throws PersistenceException {
                        Query query = arg0.createQuery(statStatenemt);
                        Iterator<Entry<String, Object>> iterator = parameters.entrySet().iterator();
                        while (iterator.hasNext()) {
                            Entry<String, Object> entry = iterator.next();
                            query.setParameter(entry.getKey(), entry.getValue());
                        }
                        return query.getSingleResult();
                    }
                });
    }

    @Transactional(readOnly = false)
    public void lockByRead(T entity) {
        getJpaTemplate().getEntityManager().lock(entity, LockModeType.READ);
    }

    @Transactional(readOnly = false)
    public void lockByWrite(T entity) {
        getJpaTemplate().getEntityManager().lock(entity, LockModeType.WRITE);
    }

    /**
     * 获得预定义语句库
     * @return 预定义语句库
     * @since 0.1
     */
    public Storage getStorage() {
        return storage;
    }

    /**
     * 设置预定义语句库
     * @param storage 预定义语句库
     * @since 0.1
     */
    public void setStorage(Storage storage) {
        this.storage = storage;
    }
}

该实现使用了Spring的JpaDaoSupport?类,最后在配置文件中把它配置好。
<bean id="repository" class="org.miao.repository.RepositoryImpl">
    <property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>



我本来打算用注释来处理这个Bean,但是entityManagerFactory我无法自动注入,可能是因为JpaDaoSupport?里没有采用注释的原因。 总的来说,在Spring中集成“仓库猫”是非常简单的事情,大家有什么疑问和建议,请和我联系。

相关推荐

    WebDW0.2版本隆重发布,敬请下载试用

    对于压缩包中的"webdw0.2发布版本",这通常包含了安装程序或可执行文件,以及可能的文档、示例代码和许可证文件。安装程序将引导用户完成软件的安装过程,文档可能包含详细的使用指南和技术参考,示例代码能帮助用户...

    git开发工具Git-2.24.0.2-64-bit

    Git是世界上最流行的分布式版本控制系统,它允许开发者跟踪和管理代码变更,协同开发项目。"Git-2.24.0.2-64-bit" 是Git的一个特定版本,适用于64位操作系统。这个版本可能包含了性能优化、新功能以及已知问题的修复...

    禅道,BUG提交工具

    首先,BUG提交工具是软件开发过程中不可或缺的一部分,它帮助团队跟踪、记录和解决软件中的问题。禅道在这方面表现出色,它的缺陷管理模块提供了一个直观且易用的界面,使得测试人员能够方便地提交新的BUG,并提供...

    kafka-manager-2.0.0.2.zip

    《Kafka Manager 2.0.0.2:全面解析与应用》 Kafka Manager,一个强大的开源工具,专为管理Apache Kafka集群而设计。它提供了直观的Web界面,使得监控和管理Kafka消息队列变得简单易行。在本文中,我们将深入探讨...

    QFramer UI框架之重构版.rar

    QFramer UI框架是一款专为Qt开发者设计的高级界面库,旨在...总之,QFramer UI框架之重构版是Qt开发者的一个强大工具,它能简化界面开发,提高开发效率,同时重构带来的性能提升和代码质量优化,使得项目更具备竞争力。

    ASP.NET源码——[CMS程序]普迅免费CMS v0.2 发布版.zip

    10. **版本控制**:v0.2的发布版表明软件经过了一定程度的迭代和改进,可能包括bug修复、性能优化以及新功能的添加。 总的来说,这个压缩包提供的源码是一个学习ASP.NET开发、CMS系统设计和Web应用程序实践的好资源...

    FreeBug(Bug管理) v0.2.rar

    借鉴微软公司软件研发理念、免费且开放源代码、基于Web的精简版Bug管理系统 v0.2更新: 全新的界面设计,更加美观大方 用Smarty技术把HTML和PHP代码分开,代码很清晰,易于维护 多语言支持,目前可以选择英文界面 ...

    LvglImgTool_V0.2.rar

    因V0.1版本的RGB565和RGB565SW格式显示不正确,现更新V0.2版本。 工具使用说明: 1、打开图片可使用文件菜单,或直接拖动图片到本工具。 2、保存图片可使用文件菜单,或直接点击打开的图片来保存。 3、选择保存的...

    DELPHI源码分析抽取工具 V0.2

    《DELPHI源码分析抽取工具 V0.2》是一款专为Delphi编程语言设计的源码分析工具,主要用于帮助开发者理解和梳理Delphi程序的代码结构。本文将深入探讨该工具的功能、工作原理以及它在Delphi源码分析中的应用。 1. **...

    日常bug跟踪记录工具

    标题中的“日常bug跟踪记录工具”指的是一个专门用于在软件开发过程中记录和追踪问题的应用程序。这类工具对于软件团队来说非常重要,因为它可以帮助他们系统地管理缺陷,确保每个问题都能得到及时有效的解决。在这...

    EHLIB 3.4的中式金额显示,LZQ版, V0.2(试用版)安装包fOr D6

    增加了EHCURRENCY.PAS,所以你应在EhLib**.DPK中包含EHCURRENCY.PAS,现提供D6下的BPL安装包供大家测试做得相当仓促,有很多BUG,也没经长时间的使用测试,希望使用者多提意见,并不断完善,并在完善后给我个信息,让...

    RTKLIB最新版本的RTKPLOT重构版,修改了官方发布的bug

    在最新版本的RTKPLOT重构版中,对官方发布的bug进行了修复,提高了软件的稳定性和用户体验。 1. 绘制卫星的天空图:这个功能展示了当前观测到的卫星在天空中的位置,以极坐标的形式表示。用户可以清晰地看到各个...

    myeclipse检查bug工具

    【标题】"myeclipse检查bug工具"是一个针对Eclipse和MyEclipse开发环境的插件,用于自动化地检测和修复代码中的错误和潜在问题。这个工具极大地提升了开发者的工作效率,减少了手动查找和修复bug的时间。 【描述】...

    禅道bug管理工具

    禅道Bug管理工具是一款专为软件开发团队设计的项目管理软件,它集成了产品管理、项目管理、质量管理、文档管理、需求管理、缺陷管理、发布管理、代码审查等多个功能模块,其中Bug管理是其核心特色之一。这款工具的...

    bug管理工具BugTracker10

    bug管理工具BugTracker10,支持B/S

    bugfree管理工具

    BugFree是一款开源的缺陷跟踪系统,专为软件开发团队设计,用于有效管理和追踪项目中的bug。这个工具旨在提供一个简洁、易用的界面,帮助团队成员协调工作,提高开发效率,确保产品质量。"bugfree管理工具"的标题...

    Postman Interceptor for Chrome 0.2.26

    在0.2.26_0版本中,可能包含了性能优化和一些bug修复,以提供更稳定、流畅的用户体验。 安装Postman Interceptor非常简单,正如描述中提到的那样。首先,你需要打开Chrome浏览器的扩展程序管理页面(chrome://...

    kafka-manager(CMAK)-2.0.0.2.zip

    此外,这个版本可能还包含了一些性能优化和bug修复,使得CMAK在处理大规模集群时更加稳定和高效。对于那些管理多个Kafka集群的大型企业来说,这种稳定性与易用性的提升无疑是一大福音。 在实际使用中,用户需要根据...

    虚拟串口转TCP/UDP工具 V1.0.0.2

    创建虚拟串口,并可将发往虚拟串口的数据往...2.修复添加删除虚拟串口时软件崩溃的Bug。 3.取消双击窗体变最大化。 4.异步升级检测功能,提升软件启动速度。 5.修复虚拟串口网络为Server时接收到的数据不往串口传输。

    MW6208E_8208量产工具_1.2.0.2beta_20090302

    这个工具的版本号为1.2.0.2beta,表明它是一个测试版,发布日期为2009年3月2日,意味着可能包含一些实验性的功能和优化,同时也可能存在一些未解决的bug。 量产工具的主要功能包括: 1. **格式化**:可以对USB设备...

Global site tag (gtag.js) - Google Analytics