Spring Data、MongoDB、Thymeleaf的数据持久化方案及分页技术实现

2017-10-18 01:28
陇东学院学报 2017年5期
关键词:关系数据库调用开发者

唐 炜

(陇东学院 信息中心,甘肃 庆阳 745000)

Spring Data、MongoDB、Thymeleaf的数据持久化方案及分页技术实现

唐 炜

(陇东学院 信息中心,甘肃 庆阳 745000)

数据持久化是大多数软件系统业务部分的核心,软件开发者对于开发框架的选择其数据持久化部分的影响显得非常重要,Spring Data已经发展了一段时间了,但是随着其不断地更新,其功能变得越来越复杂和强大。借助于Spring Boot创建一个软件开发环境,整合Spring Data,以Spring Data实现数据持久化工作,采用MongoDB为数据库,并通过Spring Data提供的接口API访问数据并实现数据分页,最后数据展示通过Thymeleaf和Spring的整合实现。Thymeleaf模板技术是一种相对比较新的技术,较之前的Freemaker和Velocity模板技术是有了很大进步,目前这方面的文献资料比较少。

Spring Data;Thymeleaf;MongoDB;数据分页

Abstract: Data persistence is the core of most software system.The developers’ choice of development framework is impacted by the part of data persistence.Spring Data has been developing for some time,but as it continues to update,the function becomes more and more complex and powerful.In this paper,by using Spring Boot,we aim to build a development environment and integrate Spring Data and MongoDB database,and then implement data persistence and data paging.Research Spring Data is very important to the developers who develop software based on Spring Framework.Thymeleaf template‘s technology is revolution for Free maker and Velocity template’s technology.Presently there are few literatures in this field.

Keywords: Spring Data;Thymeleaf;MongoDB;data paging

Spring(2010)[1,8]是目前JAVA软件工程里面最流行的企业级开发框架[2],Spring Data(2016)[3,9]是Spring的核心项目之一,其目的是实现统一标准的数据持久化技术,开发人员在面对各种数据持久化技术例如关系数据库和NoSQL(2010)[4]数据库、Oracle和Mysql时,其CRUD操作是一致的,使得软件工程中DAO层操作统一,开发者不用关心具体的数据库技术,集中精力在软件开发的业务模型上,Spring Data不仅提供了统一的JPA操作,同时也提供了Map-reduce操作。图1中描述了Spring Data整个体系。虽然Spring Data提供了诸如PagingAndSortingRepository这样的接口,开发者利用这样的接口传递Pageable参数实现分页,但是要实现数据分页,我们的程序还是需要做一定的工作,目前最常见的是直接利用Pageable作为查询条件参数实现分页,这样里面会存在一些问题,例如:每次需要传递数据页码,并对参数进行一定的处理,一些文献中提出了分页实现的解决方案但是没有说清楚这种处理方式[5-6]。本文不仅详细解释实现了数据分页,同时对参数处理进行了一些特别的处理,同时利用Thymeleaf[8]技术实现分页模块化定制,开发人员可以利用Thymeleaf中的fragment在任何地方调用自己定义的不同的分页片段。

图1 Spring Data体系

1 Spring Data与MongoDB、Thymeleaf介绍

1.1SpringData

Spring Data实现了仓库存储对象映射为自定义对象,这一点上Spring Data与Hibernate有点类似,只不过Spring Data不需要在每个对象属性里面详细描述映射到仓库中对应的字段。Spring Data利用在Repository中使用属性名实现条件查询,例如要查询所有记录Repository接口中需要编写findAll()方法,但是不需要写具体的实现,Spring Data会自动构建实现方法。如果Domain有name属性,那么查询条件为name的所有记录方法应该写成findByName(String name);可以通过xml文件或者JavaConfig集成Spring Data到项目中。

1.2MongoDB

MongoDB[11]是一种NoSQL数据库,基于分布式文件存储的数据库,MonogDB目前已经运用于工业环境中,自大数据时代以来,存储系统横向扩展以及高性能的要求使得关系数据库的历史地位正在被非关系数据库取代。非关系数据的流行对软件开发者提出了新的要求,原来基于关系数据库的设计思路不能很好地体现非关系数据库的优点。

1.3Thymeleaf

