在postgresql使用mybatis動態創建數據庫分區表
- 1. 整體描述
- 2. 前期準備
- 2.1 創建主表語句
- 2.2 創建分表語句
- 2.3 xxl-job
- 3. 代碼實現
- 3.1 mapper.xml層
- 3.2 mapper.java層
- 3.3 service接口層
- 3.4 service實現層
- 3.5 controller層
- 4. 總結
1. 整體描述
在java下實現:創建分區表,每個月一個分區表,需要定時任務動態創建數據庫表。首先創建主表,然后使用定時任務創建分區表,定時任務使用xxl-job實現,當然也可以使用單體定時任務實現。
2. 前期準備
前期需要先創建出分區表,并驗證下創建分區表的語句。
2.1 創建主表語句
我使用的是postgresql,和mysql有些區別,但是大同小異。分區表有三種分區規則,這里使用List,不再贅述,本文主要說下動態見表的功能。這里簡單用個test表示范一下。
CREATE TABLE test (log_id int not null,ym VARCHAR(20) NOT NULL,logdate date not null,log_content VARCHAR(500),create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) PARTITION BY LIST (ym);
2.2 創建分表語句
主表創建之后,我們就可以創建分表了,建表語句如下:
CREATE TABLE test_202506 PARTITION OF test
FOR VALUES IN ('202506');
CREATE TABLE test_202507 PARTITION OF test
FOR VALUES IN ('202507');
這里創建兩個分區表,分別是6月和7月的,注意創建的時候,有兩個參數,一個是分表名:test_202506,一個是分表規則的值:202506,等我們自動創建表的時候,也需要傳入這兩個參數。
創建好分表之后,我們執行insert語句,會根據ym字段的值,自動放到對應的分區表里。
2.3 xxl-job
xxl-job實現定時任務,本文不具體描述。可以自己搜下,很多介紹,內容也比較多。
3. 代碼實現
3.1 mapper.xml層
在mapper.xml層,新建方法:
<select id="isTableExist" resultType="boolean">SELECT EXISTS (SELECT 1FROM information_schema.tablesWHERE table_schema = 'public' AND LOWER(table_name) = LOWER(#{tableName}))</select><update id="createNewTable" parameterType="string">CREATE TABLE PUBLIC.${tableName} PARTITION OF PUBLIC.TEST FOR VALUES IN(${yyyyMM});</update>
兩個方法,一個是判斷表是否存在,一個是創建表。如果不判斷直接創建已經存在的表,會報錯。其中,PUBLIC是模式名,可以替換為實際模式名稱,我就直接在PUBLIC里測試下。 t a b l e N a m e 和 {tableName}和 tableName和{yyyyMM}是參數,需要傳入。
3.2 mapper.java層
/*** 判斷表是否存在** @param tableName 表名* @return 創建結果*/boolean isTableExist(@Param("tableName") String tableName);/*** 創建表** @param tableName 表名* @return 創建結果*/public void createNewTable(@Param("tableName") String tableName, @Param("yyyyMM") String yyyyMM);
3.3 service接口層
/*** 判斷表是否存在** @param tableName 表名* @return 創建結果*/boolean isTableExist(String tableName);/*** 創建表** @param tableName 表名* @param yyyyMM 年月* @return 創建結果*/public void createNewTable(String tableName, String yyyyMM);
3.4 service實現層
/*** 判斷表是否存在** @param tableName 表名* @return 創建結果*/@Overridepublic boolean isTableExist(String tableName) {return service.isTableExist(tableName);}/*** 創建表** @param tableName 表名* @param yyyyMM 年月* @return 創建結果*/@Overridepublic void createNewTable(String tableName, String yyyyMM) {service.createNewTable(tableName, yyyyMM);}
3.5 controller層
這里我就不在controller層添加接口了,因為這個是通過定時任務實現的,所以直接添加定時任務就好了。具體代碼也在這里貼出了,比較簡單,依次調用上面的兩個方法就行,如果表不存在就創建。
4. 總結
以上就完成自動建表的功能,結合定時任務組件,即可實現定時創建分區表的功能。