網(wǎng)站開(kāi)發(fā)阿里巴巴開(kāi)發(fā)的集成比較簡(jiǎn)單框架采用和密碼的步驟開(kāi)發(fā)淘寶刷鉆,刷收藏,刷流量程序網(wǎng)站
2022-05-08
功能開(kāi)發(fā)
通過(guò)前面的章節(jié),我們已經(jīng)搭建好了博客網(wǎng)站的基本框架。在本章中,我們將正式開(kāi)始網(wǎng)站的功能開(kāi)發(fā)。
開(kāi)發(fā)前的準(zhǔn)備
在正式實(shí)現(xiàn)業(yè)務(wù)邏輯之前,我們先來(lái)分析一下完成這個(gè)應(yīng)用程序所需的一些基本框架,并將它們集成到項(xiàng)目中。
我們會(huì)在開(kāi)發(fā)前做好以下準(zhǔn)備工作。
我們分別集成封裝和框架。
整合
集成比較簡(jiǎn)單,按照以下步驟即可。
(1)在項(xiàng)目中添加和依賴:
org.mybatis.spring.boot
mybatis-spring-boot-starter 1.3.2
dependency>
mysql
mysql-connector-java
5.1.46
com.alibaba
druid-spring-boot-starter
1.1.1e
是阿里巴巴開(kāi)發(fā)的數(shù)據(jù)庫(kù)連接池框架,是本系統(tǒng)的數(shù)據(jù)庫(kù)連接池框架采用的。
(2)在配置中心遠(yuǎn)程Git倉(cāng)庫(kù)新增配置文件.yml,配置數(shù)據(jù)源:
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/blog_db?useUnicode=true&characterEncoding=
UTF-8&useSSL=false
username: root
password:******stat-view- servlet:
login-username: adminlogin-password: admin
mybatis:
#配置mapper.xml的classpath路徑
mapper- locations: classpath: /mapper/*Mapper.xmlconfiguration:
#配置項(xiàng):開(kāi)啟下劃線到駝峰的自動(dòng)轉(zhuǎn)換。作用:將數(shù)據(jù)庫(kù)字段根據(jù)駝峰規(guī)則自動(dòng)注入到對(duì)象屬性。
map-underscore-to-camel-case: true
在上面的配置中,..是數(shù)據(jù)庫(kù)連接池的基本配置。 url為數(shù)據(jù)庫(kù)連接字符串,數(shù)據(jù)庫(kù)對(duì)應(yīng)的用戶名和密碼。強(qiáng)大的不僅在于它還提供了強(qiáng)大的web界面,在里面可以查看當(dāng)前數(shù)據(jù)庫(kù)的信息,查詢語(yǔ)句的執(zhí)行效率統(tǒng)計(jì)等。在上面的配置中,web管理的-and-界面可以設(shè)置名稱和密碼,我們集成微服務(wù)模塊的web管理界面,可以通過(guò)地址http://:8201/訪問(wèn)(8201為集成應(yīng)用端口號(hào))。當(dāng)然,我們需要輸入上面配置設(shè)置的用戶名和密碼,然后就可以進(jìn)入它的主web管理界面,如圖10-1所示。
(3)在每個(gè)服務(wù)的配置中引入.yml:
spring:
cloud:
config:
name: eurekaclient , datasourcelabel: master
discovery :
enabled: trueserviceId: configusername: admin
password: admin
eureka:
client:
service-url:
defaultzone: http: //admin: admin123@localhost:8101/eureka/
前面說(shuō)過(guò),在...name中設(shè)置要拉取的配置,多個(gè)配置用逗號(hào)隔開(kāi),所以要導(dǎo)入哪個(gè)配置文件,在逗號(hào)后面加上。
整合
是一個(gè)基于分布式的全文搜索引擎。用 Java 開(kāi)發(fā)并用作許可條款 它是一個(gè)流行的企業(yè)級(jí)搜索引擎。常用于云計(jì)算,可實(shí)現(xiàn)實(shí)時(shí)搜索,穩(wěn)定可靠,快捷方便。
我們可以將其視為全文檢索的數(shù)據(jù)庫(kù),通過(guò)將要檢索的數(shù)據(jù)存儲(chǔ)到應(yīng)用程序中來(lái)提高應(yīng)用程序的搜索性能。如果要將其集成到應(yīng)用程序中,則需要先安裝它。本節(jié)將簡(jiǎn)要介紹兩種操作系統(tǒng)的安裝和Mac步驟。
1.系統(tǒng)下安裝
從官網(wǎng)下載壓縮包:/www..co//。解壓文件進(jìn)入bin目錄網(wǎng)站開(kāi)發(fā),雙擊.bat啟動(dòng)。啟動(dòng)后訪問(wèn):9200,如果出現(xiàn)圖10-2所示界面,則安裝成功。
2.安裝。
我們可以直接通過(guò)命令brew完成安裝,然后通過(guò)命令/usr////6.2.4/bin/啟動(dòng)。
安裝過(guò)程受限于網(wǎng)絡(luò)環(huán)境,可能會(huì)比較耗時(shí)。需要耐心。
3. 集成。
首先在項(xiàng)目中添加如下依賴:
org.springframework.boot
spring-boot-starter-data-elasticsearch dependency>
io.searchbox
jest
其中 -boot--data- 是 Boot 集成所需的依賴包。該應(yīng)用程序已有 Java API,但不支持 HTTP。 Jest 彌補(bǔ)了原生 API 中 HTTP 客戶端的不足。所以引入Jest依賴可以很方便的訪問(wèn)服務(wù)端。
在配置中心的Git倉(cāng)庫(kù)中創(chuàng)建一個(gè).yml文件,內(nèi)容如下:
spring:
elasticsearch:
jest:
#本地啟動(dòng)的Elasticsearch開(kāi)啟的HTTP地址,端口默認(rèn)為9200
uris: http://127.8.0.1:9200
這個(gè)配置比較簡(jiǎn)單,只需要執(zhí)行 HTTP 請(qǐng)求地址即可。上面指定的地址是安裝時(shí)瀏覽器訪問(wèn)的地址。
讓我們執(zhí)行單元測(cè)試來(lái)驗(yàn)證集成是否成功。注意,在做單元測(cè)試的時(shí)候,一定要先啟動(dòng)和兩個(gè)項(xiàng)目,因?yàn)榉?wù)的配置是存放在Git倉(cāng)庫(kù)中的。如果項(xiàng)目未啟動(dòng),則無(wú)法從 Git 存儲(chǔ)庫(kù)中拉取配置。測(cè)試代碼如下:
@Data
public class ESBlog {
@JestId
private Long id;
private String title;private String summary;
}
//保存數(shù)據(jù)到ElasticsearchESBlog blog =new ESBlog();blog.setId(1L);
blog.setTitle("測(cè)試標(biāo)題");blog.setSummary("測(cè)試摘要")
Index index = new Index.Builder(blog).index("blog-index" ).type("blog-table").build();
jestclient.execute(index);
1/查詢數(shù)據(jù)
SearchSourceBuilder builder = new SearchSourceBuilder();//指定查詢關(guān)鍵詞和字段
builder.query(QueryBuilders.multiMatchQuery("摘要" , "title,summary".split(",")))
//分頁(yè),類似于MySQL中的limit 0,10
.from(e)
.size(10);
Search search = new Search.Builder(builder.toString())
.addIndex( "blog-index" )
.addType( "blog-table"). build();
JestResult ret = jestclient.execute(search);
List blogList = ret.getSourceAs0bjectList(ESBlog.class);
system.out.println(list);
保存數(shù)據(jù)時(shí),首先通過(guò)索引類指定blog-,type為blog-,可以理解為數(shù)據(jù)庫(kù)名(等價(jià)于),type可以理解為表名(等價(jià)于)seo優(yōu)化,數(shù)據(jù)可以通過(guò)方法保存。
查詢數(shù)據(jù)時(shí),可以實(shí)例化對(duì)象,執(zhí)行查詢的關(guān)鍵字和字段。當(dāng)然它也支持分頁(yè)網(wǎng)站開(kāi)發(fā),可以通過(guò)from和size方法執(zhí)行分頁(yè)參數(shù)。最后構(gòu)造對(duì)象,執(zhí)行并鍵入,執(zhí)行方法完成數(shù)據(jù)查詢。
執(zhí)行以上代碼,可以看到數(shù)據(jù)保存后成功返回,從而完成整合。
使用代碼生成器提高開(kāi)發(fā)效率
本應(yīng)用的持久層使用框架,需要編寫(xiě)原生SQL。在應(yīng)用操作中,占比最大的是一些單表操作或基本的SQL語(yǔ)句(如增刪改查)。如果每條語(yǔ)句都重寫(xiě),工作量巨大,效率低下。我們可以使用代碼生成器自動(dòng)為我們生成一些基礎(chǔ)代碼,以減少開(kāi)發(fā)量。
本節(jié)將介紹一個(gè)開(kāi)源代碼生成器:-。 - 可以幫助我們生成大量基本的SQL語(yǔ)句。使用方法如下。
(1)在父項(xiàng)目上新建一個(gè)項(xiàng)目并命名為-,然后編寫(xiě)pom.xml文件:
org.mybatis.generator
mybatis-generator-core
1.3.2
myabis-generator
src/main/java
**/*.xml
resource>
src/main/resources cincludes>
**/*.properties **/*.xml
true
org.mybatis.generator
mybatis-generator-maven-plugin ${mybatis.generator.version}
com. lynn.blog
mybatis-generator artifactId>1.0-SNAPSHOT
< / dependency>
true
true < / configuration>
< /build>
--core 是上述插件所需的依賴包。僅僅添加這個(gè)依賴就可以讓我們通過(guò)編碼來(lái)實(shí)現(xiàn)代碼生成器規(guī)則,但是執(zhí)行代碼生成器規(guī)則也需要指定的插件。在標(biāo)簽后面添加對(duì)應(yīng)的代碼插件---并指定for-,我們就可以執(zhí)行插件了。
(2)新建一個(gè)配置文件。:
generator .jdbc.driver=com.mysql.jdbc.Driver
generator.jdbc.url=jdbc:mysql://localhost:3306/blog_db?useUnicode=true&
characterEncoding=utf-8& autoReconnect=true& useSSL=false
generator.jdbc.username=root
generator.jdbc.password=**豐率**#MySQL 驅(qū)動(dòng)所在全路徑
classPathEntry=/Users/lynn/Downloads/mysql-connector-java-5.1.47.jar
上面的配置比較簡(jiǎn)單,只需要指定數(shù)據(jù)庫(kù)連接信息和驅(qū)動(dòng)所在的完整路徑即可。
(3) - 提供一些默認(rèn)生成,比如默認(rèn)生成BIT類型,不分頁(yè)等,它提供了一個(gè)插件接口,我們可以自定義插件,擴(kuò)展規(guī)則代碼生成器網(wǎng)站開(kāi)發(fā),下面以分頁(yè)插件為例講解自定義插件的生成,讀者可以參考本書(shū)配套源碼了解其余實(shí)現(xiàn),請(qǐng)看代碼:
public class PaginationPlugin extends PluginAdapter {
@Override
public boolean validate(List list) {
return true;
}
/**
*為每個(gè)Example類添加limit和offset屬性和set、get方法*/
@override
public boolean modelExampleClassGenerated(TopLevelclass topLevelClass,
IntrospectedTable introspectedTable) {
PrimitiveTypewrapper integerwrapper = FullyQualifiedavaType.getIntInstance().
getPrimitiveTypewrapper();
Field limit = new Field();limit.setName("limit");
limit.setvisibility( Javavisibility. PRIVATE);limit.setType(integerwrapper);
topLevelclass.addField(limit);Method setLimit = new Method();
setLimit.setVisibility ( avavisibility.PUBLIC);setLimit.setName( "setLimit");
setLimit.addParameter(new Parameter(integerwrapper,"limit"));setLimit.addBodyLine( "this.limit = limit; ");
topLeve1class.addMethod(setLimit);
Method getLimit = new Method();
getLimit.setvisibility ( Javavisibility.PUBLIC);
getLimit.setReturnType(integerwrapper);getLimit.setName( "getLimit" );
getLimit.addBodyLine( "return limit; ");topLevelclass .addMethod(getLimit);Field offset = new Field();
offset.setName( "offset");
offset.setvisibility ( Javavisibility. PRIVATE);offset.setType(integerwrapper);
topLevelclass.addField(offset);Method setoffset = new Method();
setOffset.setVisibility (avavisibility. PUBLIC);setOffset.setName( "setOffset");
setOffset. addParameter(new Parameter(integerwrapper,"offset"));setOffset.addBodyLine("this.offset = offset; ");
topLevelclass.addMethod(setOffset);
Method getoffset = new Method();
getOffset.setvisibility( Javavisibility . PUBLIC);getOffset.setReturnType(integerwrapper);
getOffset.setName( "getOffset" );
getOffset.addBodyLine( "return offset; ");topLevelclass.addMethod(getoffset);
return true;
}
@override
public boolean sqlMapSelectByExamplewithoutBLOBsElementGenerated(XmlElement element,
IntrospectedTable introspectedTable){
XmlElement ifLimitNotNullElement = new XmlElement("if");
ifLimitNotNullElement.addAttribute(new Attribute("test", "limit != null"));Xm1Element ifOffsetNotNullElement = new XmlElement("if");
ifOffsetNotNullElement.addAttribute(new Attribute( "test","offset != null"));ifOffsetNotNullElement.addElement(new TextElement("limit ${offset},${limit}"));ifLimitNotNullElement.addElement(ifOffsetNotNul1Element);
Xm1Element ifOffsetNullElement = new Xm1Element("if");
ifOffsetNullElement.addAttribute(new Attribute("test","offset == null"));ifOffsetNullElement.addElement(new TextElement("limit ${limit}"));
ifLimitNotNullElement.addElement(iFOffsetNullElement);
element.addElement(ifLimitNotNullElement);
return true;
}
}
它為我們提供了一個(gè)類來(lái)實(shí)現(xiàn)自定義代碼生成插件,所以如果我們要實(shí)現(xiàn)自定義插件,首先要繼承類和覆蓋,以及方法。其中,用于設(shè)置插件是否有效,上述代碼返回true,表示始終有效;功能是生成代碼,我們已經(jīng)生成了分頁(yè)的必要和方法,可以通過(guò)設(shè)置sum來(lái)完成分頁(yè);功能是生成.xml代碼。我們知道分頁(yè)是通過(guò)關(guān)鍵字來(lái)完成的,所以上面的代碼也會(huì)生成相應(yīng)的語(yǔ)句來(lái)完成分頁(yè)查詢語(yǔ)句的創(chuàng)建。
(4)新的.xml:
commentGenerator>
context>
如果我們要自動(dòng)生成對(duì)應(yīng)的數(shù)據(jù)庫(kù)代碼,還需要?jiǎng)?chuàng)建一個(gè)配置文件來(lái)說(shuō)明生成原理。在上面的配置中,
tags 指定了一些代碼生成器插件,其中一些是自定義插件,一些是內(nèi)置插件;
tags指定基本屬性,用于設(shè)置是否直接使用數(shù)據(jù)庫(kù)字段名,這里的設(shè)置是不使用數(shù)據(jù)庫(kù)名,而是使用駝峰名;標(biāo)簽指定生成的目標(biāo)包的名稱;標(biāo)簽指定.xml所在的目錄;標(biāo)簽指定.java所在的包名; 指定要生成的表名,其中,為數(shù)據(jù)庫(kù)對(duì)應(yīng)的表名,為生成的實(shí)體名。
(5)使用-生成代碼,如圖10-3所示。
先編譯-,然后點(diǎn)擊Run快速生成代碼。生成完成后,我們可以看到-中的代碼,如圖10-4所示。
我們可以將這些代碼復(fù)制到項(xiàng)目中,這樣就完成了代碼的生成。生成的代碼包含基本的CRUD,查詢語(yǔ)句支持動(dòng)態(tài)查詢、分頁(yè)、排序等功能。
本文講解的內(nèi)容實(shí)戰(zhàn):網(wǎng)站功能開(kāi)發(fā),使用代碼生成器提高開(kāi)發(fā)效率下一篇給大家講解實(shí)戰(zhàn):使用代碼生成器生成的代碼操作數(shù)據(jù)庫(kù);覺(jué)得文章不錯(cuò)的朋友可以轉(zhuǎn)發(fā)這篇文章關(guān)注小編;感謝您的支持!