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" > <select id="existTable" parameterType="String" resultType="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="insert" parameterType="xx.xxx.xx.po.Trackpoint">
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>
Mapper.java
package xx.xxx.xx.mapper; import org.apache.ibatis.annotations.Param;
import xx.xxx.xx.po.Trackpoint; public interface OperateTableMapper { int existTable(String tableName); int dropTable(@Param("tableName")String tableName); int createNewTable(@Param("tableName")String tableName); int insert(@Param("tableName")String tableName,@Param("trackpoint")Trackpoint trackpoint);
}
如果此文对您有帮助,微信打赏我一下吧~

MyBatis动态创建表的更多相关文章
- Spring Boot:实现MyBatis动态创建表
综合概述 在有些应用场景中,我们会有需要动态创建和操作表的需求.比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等.这个时候就需要我们动态的生成和操作数据库表了. ...
- mybatis动态调用表名和字段名
以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...
- YII2框架动态创建表模型
YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ...
- python在sqlite动态创建表源码
代码之余,将开发过程中经常用的代码片段备份一下,如下的代码是关于python在sqlite动态创建表的代码,应该能对各位有所用. import sqlite3 as db conn = db.conn ...
- [转]MyBatis动态传入表名、字段名参数的解决办法
一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...
- 【死磕jeesite源码】mybatis动态调用表名和字段名
本文转载自夏雪冬日 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字 ...
- mybatis 动态添加表,查看表,添加数据
1.动态添加表 mapper int dropExistTable(@Param("tableName") String tableName);//自动创建数据表 映射文件 < ...
- MyBatis动态传入表名,字段名参数的解决办法
原文:http://blog.csdn.net/xichenguan/article/details/50393748 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=& ...
- mybatis动态传入表名、列名
原文:http://luoyu-ds.iteye.com/blog/1517607 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=”STATEMENT” (可省略) 同 ...
随机推荐
- (纯干货)最新WEB前端学习路线汇总初学者必看
Web前端好学吗?这是很多web学习者常问的问题,想要学习一门自己从未接触过的领域,事先有些了解并知道要学的内容,对接下来的学习会有事半功倍的效果.在当下来说web前端开发工程师可谓是高福利.高薪水的 ...
- vmware-tools安装——实用
1.vmware中点击安装或重新安装vmware-tools 2.在root终端解压并移动安装文件:tar -xvf VMwareTools-9.9.0-2304977.tar.gz -C /tmp ...
- java0429 wen 数据库
- CEF JS实现获取剪贴板图片的DataURL
转载:https://www.deanhan.cn/js-paste-upload.html 转载:https://segmentfault.com/a/1190000002915597 转载:htt ...
- php登录注册
php 登录注册 注册代码:register.php <style type="text/css"> form{ width:300px; background-col ...
- dom节点相关问题
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 【Java基础】浅谈常见设计模式
Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值 ...
- [CTF] RSA共模攻击
from gmpy2 import * import libnum n = 0x00b0bee5e3e9e5a7e8d00b493355c618fc8c7d7d03b82e409951c182f398 ...
- SQL server 批量插入和更新数据
批量插入数据 insert into A表数据库名.[dbo].A(a,b,c) (select a,b,c from B表数据库名.[dbo].B) 批量更新数据 根据身份证第二位更新性别 upda ...
- Java语言之循环基础;各个语句的区别
FOR: WHILE DO WHILE break 与 continue的区别 break直接中断语句跳出循环,continue跳出当前循环,后面会继续执行