Thymeleaf是目前Java Web开发最先进的模板技术,相比较其他模板技术例如Freemaker、Velocity[11],Thymeleaf使得HTML里面嵌入Thymeleaf的代码不会影响HTML原来的表现,HTML代码也不会干扰Thymeleaf在程运行时的表现,Spring Framework已经集成了Thymeleaf,开发基于Spring Framework的软件系统,利用Thymeleaf将会极大地提高开发速度,同时完美地实现页面渲染,利用Thymeleaf模板技术可以解决在不同的开发环境例如Windows系统和linux系统、IntellijIdea和Eclipse时与程序运行不同环境时资源文件路径的问题。

2 系统设计

我们设计了一个简单的软件系统,它符合MVC的设计思路,同时在架构方面也符合Restful的SOA要求,软件系统包含了Controller层、Service层、Repository、Domain,业务逻辑方面通过Controller控制系统运行,同时实现Restful的Web Service,在Controller里面调用Service方法,Service方法通过Repository实现对数据的控制。运行流程如图2所示:

图2 系统运行流程图

3 系统实现

3.1工程项目中引入SpringData

引入MongoDB作为数据持久化的方案,MongoDB已经是现在最流行的NoSQL数据库。

3.2Repository接口

项目中的Repository继承Spring Data的Repository接口,Spring Data提供的

Repository接口比较多,本文继承了PagingAndSortingRepository接口。

BaseRepository.java:

import org.springframework.data.repository.PagingAndSortingRepository;

public interface BaseRepository extends

PagingAndSortingRepository {

T findById(ID id);

}

DemoRepository.java:

public interface DemoRepository extends BaseRepository {

}

3.3Service层

Service层编写了一个统一接口BaseService.java:

public interface BaseService

Page findAll(Pageable pageable);

}

BaseServiceImpl.java:

public class BaseServiceImpl {

@Autowired

private JPA jpa;

public Page findAll(Pageable pageable){

return this.jpa.findAll(pageable);

}

}

DemoService.java:

public interface DemoService extends BaseService {

}

DemoServiceImpl.java:

@Service

public class DemoServiceImpl extends BaseServiceImpl implements DemoService {

@Autowired(required=true)

private DemoRepository repository;

public Demo findById(String id){

return this.repository.findOne(id);

}

}

查询所有数据可以在Service层中调用findAll(Pageable pageable)方法。

3.4Controller层

Controller里面不仅实现了对数据分页查询,而且同时也实现了自定义排序。

@Controller

public class DemoController {

@Autowired

private DemoService demoService;

@RequestMapping(value="/**",method=RequestMethod.GET)

public ModelAndView get(Model model,Pageable pageable)

{

ModelAndView mv=new ModelAndView(“demo”);

Sort sort=new Sort(Sort.Direction.DESC,“demo”);

Pageable p=new PageRequest(pageable.getPageNumber(),5,sort);

PageWrapper page=new PageWrapper

(this.demoService.findAll(p),"/demo");

model.addAttribute(“page”,page);

return mv;

}

}

3.5Utils:PageWrapper.java

为了更好地实现分页功能,需要编写一个PageWrapper.java实现对分页对象的封装。

public class PageWrapper {

public static final int MAX_PAGE_ITEM_DISPLAY=10;

private Page page;

private List items;

private int currentNumber;

private String url;

public String getUrl(){

return url;

}

public void setUrl(String url){

this.url=url;

}

public PageWrapper(Page page,String url){

this.page=page;

this.url=url;

items=new ArrayList();

currentNumber=page.getNumber()+ 1;//start from 1 to match page.page

int start,size;

if(page.getTotalPages()<=MAX_PAGE_ITEM_DISPLAY){

start=1;

size=page.getTotalPages();

} else {

if(currentNumber <=MAX_PAGE_ITEM_DISPLAY - MAX_PAGE_ITEM_DISPLAY/2){

start=1;

size=MAX_PAGE_ITEM_DISPLAY;

} else if(currentNumber >=page.getTotalPages()- MAX_PAGE_ITEM_DISPLAY/2){

start=page.getTotalPages()- MAX_PAGE_ITEM_DISPLAY + 1;

size=MAX_PAGE_ITEM_DISPLAY;

} else {

start=currentNumber - MAX_PAGE_ITEM_DISPLAY/2;

size=MAX_PAGE_ITEM_DISPLAY;

}

}

for(int i=0;i

items.add(new PageItem(start+i,(start+i)==currentNumber));

}

}

public List getItems(){

return items; }

public int getNumber(){

return currentNumber;

}

public List getContent(){

return page.getContent();

}

public int getSize(){

return page.getSize();

}

public int getTotalPages(){

return page.getTotalPages();

}

public boolean isFirstPage(){

return page.isFirst();

}

public boolean isLastPage(){

return page.isLast();

}

public boolean isHasPreviousPage(){

return page.hasPrevious();

}

public boolean isHasNextPage(){

return page.hasNext();

}

public class PageItem {

private int number;

private boolean current;

public PageItem(int number,boolean current){

this.number=number;

this.current=current;

}

public int getNumber(){

return this.number;

}

public boolean isCurrent(){

return this.current;

}

}

}

