MyBatis动态创建表
转载请注明出处:https://www.cnblogs.com/Joanna-Yan/p/9187538.html
项目中业务需求的不同,有时候我们需要动态操作数据表(如:动态建表、操作表字段等)。常见的我们会把日志、设备实时位置信息等存入数据表,并且以一定时间段生成一个表来存储,log_201806、log_201807 等。在这里我们用 MyBatis 实现,会用到动态 SQL。
动态 SQL 是 Mybatis 的强大特性之一,MyBatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此对动态 sql 进行处理。
在动态 sql 解析过程中,#{} 与 ${} 的效果是不一样的:
#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
如以下 sql 语句:
select * from user where name = #{name};
会被解析为:
select * from user where name = ?;
可以看到 #{ } 被解析为一个参数占位符 ? 。
${ } 仅仅为一个纯粹的 String 替换,在动态 SQL 解析阶段将会进行变量替换。
如以下 sql 语句:
select from user where name = ${name};
当我们传递参数“joanna”时,sql 会解析为:
select from user where name = “joanna”;
可以看到预编译之前的 sql 语句已经不包含变量 name 了。
综上所述,${} 的变量的替换阶段是在动态 SQL 解析阶段,而 #{} 的变量的替换是在 DBMS 中。
下面实现 MyBatis 动态创建表,判断表是否存在,删除表功能。
Mapper.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="xx.xxx.xx.mapper.OperateTableMapper" ><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">select </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="existTable"</span><span style="color: rgba(255, 0, 0, 1)"> parameterType</span><span style="color: rgba(0, 0, 255, 1)">="String"</span><span style="color: rgba(255, 0, 0, 1)"> resultType</span><span style="color: rgba(0, 0, 255, 1)">="Integer"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> select count(*) from information_schema.TABLES where LCASE(table_name)=#{tableName} </span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">select</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">update </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="dropTable"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> DROP TABLE IF EXISTS ${tableName} </span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">update</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">update </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="createNewTable"</span><span style="color: rgba(255, 0, 0, 1)"> parameterType</span><span style="color: rgba(0, 0, 255, 1)">="String"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 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)) </span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">update</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">insert </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="insert"</span><span style="color: rgba(255, 0, 0, 1)"> parameterType</span><span style="color: rgba(0, 0, 255, 1)">="xx.xxx.xx.po.Trackpoint"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)"> 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}) </span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">insert</span><span style="color: rgba(0, 0, 255, 1)">></span>
</mapper>
Mapper.java
package xx.xxx.xx.mapper;import org.apache.ibatis.annotations.Param;
import xx.xxx.xx.po.Trackpoint;public interface OperateTableMapper {
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> existTable(String tableName); </span><span style="color: rgba(0, 0, 255, 1)">int</span> dropTable(@Param("tableName"<span style="color: rgba(0, 0, 0, 1)">)String tableName); </span><span style="color: rgba(0, 0, 255, 1)">int</span> createNewTable(@Param("tableName"<span style="color: rgba(0, 0, 0, 1)">)String tableName); </span><span style="color: rgba(0, 0, 255, 1)">int</span> insert(@Param("tableName")String tableName,@Param("trackpoint"<span style="color: rgba(0, 0, 0, 1)">)Trackpoint trackpoint);
}
如果此文对您有帮助,微信打赏我一下吧 ~