mysql动态sql是什么,mysql中动态sql的一次实际应用

一、前言

本次实际应用中,使用到了如下几个要点:

mysql的动态建表;

mysql的多表插入;

mysql的多表更新;

mysql的多表删除;

二、使用场景

2.1 动态建表

要求建立多个表,例如电压、电流等表,这些表的字段是完全一样的,只有表名不一样,那么我们就可以把表名等字段放在基准表中,然后从基准表中获得所有的表名字段,以list的形式传入mybatis中,进行循环动态拼接创建。

void createTelemetryTable(List list);

复制代码

CREATE TABLE if not exists `${item}` (

sys_id bigint NOT NULL,

mpnt_id bigint NOT NULL,

data_date DATE NOT NULL,

data_point int NOT NULL,

data_item_id bigint NOT NULL,

val DECIMAL(10,2) NOT NULL,

KEY `${item}_sys_id` (`sys_id`),

KEY `${item}_mpnt_id` (`mpnt_id`),

KEY `${item}_data_date` (`data_date`),

KEY `${item}_data_point` (`data_point`),

KEY `${item}_data_item_id` (`data_item_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

复制代码

部分截图如下:

d66fecd80f743e5c0a149558cf3e12ce.png

2.2 多表批量插入

应用场景就是实际使用中,拿到一批数据,然后这批数据对应到多个不同表,那么最好的方式就是通过map映射,例如:Map>。那么这时候就需要自己来写动态sql了。

其中需要了解的两个mybatis注解就是:@Insert 和@InsertProvider 都是用来在实体类的Mapper类中的注解保存方法的SQL语句。区别就是@Insert是直接配置sql语句,而@InsertProvider则是通过sql工厂类及对应的方法生产sql语句,这种方法的好处就是可以写出更为复杂的sql。

@InsertProvider的注解方式为:

@InsertProvider(type = BaseMapperEnhanceImpl.class,method = "insertCalBatchTable")

void insertBatch(@Param("tables") Map> ycTable);

复制代码

说明:type指明sql工厂类,method是工厂类里对应的方法。

多表批量插入的代码如下:

/**

* 计算服务的批量插入:参数名称必须传 list ,例 @Param("list")

**/

public String insertCalBatchTable(Map map){

Map table = (Map) map.get("tables");

String sql = table.keySet().stream().map(i -> insertBatch((Collection) table.get(i),i)).collect(Collectors.joining());

return sql;

}

/**

* 计算服务批量插入

**/

private String insertBatch(Collection col,String table){

if(CollectionUtil.isEmpty(col)){

throw new RuntimeException("saveAll parameter size is zero or null");

}

Object t = null;

ArrayList list;

if(col instanceof List){

list = (ArrayList) col;

t = list.get(0);

}else{

throw new RuntimeException("Only list or set types are allowed");

}

Class cls = t.getClass();

Field[] fields = cls.getDeclaredFields();

StringBuffer sql = new StringBuffer();

sql.append("INSERT INTO `"+table+"` ");

sql.append("(");

for (Field field :fields) {

field.setAccessible(true);

TableField tableField = field.getAnnotation(TableField.class);

if(ObjectUtil.isNotNull(tableField)){

sql.append(tableField.value()+",");

}

}

sql.delete(sql.length()-1,sql.length());

sql.append(") VALUES ");

for (int i = 0; i < list.size(); i++) {

sql.append(list.get(i).toString());

if (i < list.size() - 1) {

sql.append(",");

}

}

sql.append(";");

return sql.toString();

}

复制代码

说明:可以看下这个插入对象的实体类:需要在待插入的字段上加上@TableField注解,然后通过重写toString来获取sql的插入语句:然后sql会自动把这些值给拼接上去。最后通过这个注解将这条动态语句插入到数据库中。

@Override

public String toString() {

return "("+this.getSysId()+","+this.getMpntId()+",'"+this.getDataDate()+"',"+this.getDataPoint()+","+ this.getDataItemId()+","+ this.getVal()+")";

}

复制代码

2.3 多表批量更新

应用场景与上同理,对多个表进行批量更新。传参形式依旧为如下:Map>。同理,在实体类中写了个获取update sql的方法:

@Data

@NoArgsConstructor

public class CalcDateCurve {

@TableField(value = "sys_id")

private long sysId;

@TableField(value = "mpnt_id")

private long mpntId;

@TableField(value = "data_date")

private Date dataDate;

@TableField(value = "data_point")

private Integer dataPoint;

@TableField(value = "data_item_id")

private long dataItemId;

@TableField(value = "val")

private BigDecimal val;

private String key;

@Override

public String toString() {

return "("+this.getSysId()+","+this.getMpntId()+",'"+this.getDataDate()+"',"+this.getDataPoint()+","+ this.getDataItemId()+","+ this.getVal()+")";

}

public String updateSql() {

return "val ="+this.getVal()+" where sys_id="+this.getSysId() +" and mpnt_id="+this.getMpntId() +" and data_date = '"+this.getDataDate()+"' and data_point="+this.getDataPoint()+" and data_item_id="+this.getDataItemId() ;

}

}

复制代码

mapper 层:

@UpdateProvider(type = BaseMapperEnhanceImpl.class,method = "updateCalBatchTable")

void updateBatch(@Param("tables") Map> ycTable);

复制代码

工厂类方法:

/**

* 计算服务的批量更新

**/

private String updateBatch(Collection col,String table) {

if(CollectionUtil.isEmpty(col)){

throw new RuntimeException("saveAll parameter size is zero or null");

}

Object t = null;

ArrayList list;

if(col instanceof List){

list = (ArrayList) col;

t = list.get(0);

}else{

throw new RuntimeException("Only list or set types are allowed");

}

Class cls = t.getClass();

Field[] fields = cls.getDeclaredFields();

StringBuffer sql = new StringBuffer();

for (int i = 0; i < list.size(); i++) {

try {

sql.append("UPDATE `"+table+"` SET ");

sql.append(list.get(i).getClass().getDeclaredMethod("updateSql").invoke(t));

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

sql.append(";");

return sql.toString();

}

复制代码

说明:这块用到了反射该类来获取该类的某个方法,也是自己在项目中第一次用到反射的东西。

2.4 批量删除表

这个小玩意也记录下来,手动去清除表:查出所有语句遍历执行也是可以改进的。

Select CONCAT( 'drop table ', table_name, ';' )

FROM information_schema.tables

Where table_name LIKE 'calc%';

复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC会话教程

会话管理是每个Web应用程序必不可少的部分。 由于Spring MVC是用于Web开发的功能强大的框架&#xff0c;因此它具有自己的工具和API与会话进行交互。 今天&#xff0c;我打算向您展示Spring MVC应用程序中会话处理的基本方法。 这意味着处理表单&#xff0c;将对象添加到会话中…

如何运行开源的安卓项目?

第一步:进入github开源安卓项目中&#xff0c;点击clone 第二步&#xff1a;打开android studio&#xff0c;选择checkout从Git中迁出项目 将github的地址复制进去 第三步&#xff1a;系统会自动下载&#xff0c;加载一段时间。然后出现下面的就算是结束了。 最后&#xff0c;运…

fis pure开发php,50个精品网站鉴赏

50个精品网站鉴赏介绍给大家的是几千个世界优秀网站中的精中之精的作品&#xff0c;都有非常不错的创意&#xff0c;推荐给众多网站的设计人员&#xff0c;好好借鉴一下别人是怎么设计网站的。这些网站主要的制作工具为FLASH&#xff0c;因为它有较好、较强的动态效果&#xff…

微信公众平台——被动回复用户消息

微信公众平台——被动回复用户消息 开发模式下的回复信息基础接口&#xff0c;可用来向用户回复文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息、链接消息。 1、回复文本消息 function ReplyText(Msg: TMessage; MsgText: String): RawByteString; varX: I…

Java EE CDI bean范围

Java EE平台的上下文和依赖注入&#xff08;CDI&#xff09;是一项功能&#xff0c;可帮助将Java EE平台的Web层和事务层绑定在一起。 CDI是一组服务&#xff0c;可以一起使用&#xff0c;使开发人员可以轻松地在Web应用程序中使用企业bean和JavaServer Faces技术。 在CDI中&a…

php强类型 vscode,VSCode + WSL 2 + Ruby环境搭建图文详解

vscode配置ruby开发环境vscode近年来发展迅速&#xff0c;几乎在3年之间就抢占了原来vim、sublime text的很多份额&#xff0c;犹记得在2015-2016年的时候&#xff0c;ruby推荐的开发环境基本上都是vim和sublime text&#xff0c;然而&#xff0c;随着vscode的发展&#xff0c;…

关于网页导航栏制作的几种方法与常见问题解决(新人向)

无序列表是html页面排版经常用到的非常实用的标签&#xff0c;但是新手在使用无序列表时&#xff0c;经常会在横向排版上出现问题&#xff0c;笔者在这里提供了笔者在使用无序列表制作网页导航栏时的几种方法与常见问题的解决问题。&#xff08;以css内部样式为例&#xff09; …

html 语义化标签拾遗

1、del和ins标签 兼容性&#xff1a;浏览器全部支持 del&#xff1a;定义文档中已被删除的文本。 ins&#xff1a;定义已经被插入文档中的文本。 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><title>ht…

Spring MVC表单教程

本教程将展示如何在Spring MVC中处理表单提交。 我们将定义一个控制器来处理页面加载和表单提交。 您可以在GitHub上获取代码。 先决条件&#xff1a; 您应该有一个运行中的Spring MVC应用程序。 如果尚未设置正常的Spring MVC应用程序&#xff0c;请按照本教程进行操作 。 对…

我们十组的cantool装置的使用

十组的cantool装置的使用 下图是连接好的示意图&#xff0c;灯亮。 如果在串口关闭的时候输入C&#xff0c;cantool装置就会报错&#xff0c;因为串口是关闭的。正如需求文档里写的&#xff0c;当串口关闭&#xff0c;输入C要有返回\BEL的,关闭串口的前提是串口打开。 正确发送…

2018-05-05(在小程序中使用图标)

项目中常常需要使用到字体图标&#xff0c;微信小程序中使用字体图标与在平常的web前端中类似但是又有区别。下面以使用阿里图标为例子讲解如何在微信小程序中使用字体图标。 第一步&#xff1a;下载需要的字体图标 进入阿里图标官网http://iconfont.cn/搜索自己想要的图标&…

Django的模板系统

一、模板的组成 html代码和逻辑控制代码 二、逻辑控制代码的形式 1、变量&#xff08;使用双大括号引用变量&#xff09; a、template和context 语法 : {{ var_name }} 模板系统不仅可以传字符串&#xff0c;它可以传递任意对象&#xff0c;对于向列表、字典、元组等对象&…

Java SE 7 Update 25 –发行说明进行了解释。

昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是与所有其他Oracle产品一起不符合Oracle关键补丁更新计划的最后一个更新。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布周期。 但…

Ansible: hosts文件拆分为inventory和定义inventory全局变量

前言 随着管理机器的增多&#xff0c;我们在使用Ansible的时候时常会遇到hosts文件过于冗长的问题&#xff0c;极其不便于管理&#xff0c;而将hosts文件拆分为inventory就可解决该问题&#xff1b;另外&#xff0c;hosts中的每个主机条目需要指定用户名和私钥或密码&#xff0…

Eclipse中 如何实现 多行同时编辑

在编辑的时候按下 SHIFT ALT A 之后 鼠标变为 号 选择要同时编辑几行 即可编辑&#xff08;现在eclipse好像只能是编辑一块地方 不能像vs那样 任何地方可以同时编辑 这点很鸡肋&#xff09; 如图 退出编辑 再次 按 SHIFT ALT A 即可 转载于:https://www.cnblogs.com…

检测和删除多余无用的css

本文主要讲解如何检测页面中多余无用的css。 1、chrome浏览器 F12审查元素的Audits 说明&#xff1a;使用Audits&#xff0c;会检测出页面中没有用到的css&#xff0c;需要手动删除多余的css&#xff1b;同时需要说明的是检测出多余无用的css块&#xff0c;而不是某一行css。 …

vue支付密码

从网上搜索了好多都很麻烦&#xff0c;花了点事件自己做了个&#xff0c;简单轻便&#xff0c;老少皆宜 <template> <section class"pay-mask" click"close_mask" v-show"payshow"> <div class"container"> <div…

打造智能建筑商

构建API时&#xff0c;您应该始终考虑谁将使用它。 当API简单易用时&#xff0c;用户就会感到满意。 当用户满意时&#xff0c;每个人也都会满意。 但是出色的可用性并非总是容易实现的。 有一些模式对此有所帮助&#xff0c;在这篇文章中&#xff0c;我将重点介绍经典的构建器…

结合BeautyEye开源UI框架实现的较美观的Java桌面程序

BeautyJavaSwingRobot 结合BeautyEye开源UI框架实现的较美观的Java桌面程序&#xff0c;主要功能就是图灵机器人和一个2345网站万年历的抓取。。。。   挺简单而且实用的一个项目&#xff0c;实现出来的效果也还不错。希望可以学到知识的小可爱不对应该是帅哥&#xff0c;可…

【从入门到放弃】23种设计模式(1):设计模式综述

一、设计模式的分类 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式&#xff08;Factory Method&#xff09;、抽象工厂模式&#xff08;Abstract Factory&#xff09;、单例模式&#xff08;Singleton&#xff09;、建造者模式…