3.6View层

利用Thymeleaf实现数据展示,创建一个专用的page.html fragement以后可以在任何地方调用分页导航。

page.html:

  •  

需要在demo.html 文件中调用page.html中分页导航部分:

3.7运行

程序运行结果与我们期望的是一样的,这里需要注意url有些变化,DemoController.java里面处理的RequestMapping是没有后面的参数的,系统之所以能实现参数处理,我们需要对Spring的HandlerMethodArgumentResolver进行处理,在DemoApplication里面需要加入以下方法:

public void addArgumentResolvers(List argumentResolvers){

PageableHandlerMethodArgumentResolver resolver= new PageableHandlerMethodArgumentResolver();

resolver.setFallbackPageable(new PageRequest(1,15));

argumentResolvers.add(resolver);

}.运行结果:

图2 工程项目的运行结果

4 结语

Spring Data是一种JPA操作的统一形式,如果软件设计合理,几乎不需要额外的数据库查询语句就能实现数据持久化管理。本文利用Spring Data实现了数据查询和分页技术,后台数据持久化技术采用MongoDB,既是Spring Data的研究,也是对MongoDB使用的研究,在前端展示使用了目前最先进的模板技术。Thymeleaf,Thymeleaf的易用性和强大的功能使得其必将取代Freemaker、Velocity等模板技术,利用Thymeleaf的fragment技术可以很好地将通用代码独立出来,嵌入到其他软件工程领域。

[1]Praveen Gupta,M.C.Govil,Spring.Web MVC Framework for rapid open source J2EE application development: a case study[J].International Journal of Engineering Science and Technology,2010,2(6):1684-1689.

[2]张宇,王映辉,张翔南.基于Spring的MVC框架设计与实现[J].计算机工程,2010,36(4):59-62.

[3]Mark Pollackg,Thomas RisbergOliver,Gierke,etc.http://docs.spring.io/spring-data/ data-mongo/docs/1.8.6.RELEASE/reference/html[EB/OL],2016-09-29/2016-10-05.

[4]Stonebraker M.SQL databases v.NoSQL databases[J].Communications of the Acm,2010,53(4):10-11.

[5]时月梅.基于Spring MVC、MyBatis实现数据分页显示处理[J].信息与电脑(理论版),2015(10):138-140.

[6]周建韡,罗辛,史有群,等.基于Spring MVC的数据库分页查询技术及应用研究[J].智能计算机与应用,2014(4):9-12.

[7]Thymeleaf.http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html[EB/OL],2016-10-08/2016-11-28.

[8]Rod Johnson,Juergen Hoeller,Keith Donald,etc.http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle[EB/OL],2016-11-21/2016-11-23.

[9]Konda M.Just Spring Data Access[M].Oreilly Vlg Gmbh & Co,2012:22-26.

[10]陈涛,白栩翔.Velocity模板引擎技术在Java Web中的应用[J].农业网络信息,2011(5):38-40.

[11]Elif Dede,Madhusudhan Govindaraju,Daniel Gunter,et al.A Performance Evaluation of a MongoDB and Hadoop Platform for Scientific Data Analysis[C].The Workshop on Scientific Cloud Computing,2013:13-20.

【责任编辑朱世广】

ImplementofDataPersistenceSolutionandPagingbySpringData,MongoDBandThymeleaf

TANG Wei

(InformationCenter,LongdongUniversity,Qingyang745000,Gansu)

TP311.5

A

1674-1730(2017)05-0009-05

2016-12-26

唐 炜(1983—),男,甘肃庆阳人,助理工程师,硕士,主要从事计算机软件开发及计算机网络研究。

猜你喜欢
关系数据库调用开发者
关系数据库在高炉数据采集系统中的应用
关系数据库技术在计算机网络设计中的应用
核电项目物项调用管理的应用研究
“85后”高学历男性成为APP开发新生主力军
基于系统调用的恶意软件检测技术研究
16%游戏开发者看好VR
利用RFC技术实现SAP系统接口通信
一种基于数据图划分的关系数据库关键词检索方法
C++语言中函数参数传递方式剖析