`
sing100star
  • 浏览: 28548 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用Specification模式检索缓存数据

 
阅读更多

    随着缓存技术的引入,网站前台的检索速度大大提高,随之而来的一个问题是检索。通常的经验都是写几个Sql语句,但是现在不同,我们需要从内存中检索数据。如何解决呢?我的方式是使用Specification模式

    Specification模式 把 每一个检索条件转化为对象。我们可以对象进行组合,然后对内存数据进行筛选,这样就可以达到目的。

     为什么要采用Specification,因为Specification可让开发人员专注于 【检索条件】的使用。

     下面给个例子,供大家参考,源代码在附件

    1、年龄规约

public class AgeSpecification extends CompositeSpecification<Member> {
    private Integer begin;
    private Integer end;

    public AgeSpecification(Integer begin,Integer end){
        if(begin == null) {
            this.begin  = 0;
        }else{
            this.begin = begin;
        }
        if(end == null){
            this.end = Integer.MAX_VALUE;
        }else{
            this.end  = end;
        }
    }
    public boolean isSatisfiedBy(Member obj) {
        return obj.getAge() >=begin && obj.getAge() <= end;
    }
}

    2、姓名规约

public class NameSpecification extends CompositeSpecification<Member> {
    private String words;
    public NameSpecification(String s) {
        words = s;
    }
    public boolean isSatisfiedBy(Member obj) {
        if(words == null || "".endsWith(words.trim())) return true;
        return obj.getName().contains(words);
    }
}

    3、自定义规约

public class ExpressionSpecification<T> extends CompositeSpecification<T>{
    private ExpressionCallback<T> ecp;
    public ExpressionSpecification(ExpressionCallback<T> ecp) {
        this.ecp = ecp;
    }
    public boolean isSatisfiedBy(T obj) {
        return ecp.match(obj);
    }
}
public interface ExpressionCallback<T> {
    public boolean match(T obj);
}

   4、检索的目标对象

public class Member {
    private String name;
    private int age;
    private String mobile;
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public Member(String name,int age,String mobile){
        this.name =name;
        this.age = age;
        this.mobile = mobile;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public String toString(){
        return "姓名:"+ name +" "+"年龄:" + age +" "+"电话:" + mobile;
    }
}

    4、测试类

public class TestMemberSearch {
    private List<Member> members;

    @Before
    public void setUp() {
        members = new LinkedList<Member>();
        members.add(new Member("张三", 1, "15013243543"));
        members.add(new Member("李四", 2, "13013243743"));
        members.add(new Member("王武", 3, "18613223243"));
        members.add(new Member("找刘", 4, "18112243245"));
        members.add(new Member("李八", 5, "13901243647"));
        members.add(new Member("星七", 6, "18813223272"));
        members.add(new Member("孙虎", 7, "139263246243"));
        members.add(new Member("刘琦", 8, "155213243242"));
        members.add(new Member("张二天", 9, "150132438755"));
        members.add(new Member("欧阳一清", 10, "13701323249"));
        members.add(new Member("尧度", 11, "13913243248"));
        members.add(new Member("真天", 12, "15213243283"));
        members.add(new Member("海星", 13, "15713243283"));

        members.add(new Member("范天", 15, "1361323243"));
        members.add(new Member("林海", 14, "17013243943"));

        members.add(new Member("杨波", 16, "15013243243"));
        members.add(new Member("青檬", 17, "15013243243"));
        members.add(new Member("赵志", 18, "15013243243"));
        members.add(new Member("得人", 19, "15013243243"));

    }
    @After
    public void tearDown() {
        members = null;
    }

    @Test
    public void testFindByAgeWhichIsBetween10And20() {
        Specification<Member> s1 = new AgeSpecification(10, 20);
        assertEquals(10, filter(members, s1).size());
    }

    @Test
    public void testFindByName() {
        Specification<Member> s1 = new AgeSpecification(10, 20);
        assertEquals(10, filter(members, s1).size());

    }

    @Test
    public void testFindByAgeAndName() {
        Specification<Member> age = new AgeSpecification(10, 20);
        Specification<Member> name = new NameSpecification("赵");
        Specification<Member> findByAgeAndName = age.and(name);
        assertEquals(1, filter(members, findByAgeAndName).size());
    }

    @Test
    public void testFindByExpression() {
        Specification<Member> expressionSpeci = new ExpressionSpecification<Member>(new ExpressionCallback<Member>() {
            public boolean match(Member obj) {
                return obj.getName().startsWith("赵");
            }
        });
        assertEquals(1, filter(members, expressionSpeci).size());
    }

    private static <T> List<T> filter(Collection<T> list, Specification<T> s) {
        List<T> lists = new LinkedList<T>();
        for (T t : list) {
            if (s.isSatisfiedBy(t)) {
                lists.add(t);
            }
        }
        return lists;
    }

}
 
分享到:
评论

相关推荐

    JSR107 Specification 1.1.1.pdf

    这一规范的核心目标是简化Java应用程序中的数据缓存使用,它为数据的存储、检索和管理提供了一组通用的API。随着互联网应用的发展,系统需要处理的数据量日益庞大,对缓存的需求也越来越高,因此,像JSR107这样的...

    Lotus Web Content Management, v6.1.5.0 API Specification

    总之,Lotus Web Content Management v6.1.5.0 API Specification是一个全面的开发指南,它涵盖了所有与WCM系统交互的必要细节。开发者通过深入学习和利用这个API,可以充分利用WCM的功能,构建出满足业务需求的高效...

    基于ASP_NET的网上购物系统的设计与实现.pdf

    - **数据层**:负责存储和检索数据,可以是数据库、XML文件等多种形式的数据源。 - **业务逻辑层**:处理业务逻辑,如查询数据库、管理数据等,并将数据传递给表示层。 - **表示层**:即用户界面层,负责展示数据和...

    TMF637_Product_Inventory_Management_API_REST_Specification_R19.0.0.pdf

    标题和描述中所提到的“TMF637_Product_Inventory_Management_API_REST_Specification_R19.0.0”是一个标准文档,它由TMForum发布,文档编号为TMF637,版本为19.0.0,日期为2019年6月。该文档规范定义了一个使用REST...

    cache-api-1.0.0.jar

    这些接口和类允许开发者方便地在应用中集成缓存功能,如存储和检索数据、设置过期策略、处理并发访问等。通过使用这个API,开发者可以避免直接依赖特定的缓存实现,比如Ehcache或Guava Cache,从而提高了代码的可...

    JSR-000317 Persistence Specification Final 2.0 Final Release

    9. **懒加载(Lazy Loading)**:JPA支持延迟加载,允许在需要时才加载关联的对象,避免了不必要的数据检索,优化了性能。 10. **转换和事件**:JPA提供了转换器(Converter)接口,允许自定义属性的序列化和反序列...

    JavaMail API Design Specification

    - **性能优化**:通过高效的内存管理和数据缓存策略提高性能。 ##### 2. 邮件会话管理 - **Session类**:是JavaMail API的核心组件之一,用于管理邮件会话。通过配置属性可以设置不同的邮件服务提供商。 - **获取...

    C#中小型企业网站

    5. **数据库交互**:中小型企业网站通常需要存储和检索数据,因此需要了解如何使用ADO.NET或Entity Framework进行数据库操作,如SQL查询、事务处理、数据验证等。 6. **安全性**:网站安全包括身份验证、授权、防止...

    asp.net与webservice实例剖析

    6. **ASP.NET Cache Service**:缓存机制提高了数据检索速度,减少了对数据库的依赖。 7. **ASP.NET Deployment**:简化了应用程序的部署,如使用XCOPY部署,使得安装和更新更为便捷。 Web Service,另一方面,是一...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    (1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...

    开源项目-caarlos0-gohome.zip

    这段代码将获取“myapp”的缓存和配置目录,允许开发者安全地存储和检索数据。 5. **项目结构** 压缩包中的文件“gohome-master”可能包含了项目的源代码、测试文件、文档、示例等。通常,一个开源项目会包含如下...

    spring-data-JPA帮助文档

    通过Pageable对象,可以轻松实现数据的分页检索,并且能根据指定的字段进行排序。 八、动态查询 Spring Data JPA的动态查询功能允许开发者在运行时构建查询,例如通过Specification接口,可以创建复杂的查询条件,...

    计算机英语专业词组.doc

    1. **信息处理(Information Processing)**:指通过计算机系统对数据进行收集、存储、加工、传输和检索的过程。 2. **通用计算机(General-purpose Machine)**:设计用于执行各种不同类型任务的计算机,能够适应...

    提高C#编程50要点

    - 存储和检索数据。 - 性能优化。 #### 41. 使用 DataSet 进行数据处理 - **概念**:`DataSet`是一个内存中的数据容器。 - **应用场景**: - 数据查询。 - 数据缓存。 #### 42. 使用 Attributes - **概念**:...

    portlet 2.0 api doc

    11. **portlet模式和状态**:portlet可以处于多种模式,如编辑、帮助和查看模式,每种模式对应不同的用户交互。此外,portlet窗口可以有多种状态,如最大化、正常和最小化。 12. **缓存管理**:portlet可以通过API...

    Oracle Database PLSQL Packages and Types Reference 12c

    通过使用PL/SQL,开发人员能够创建复杂的应用程序逻辑、业务规则以及数据处理流程,同时还能充分利用数据库的高性能特性。PL/SQL包和类型是PL/SQL的核心组成部分,它们对于构建高效、可维护的数据库应用程序至关重要。 ...

    asp.net面试大全

    - **DataSet**:用于存储从数据库检索出的数据的内存缓存。 - **DataTable**:表示数据表的对象,包含行和列。 - **DataRow**:表示表中一行的数据。 - **DataColumn**:表示表中的一列。 - **DataRelation**:表示...

    ASP.NET面试题1

    - **DataSet**: 一种内存中的数据缓存机制,用于存储从数据库检索的数据。 - **DataCommand**: 提供了执行SQL命令的能力。 - **DataAdapter**: 数据适配器,用于在数据源和DataSet之间建立桥梁。 ### 15. ASP.NET的...

Global site tag (gtag.js) - Google Analytics