MyBatis动态创建表(未知列): 实现动态增删改查

1 篇文章 0 订阅
1 篇文章 0 订阅

MyBatis实现未知表未知列动态创建表


文章重点为多列动态表的创建.

业务场景:
大数据web平台有时需要查看不同指标按不同类型和筛选条件来出结果, 且系统做不到实时出结果, 故需要在web系统中选择指标和条件后创建任务进行非实时计算, 一段时间后计算结果写入结果表, 访问页面并查看处理结果.

设计流程:

  • web系统提供录入不同指标和条件
  • 根据录入的指标以json形式发送spark计算
  • 解析json创建任务(任务表已存在), 任务相关信息存入配置表: 如任务id, 任务名称, 分配角色, 菜单, 任务模型等;
  • 依据任务模型动态创建结果表(与任务关联比,如表名+{任务id}), sprak计算后写入
  • 分配的角色登入web系统选择对应菜单后查看任务生产的图标

MyBatis动态创建表

逻辑与mybatis dml执行是一样的: xml提供sql->mapper映射->test

  1. xml
<?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. mapper
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);

}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值