随着缓存技术的引入,网站前台的检索速度大大提高,随之而来的一个问题是检索。通常的经验都是写几个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;
}
}
分享到:
相关推荐
这一规范的核心目标是简化Java应用程序中的数据缓存使用,它为数据的存储、检索和管理提供了一组通用的API。随着互联网应用的发展,系统需要处理的数据量日益庞大,对缓存的需求也越来越高,因此,像JSR107这样的...
总之,Lotus Web Content Management v6.1.5.0 API Specification是一个全面的开发指南,它涵盖了所有与WCM系统交互的必要细节。开发者通过深入学习和利用这个API,可以充分利用WCM的功能,构建出满足业务需求的高效...
- **数据层**:负责存储和检索数据,可以是数据库、XML文件等多种形式的数据源。 - **业务逻辑层**:处理业务逻辑,如查询数据库、管理数据等,并将数据传递给表示层。 - **表示层**:即用户界面层,负责展示数据和...
标题和描述中所提到的“TMF637_Product_Inventory_Management_API_REST_Specification_R19.0.0”是一个标准文档,它由TMForum发布,文档编号为TMF637,版本为19.0.0,日期为2019年6月。该文档规范定义了一个使用REST...
这些接口和类允许开发者方便地在应用中集成缓存功能,如存储和检索数据、设置过期策略、处理并发访问等。通过使用这个API,开发者可以避免直接依赖特定的缓存实现,比如Ehcache或Guava Cache,从而提高了代码的可...
9. **懒加载(Lazy Loading)**:JPA支持延迟加载,允许在需要时才加载关联的对象,避免了不必要的数据检索,优化了性能。 10. **转换和事件**:JPA提供了转换器(Converter)接口,允许自定义属性的序列化和反序列...
- **性能优化**:通过高效的内存管理和数据缓存策略提高性能。 ##### 2. 邮件会话管理 - **Session类**:是JavaMail API的核心组件之一,用于管理邮件会话。通过配置属性可以设置不同的邮件服务提供商。 - **获取...
5. **数据库交互**:中小型企业网站通常需要存储和检索数据,因此需要了解如何使用ADO.NET或Entity Framework进行数据库操作,如SQL查询、事务处理、数据验证等。 6. **安全性**:网站安全包括身份验证、授权、防止...
6. **ASP.NET Cache Service**:缓存机制提高了数据检索速度,减少了对数据库的依赖。 7. **ASP.NET Deployment**:简化了应用程序的部署,如使用XCOPY部署,使得安装和更新更为便捷。 Web Service,另一方面,是一...
(1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...
这段代码将获取“myapp”的缓存和配置目录,允许开发者安全地存储和检索数据。 5. **项目结构** 压缩包中的文件“gohome-master”可能包含了项目的源代码、测试文件、文档、示例等。通常,一个开源项目会包含如下...
通过Pageable对象,可以轻松实现数据的分页检索,并且能根据指定的字段进行排序。 八、动态查询 Spring Data JPA的动态查询功能允许开发者在运行时构建查询,例如通过Specification接口,可以创建复杂的查询条件,...
1. **信息处理(Information Processing)**:指通过计算机系统对数据进行收集、存储、加工、传输和检索的过程。 2. **通用计算机(General-purpose Machine)**:设计用于执行各种不同类型任务的计算机,能够适应...
- 存储和检索数据。 - 性能优化。 #### 41. 使用 DataSet 进行数据处理 - **概念**:`DataSet`是一个内存中的数据容器。 - **应用场景**: - 数据查询。 - 数据缓存。 #### 42. 使用 Attributes - **概念**:...
11. **portlet模式和状态**:portlet可以处于多种模式,如编辑、帮助和查看模式,每种模式对应不同的用户交互。此外,portlet窗口可以有多种状态,如最大化、正常和最小化。 12. **缓存管理**:portlet可以通过API...
通过使用PL/SQL,开发人员能够创建复杂的应用程序逻辑、业务规则以及数据处理流程,同时还能充分利用数据库的高性能特性。PL/SQL包和类型是PL/SQL的核心组成部分,它们对于构建高效、可维护的数据库应用程序至关重要。 ...
- **DataSet**:用于存储从数据库检索出的数据的内存缓存。 - **DataTable**:表示数据表的对象,包含行和列。 - **DataRow**:表示表中一行的数据。 - **DataColumn**:表示表中的一列。 - **DataRelation**:表示...
- **DataSet**: 一种内存中的数据缓存机制,用于存储从数据库检索的数据。 - **DataCommand**: 提供了执行SQL命令的能力。 - **DataAdapter**: 数据适配器,用于在数据源和DataSet之间建立桥梁。 ### 15. ASP.NET的...