Java程式碼生成器加入postgresql資料庫、HikariCP連線池、swagger2支援!

小螺旋丸發表於2020-04-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("http://www.apache.org/licenses/LICENSE-2.0")
                //服務條款URL
                .termsOfServiceUrl("https://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;
	}
	
}

  訪問http://localhost:ip:port/專案路徑/swagger-ui.html:
swagger-ui  通過此介面,還可以對介面進行測試,大大方便了我們的開發對接工作,從此告別複雜文件的維護!

自定義引數配置一覽

  新版的程式碼生成器新增了常用引數配置介面,在這裡可以選擇連線池的種類(目前支援Druid和HikariCP)以及是否啟用Swagger,如下:
常用引數配置
介面
  更多引數配置會陸續加入!
  postgresql的使用同樣簡單,只需要把資料庫型別切換成postgresql即可:
postgresql
  多表查詢模組postgresql模式下生成的程式碼可能會出現問題,因為還沒有進行測試。。。

結語

  聊完技術,讓我們關注一下生活,由於受到疫情的影響,國內的經濟受到了很大程度的衝擊,到處都爆出裁員,找不到工作等負面資訊,大家不必對此感到慌張,風雨過後必見彩虹,我們要做的就是要不斷提升自己的技術水平,多看書,多學習,成為行業核心人員,這樣,才能做到穩操勝券,坐懷不亂。
  希望國外能儘早控制住疫情的發展,戰勝這狡猾的病毒,每天早晨醒來,看著增長的數字真的很讓人揪心。
  最後,希望大家無論何時都要把身體健康放在第一位,畢竟身體是革命的本錢,健康沒了,一切都變的沒有意義。
  謝謝你的觀看,下次再見!

附:
生成器下載連結:
http://www.zrxlh.top:8088/coreCode/

原始碼地址:
https://gitee.com/zrxjava/codeMan

相關文章