Java程式碼生成器加入postgresql資料庫、HikariCP連接池、swagger2支援!
- 2020 年 4 月 29 日
- 筆記
前言
最近幾天又抽時間給程式碼生成器增加了幾個新功能(預計今晚發布完畢),目前已支援postgresql資料庫,HikariCP連接池和swagger2(文末有生成器獲取鏈接,喜歡的朋友可以下載使用,永久免費,推薦大家以安裝idea插件的方式使用,簡單快捷),順便講解一下postgresql和mysql的區別,HikariCP和Druid的區別以及swagger2的使用方法,不然就沒東西寫啦,沒錯,我就是來水文的!讓我們一起看一下吧。
PostgreSql VS MySql
MySQL相信大家都再熟悉不過了,號稱世界上最流行的資料庫伺服器,體積小,速度快,開源免費,可移植性強,使用簡單,這些特性讓它成為了中國互聯網企業的資料庫一哥,但真正導致它如此流行的原因還要歸結於它的歷史,08年的時候MySQL由SUN公司收購併一直供大家免費使用,也正是那個時候,MySQL積累了成千上萬的粉絲,企業也因此培養了大量熟練使用MySQL的程式設計師,雖然當時的PG已經擁有許多高級特性,但互聯網大多用不到,互聯網需要的特性——快速,PG不具備。歷史延續下來,造成了今天的局面。可以說互聯網成就了MySQL。
10年SUN公司被ORACLE收購,MySql也由Oracle接管,直到今日,MySQL仍然是最受開發者歡迎的資料庫之一。
相比MySql,PG大家可能就要陌生一些,PG號稱世界上最先進的資料庫伺服器,一個最流行,一個最先進,你細品。
PG目前有超過1000位頂級互聯網開發者維護,更新速度相對較快,並且完全開源免費。PG更像是一個集大成於一體的資料庫,它集成了關係型資料庫與非關係型資料庫的優點,讓你可以靈活的存儲數據結構。
另外,數據一致性和完整性等性質都是PG的高度優先事項,這也是為什麼日本有很多項目使用PG而不使用MySQL的原因,這省去了很多事務控制的麻煩,比如常見的並發更新,PG可以保證其正確性,因為隱藏列保存了version欄位,相當於幫助你實現了樂觀鎖而不必靠編碼實現,MySql則必須手動加鎖實現。此外,PG對於地理位置的資訊存儲有著自己不可替代的優勢,外部表同樣是一個激動人心的功能。總之,說句公道話,PG比Mysql強大很多!它正在慢慢崛起,相信在未來會與MySql保持相對平衡的狀態。
運行模式方面,PG是進程模式,MySQL是執行緒模式。通常情況下,進程模式在多CPU環境下可以有更高的資源利用率。進程模式共享數據需要用到共享記憶體,而執行緒模式數據本身就在進程空間內共享,不同執行緒對於數據的訪問需要控制好執行緒之間的同步。執行緒模式對資源的消耗相對較少,所以理論上MySql支援比PG更多的連接,但pgpool這款優秀的連接池軟體可以很好的解決這個問題!
最後,有一點需要說明:不管是PostgreSQL還是MySQL,都不能聲稱自己比對方更優秀,對用戶來說,只有合適的,沒有最優秀的。
HikariCP VS Druid
Druid連接池是阿里的一款開源資料庫連接池組件,近幾年KO掉了老牌的C3P0,DBCP,成為資料庫連接池的新寵,由於其使用簡單,安全,速度快,強大且豐富的監控特性等優點,所以被不少企業所採用。Druid連接池各方面比較均衡,對於大多數應用來說已經足夠,還贈送一個監控介面,這也是極好的。
但有一點需要注意,當我們的應用程式存在缺陷的時候,使用Druid連接池很有可能會導致連接一直不能被釋放,頻繁導致無法獲取資料庫連接的異常發生,需要我們通過以下配置來定位問題發生的位置:
<!-- 超過時間限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超時時間;單位為秒。180秒=3分鐘 -->
<property name="removeAbandonedTimeout" value="180" />
<!-- 關閉abanded連接時輸出錯誤日誌 -->
<property name="logAbandoned" value="true" />
定位問題並解決之後,注釋掉即可,因為會比較耗費性能,生產環境慎用!
HikariCP作為後起之秀,號稱是最快的資料庫連接池,它,超快,快到連SpringBoot2都採納其為默認連接池。程式碼量只有130kb,俗話說,濃縮的都是精華,看來一點不假。
HikariCP不光塊,穩定性和可靠性也經過了權威認證,口碑極好,作者優化並精簡了位元組碼、使用FastList替代ArrayList為其帶來了強悍的性能支援。
如果追求極致性能,可以考慮使用HikariCP!
Swagger2
Swagger2可以幫助我們生成介面文檔的描述,有利於前後台工作人員之間的溝通,進而提高工作效率。
Swagger2的使用方法極其簡單,此處以Springboot項目為例,首先需要我們引入pom依賴:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
然後新建對應的配置類:
@Configuration
//註解開啟 swagger2 功能
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//是否開啟 (true 開啟 false隱藏。生產環境建議隱藏)
.enable(true)
.select()
//掃描的路徑包,設置basePackage會將包下的所有被@Api標記類的所有方法作為api
.apis(RequestHandlerSelectors.basePackage("testUp.controller"))
//指定路徑處理PathSelectors.any()代表所有的路徑
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//設置文檔標題(API名稱)
.title("Swagger2介面文檔")
//文檔描述
.description("介面說明")
.license("Apache 2.0")
.licenseUrl("//www.apache.org/licenses/LICENSE-2.0")
//服務條款URL
.termsOfServiceUrl("//swagger.io/")
//版本號
.version("1.0")
.build();
}
}
如果使用了攔截器:
@Configuration
public class MvcConfig implements WebMvcConfigurer {
/**
* 攔截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//你的業務邏輯。。。。。
return true;
}
}).addPathPatterns("/**").excludePathPatterns("/login", "/register", "/login/doLogin", "/user/register",
"/mystatic/**", "/druid/**", "/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
如果使用了Spring Security:
@Override
public void configure(WebSecurity web) throws Exception {
//allow Swagger URL to be accessed without authentication
web.ignoring().antMatchers("/v2/api-docs",//swagger api json
"/swagger-resources/configuration/ui",//用來獲取支援的動作
"/swagger-resources",//用來獲取api-docs的URI
"/swagger-resources/configuration/security",//安全選項
"/swagger-ui.html");
}
接著在需要訪問的controller加入以下注解,例如(這裡使用了@Api和@ApiOperation註解):
@RestController
@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*")
@Api(tags = "登錄介面")
@RequestMapping("/login")
public class LoginController {
@ApiOperation(value = "登錄")
@RequestMapping(value = "/doLogin", method = RequestMethod.POST)
public CommonResult doLogin(@RequestBody User user, HttpSession session) {
if (("admin".equals(user.getUserName()) && "root".equals(user.getPassword()))) {
session.setAttribute("user", user);
return new CommonResult(ResultConstant.SUCCCSS_CODE, ResultConstant.SUCCESS_MSG);
}
return new CommonResult(ResultConstant.LOGIN_FAIL_CODE, ResultConstant.FAIL_MSG);
}
@ApiOperation(value = "退出登錄")
@RequestMapping(value = "/doLogOut",method = RequestMethod.POST)
public CommonResult doLogOut(HttpSession session) {
session.removeAttribute("user");
return new CommonResult(ResultConstant.SUCCCSS_CODE, ResultConstant.SUCCESS_MSG);
}
}
最後,實體類添加註解(@ApiModel和@ApiModelProperty):
@ApiModel
public class User implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用戶名", name = "userName")
private String userName;
@ApiModelProperty(value = "密碼", name = "password")
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
訪問//localhost:ip:port/項目路徑/swagger-ui.html:
自定義參數配置一覽
新版的程式碼生成器添加了常用參數配置介面,在這裡可以選擇連接池的種類(目前支援Druid和HikariCP)以及是否啟用Swagger,如下:
更多參數配置會陸續加入!
postgresql的使用同樣簡單,只需要把資料庫類型切換成postgresql即可:
多表查詢模組postgresql模式下生成的程式碼可能會出現問題,因為還沒有進行測試。。。
結語
聊完技術,讓我們關注一下生活,由於受到疫情的影響,中國的經濟受到了很大程度的衝擊,到處都爆出裁員,找不到工作等負面資訊,大家不必對此感到慌張,風雨過後必見彩虹,我們要做的就是要不斷提升自己的技術水平,多看書,多學習,成為行業核心人員,這樣,才能做到穩操勝券,坐懷不亂。
希望國外能儘早控制住疫情的發展,戰勝這狡猾的病毒,每天早晨醒來,看著增長的數字真的很讓人揪心。
最後,希望大家無論何時都要把身體健康放在第一位,畢竟身體是革命的本錢,健康沒了,一切都變的沒有意義。
謝謝你的觀看,下次再見!
附:
生成器下載鏈接:
//www.zrxlh.top:8088/coreCode/
源碼地址:
//gitee.com/zrxjava/codeMan