Liferay7.0开发学习(三):ServiceBuilder工程的创建使用
上一篇博客中介绍了普通的MVCPortlet 工程的创建部署,本篇博客分享一下怎么创建ServiceBuilder工程。
关于ServiceBuilder的介绍可以看之前写的6.2的文章,虽然7.0的开发有变化,但是Servicebuilder的原理和使用都是一样的。
《Liferay 6.1开发学习(四):Service Builder》
《Liferay 6.1开发学习(十九):Liferay ServiceBuilder之自定义查询》
ServiceBuilder是什么?
Service Builder是Liferay提供的一种代码生成方案,开发人员只需要编辑一个数据库的实体描述文件(XML),即可根据此XML文件生成Spring层代码、Hibernate层代码、SQL、SQL索引创建文件、Spring和hibernate的配置文件等,可以大提高开发人员的效率。简单说就是根据数据库描述文件,生成service层和持久化层的代码,开发人员只需要关注控制层即可。
ServiceBuilder有什么好处?
1、首先ServiceBuilder不是必须的,只是Liferay提供的一个代码生成方案,用来和数据库打交道,自己写JDBC连接、使用JPA、hibernate等都是可以的。
2、即使自己开发不使用ServiceBuilder,还是有必要进行学习的。因为Liferay源码里面和数据库交互的业务层、持久层的代码都是基于ServiceBuilder进行的,学习后有助于理解并掌握Liferay的源码和相关API。
3、Liferay的ServiceBuilder能够加快开发效果。
4、Liferay本身的一些UI标签等,必须要配合ServiceBuilder使用。
5、使用ServiceBuilder可以方便的生成远程访问接口。
liferay 7.0里面ServiceBuilder工程的创建
开发环境的问题请先阅读前面的文章
《Liferay7.0开发学习(二):创建并部署一个Portlet》
第一步:创建一个Liferay Workspace,如果已经创建过,跳过此步骤。
第二步:创建一个New Liferay Module Project的项目,在Project Template Name那里选择Servicebuilder。
第三步:点击next,输入包名和类名。
第四步:点击finish,此时会在workspace的modules里面生成我们创建的工程,生成的有两人一个为ServiceBuildDemo-api,一个为ServiceBuilderDemo-server。
第五步:在ServiceBuilderDemo-server下面找到一个名为Service.xml的文件。此文件为数据库的描述文件,在下方,有source、overview、Diagram等三个tab,overview为可视化的界面。
1、namespace:namespace默认情况下会是我们的表名的前缀,根据情况进行修改。
2、修改entity里面的name,此name将会生成实体类,所以第一个字母大写。同时也是默认的表名,如果要指定表名,添加字段table。
3、column:为表中的字段,也就是实体的属性,默认为表的字段名,如果要指定,添加属性db-name,type为字段类型,这里的类型为Java中的数据类型,可选的有Blob、boolean、Collection、Date、double、int、long、String等。
4、如果是主键,添加primary="true" 属性。
5、order为排序方法,字段名指定前面的column里面的name值。
6、下面的finder等可以先删除,如果要了解参考前面写的Service Builder的自定义查询的博客。
第六步:编写完Service.xml文件,现在在Gradle Task的面板里面,找到ServiceBuilderDemo-service下面,进入到build,双击buildService。如下图
第七步:刷新一下ServiceBuildDemo的工程,就可以在API和server下面看到生成了相应的src包,这里面就是生成的我们的数据库相关的代码。API的代码我们一般不需要动,我们仅允许修改的代码为service包下面的xxxImpl,xxxLocalServerImpl,和xxxServerImpl。其中的xxx为我们在service.xml里面定义的entity的name值。
如何使用ServiceBuilder的包?
上面创建的service包,算是后面的业务逻辑部分,如果我们想在页面上进行展现,比如使用上面的API将数据写入数据库,读取出来列表在页面上展现等,我们需要再创建一个portlet。创建的过程参考前面的博客:《Liferay7.0开发学习(二):创建并部署一个Portlet》。
我们在自己创建的Portlet如何引入前面的service工程呢?
打开portlet工程下面的build.gradle文件,在dependencies里面添加如下代码:
compile project(":modules:ServiceBuilderDemo:ServiceBuilderDemo-api")
具体的名称可以根据我们的工程名定义,如果确实是想省事,可以打开ServiceBuilderDemo-service下面的build.gradle,里面有这一行,复制下来就行。
注意:引入只需要引入api的,不需要引入service的。
现在在我们的Portlet工程里面就可以调用前面的数据库类了,如果我们前面entity里面定义的name为Book,则我们一般的方法都是通过BookLocalServiceUtil进行调用。
比如
添加:BookLocalServiceUtil.add(book)
删除:BookLocalServiceUtil.deleteBook(book)
查询所有:BookLocalServiceUtil.getBooks(start,end),start为启始,end为结束,可以使用此进行分页,如果是查询所有,都传入-1。
更多的API,可以自己摸索。
部署
部署的时候先将api和service部署了,再部署portlet。
大牛好 我现在想在页面上添加一个显示列表的portlet, 用来连接自己的数据库,并显示其中的一个表格。请问应该怎么做,liferay有自带的应用吗(我自己试了几个,没成功),有关数据连接的操作就在servicebuilder里吗? 一头雾水中,求指点,谢谢
servicebuilder是用来生成操作数据库的业务类的,就像我们平时写java web时,写的hibernate和spring层代码一样。