Mybatis 动态创建表

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表已经存在");
        }
    }
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个支持动态创建表的Java持久层框架,而Spring Boot是一个用于快速开发Java应用程序的框架。下面是一个简单的示例,展示了如何在Spring Boot项目中使用MyBatis动态创建表。 首先,我们需要在pom.xml文件中添加MyBatis和数据库驱动的依赖。可以根据自己使用的数据库类型进行相应的配置。 ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> ``` 接下来,我们需要建一个实体类来表示要建的表及其字段。可以在该类上使用注解来指定表名和字段名。 ```java @Entity @Table(name = "my_table") // 表名 public class MyTable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // 省略getter和setter } ``` 然后,建一个Mapper接口,用来定义与数据库交互的接口方法。可以使用@Mapper注解标记这个接口,让MyBatis扫描到它。 ```java @Mapper public interface MyTableMapper { @CreateTable // 自定义注解,用来标记动态创建表的方法 @Insert("CREATE TABLE my_table (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255))") void createTable(); } ``` 在启动类中,使用@MapperScan注解来扫描Mapper接口,并在建数据库连接的配置文件中添加@EnableTransactionManagement注解,以支持事务。 ```java @SpringBootApplication @MapperScan("com.example.mapper") @EnableTransactionManagement public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 最后,建一个自定义注解@CreateTable,用来标记动态创建表的方法。 ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface CreateTable { } ``` 在Mapper接口的实现类中,可以使用@Around注解拦截所有带有@CreateTable注解的方法,并在方法执行前、执行后执行相应的逻辑。在执行前,可以通过MyBatis的Mapper接口对象来动态创建表。 ```java @Aspect @Component public class CreateTableAspect { @Around("@annotation(com.example.annotation.CreateTable)") public Object createTable(ProceedingJoinPoint joinPoint) throws Throwable { // 获取Mapper接口对象 MyTableMapper mapper = (MyTableMapper) joinPoint.getTarget(); // 动态创建表 mapper.createTable(); // 执行原方法 return joinPoint.proceed(); } } ``` 以上是一个使用MyBatis动态创建表的简单示例。通过Spring Boot的整合,我们可以方便地在项目中使用MyBatis动态创建表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值