MyBatis動態建立表(未知列): 實現動態增刪改查

業務場景:

大數據web平臺有時須要查看不一樣指標按不一樣類型和篩選條件來出結果, 且系統作不到實時出結果, 故須要在web系統中選擇指標和條件後建立任務進行非實時計算, 一段時間後計算結果寫入結果表, 訪問頁面並查看處理結果.java

設計流程:

  • web系統提供錄入不一樣指標和條件
  • 根據錄入的指標以json形式發送spark計算
  • 解析json建立任務(任務表已存在), 任務相關信息存入配置表: 如任務id, 任務名稱, 分配角色, 菜單, 任務模型等;
  • 依據任務模型動態建立結果表(與任務關聯比,如表名+{任務id}), sprak計算後寫入
  • 分配的角色登入web系統選擇對應菜單後查看任務生產的圖標

MyBatis動態建立表

邏輯與mybatis dml執行是同樣的: xml提供sql->mapper映射->testweb

1.xmlsql

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.DynaDemoMapper">
    <!-- 建表 -->
    <!-- 1.ddl使用update標籤 -->
    <!-- 2.ddl使用${}取值 -->
    <!-- 3.動態列實際上只是普通的foreach, 常見問題是使用#{}取值形成語法錯誤 -->
    <update id="createAutoTaskResult" parameterType="map">
        create table ${tableName} (
        date date,
        <foreach collection="cloums" item="listItem" separator=",">
            ${listItem} varchar(30)
        </foreach>
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    </update>

    <!-- 1.表名取值${} -->
    <!-- 2.由於是未知列故返回結果不能再是對象, 此處使用map, 實際上返回的是list<map>, 若是表裏有id等惟一值也能夠 單純返回map, key用ID -->
    <select id="selectTaskResult" parameterType="map" resultType="java.util.Map">
        select * from ${tableName} where
        date between #{startDate,jdbcType=DATE} and #{endDate,jdbcType=DATE}
    </select>

</mapper>

1.mapperjson

public interface DynaDemoMapper {
    void createAutoTaskResult(@Param("tableName")String tableName, @Param("cloums")List<String> cloums);

    /** 
     * @Description: 單純返回id做爲key的map
     * @MapKey("id")
     * Map<Long, Object> selectTaskResult(@Param("tableName")String tableName, @Param("startDate")Date startDate, @Param("endDate")Date endDate)
     */

    List<Map<String, Object>> selectTaskResult(@Param("tableName")String tableName, @Param("startDate")Date startDate, @Param("endDate")Date endDate);
}
相關文章
相關標籤/搜索