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

工具框架“仓库猫”发布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中集成“仓库猫”是非常简单的事情,大家有什么疑问和建议,请和我联系。

相关推荐

    FreeBug(Bug管理) v0.2.rar

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

    禅道,BUG提交工具

    测试专用开源工具,非常好用,界面简洁,免费,欢迎下载

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

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

    bug 管理工具mantis

    bug 管理工具mantis 请大家多多支持

    bug管理工具BugTracker10

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

    java框架bug处理大全

    java 框架 bug处理 大全

    DsoFramer V2.3.0.2

    之前承诺完成修改后免费发布到csdn上,以分享个人心得,今天终于可以完成兑现承诺,再次感谢之前无私奉献源码的朋友,谢谢! ///////////////////////////////////////////////////// Issued by dxHe on Jun 19,...

    Android分析Bugreport开源工具

    ChkBugReport是一个用于分析android的bugreport的开源工具,它可以把你得到的bugreprot导出成适合阅读的html。导出的html文件包含了根据bugreport数据得出的图表和分析结论,主要包括进程内存占用信息、程序ANR或...

    禅道bug管理工具

    禅道bug管理工具

    LvglImgTool_V0.2.rar

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

    ArcGIS简化面工具Bug修复工具

    此工具为ArcGIS简化面工具,适用于ArcGIS 10.0-ArcGIS 10.5,可用于对ArcGIS中自带简化线工具进行修复。 使用时,直接将 工具箱.tbx拖入ArcToolBox即可添加到ArcToolBox,或者在ArcToolBox中右键/添加工具箱 进行添加...

    check bugreport自动分析bugreport工具

    自动分析bugreport的工具,github开源项目

    firefox bug (调试工具)

    firefox bug (调试工具) 工具-&gt;附件添加

    发布ezWinCE 0.2 Bate

    ========================================== 2008-07-09 0.2 Bate &lt;br&gt;1.将原静态链接Lib改为动态链接 2.添加一些有用的类 3.修改了类库的初始化方法 4.增加了对于WinCE的支持,现在支持三种平台...

    bugfree2.0软件测试bug管理工具

    bugfree2.0是一款开源的bug管理工具,部署方便,只需下载xampp安装apche和mysql服务即可

    免费开源最新版FileZilla Client 3.6.0.2

    可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户端工具,而FileZilla Server则是一个小巧并且可靠的支持FTP&SFTP的FTP服务器软件。 目录 简介 基本信息 功能 使用说明...

    yaf框架开发包含多种bug

    debug总结:yaf框架开发包含多种bug,这俩上传了压缩文件包含bug的各种问题以供大家探讨

    bugfree缺陷管理工具

    bugfree缺陷管理工具

    完美ui前台框架Qui v3.3试用版

    QUI 框架的组件库包含近百种组件,并且为每一种组件都制作了大量的典型示例,充分展示组件的各种应用场景,完全能够满足企业前端应用...如果发现bug,可以提交问题,QUI 框架将会持续进行更新来修复bug和增加新的特性。

    6种BUG工具的对比

    6种BUG工具的对比:TestCenter(TestCenter Free与TestCenter) Test track pro Bugzilla EasyBUG Mantis URTracker TestLink

Global site tag (gtag.js) - Google Analytics