Mybatis 动态创建表

本文介绍了如何使用Mybatis进行动态SQL操作,包括复制表结构、检查表是否存在、删除表、创建新表以及插入数据。通过示例展示了mapper接口和XML配置文件的实现,以及JUnit单元测试用例,强调了${}

Mybatis 动态创建表

注意,创建表时使用的时${} 而不是#{}

${} 和 #{}

  • ${} 的变量替换是在动态SQL解析阶段, 仅仅为一个纯碎的 string 替换,会存在sql注入问题
  • #{} 在变量赋值前会被解析为一个占位符?,之后在DBMS中将括号内的值插入,因此传入当传入 "’‘1’’"会出现语法错误

复制一张表作为新表

mapper接口

    // 复制原有的表
    void copyTable(@Param("newTable")String newTable,@Param("oldTable")String oldTable);

xml文件

    <update id="copyTable" parameterType="string">
        CREATE TABLE ${newTable} SELECT * FROM ${oldTable};
    </update>

创建一张新表

创建sql表语句

CREATE TABLE ${tableName} (
          id bigint(20) NOT NULL AUTO_INCREMENT,
          entityId bigint(20) NOT NULL,
          dx double NOT NULL,
          dy double NOT NULL,
          dz double NOT NULL,
          ntype varchar(32) NOT NULL,
          gnssTime bigint(20) NOT NULL,
          speed float DEFAULT NULL,
          direction float DEFAULT NULL,
          attributes varchar(255) DEFAULT NULL,
          PRIMARY KEY (id)
)

根据sql创建实体类Trackpoint

package com.pbad.springboot.Domain;

public class Trackpoint {
    private Long id;
    private Long entityId;
    private Double dx;
    private Double dy;
    private Double dz;
    private String ntype;
    private String gnssTime;
    private Float speed;
    private Float direction;
    private String attributes;


    public Trackpoint() {
    }
    
   ....set()get()方法
}

mapper接口

public interface UserMapper {
    // 复制原有的表
    void copyTable(@Param("newTable")String newTable,@Param("oldTable")String oldTable);

    //表是否存在
    int existTable(String tableName);

    //删除表
    int dropTable(@Param("tableName")String tableName);

    //创建一张新表
    int createNewTable(@Param("tableName")String tableName);

    //对新增的表新增数据
    int insertDataIntoNewTable(@Param("tableName")String tableName,@Param("trackpoint") Trackpoint trackpoint);
}

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.pbad.springboot.Dao.UserMapper">

    <update id="copyTable" parameterType="string">
        CREATE TABLE ${newTable} SELECT * FROM ${oldTable};
    </update>

    <select id="existTable" resultType="java.lang.Integer">
        select count(*)
        from information_schema.TABLES
        where LCASE(table_name)=#{tableName}
    </select>

    <update id="dropTable">
        DROP TABLE IF EXISTS ${tableName}
    </update>

    <update id="createNewTable" parameterType="string">
        CREATE TABLE ${tableName} (
          id bigint(20) NOT NULL AUTO_INCREMENT,
          entityId bigint(20) NOT NULL,
          dx double NOT NULL,
          dy double NOT NULL,
          dz double NOT NULL,
          ntype varchar(32) NOT NULL,
          gnssTime bigint(20) NOT NULL,
          speed float DEFAULT NULL,
          direction float DEFAULT NULL,
          attributes varchar(255) DEFAULT NULL,
          PRIMARY KEY (id)
        )
    </update>

    <insert id="insertDataIntoNewTable">
        insert into ${tableName}
            (entityId,dx,dy,dz,ntype,gnssTime,speed,direction,attributes)
        values
            (#{trackpoint.entityId},
             #{trackpoint.dx},
             #{trackpoint.dy},
             #{trackpoint.dz},
             #{trackpoint.ntype},
             #{trackpoint.gnssTime},
             #{trackpoint.speed},
             #{trackpoint.direction},
             #{trackpoint.attributes})
    </insert>

</mapper>

Junit单元测试

    /**
     * 创建一张新表
     */
    @Test
    void creatTable() {
        String tableName = "trackpoint";
        //判断trackpoint表是否存在
        int i = userMapper.existTable(tableName);
        System.out.println(i);
        if (i != 1) {
            //新增trackpoint表
            userMapper.createNewTable(tableName);
            System.out.println("创建成功");
            //新增数据
            Trackpoint trackpoint = new Trackpoint();
            trackpoint.setId(1L);
            trackpoint.setEntityId(1L);
            trackpoint.setDx(1.00);
            trackpoint.setDy(1.00);
            trackpoint.setDz(1.00);
            trackpoint.setNtype("1");
            trackpoint.setGnssTime("1");
            trackpoint.setSpeed(Float.valueOf(1));
            trackpoint.setDirection(Float.valueOf(1));
            trackpoint.setAttributes("1");
            userMapper.insertDataIntoNewTable(tableName,trackpoint);
            System.out.println("插入数据成功");
        }else {
            System.out.println("trackpoint表已经存在");
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值