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

Exit mobile version