Java Spring动态生成Mysql存储过程详解

一、 背景

  由于公司业务需要动态配置一些存储过程来生成数据,之前尝试过使用jpa来完成,或多或少都存在一些问题,最后使用了spring的Jdbctemplate。

二、 环境

  1.此随笔内容基于spring boot项目

  2.数据库为mysql 5.7.9版本

  3.jdk 版本为1.8

三、 说明

  说明:为方便表示,下列存储过程在代码中的表示我称之为接口配置  

四、 内容

  1、定义接口和接口参数bean;

    1)接口配置bean:

@Entity
@Table(name="qt_interface")
public class QtInterface {
 @Id
 private String id;
 private String name;
 private String content;
 private String info;
 private String status;
//此处省略get、set…
}

2)接口配置参数bean:

@Entity
@Table(name="qt_interface_parameter")
public class QtInterfaceParameter {
 @Id
 private String id;
 @Column(name="inter_id")
 private String interId;
 private String name; //参数名称
 private String explain_info; //参数描述
 private String type;// 输入输出类型
 private String paraType; // 参数类型
 private Integer paraLen;
//此处省略get、set…
}

2、编写页面输入接口配置的信息;

1)Html部分代码:

<div class="form-group">
  <label for="name" class="col-sm-2 control-label">接口名称<a style="color:red;">*</a>:</label>
  <div class="col-sm-4">
    <input type="text" id="name" name="name" class="form-control"/>
  </div>
  <label for="status" class="col-sm-2 control-label">接口状态<a style="color:red;">*</a>:</label>
  <div class="col-sm-4" >
    <select id="status" disabled="disabled" class="form-control">
      <option value="0">保存</option>
      <option value="1">已创建</option>
    </select>

  </div>
</div>
<div class="form-group">
  <label for="content" class="col-sm-2 control-label">接口内容<a style="color:red;">*</a>:</label>
  <div class="col-sm-10">
    <textarea id="content" name="content" rows="5" class="form-control"></textarea>
  </div>
</div>
<div class="form-group">
  <label for="explain_info" class="col-sm-2 control-label">接口说明:</label>
  <div class="col-sm-10">
    <textarea id="explain_info" name="explain_info" rows="3" class="form-control"></textarea>
  </div>
</div>
<div class="form-group">
  <label for="qtInterList" class="col-sm-2 control-label">接口参数:</label>
  <div class="col-sm-10">
    <div class="ibox-content" style="width:100%;">
      <table id="qtInterList" class="easyui-datagrid">
      </table>
    </div>
  </div>
</div>

2)Js部分代码太长,就只贴一个提交方法吧

function createProduce(inter_id) {
 var postData = {
    id: $("#inter_id").val(),
    item_id: $("#item_id").val(),
    name: $("#name").val(),
    content: $("#content").val(),
    explain_info: $("#explain_info").val(),
    jsonData: JSON.stringify(jsonData)// 参数明细信息,字段就是接口配置参数bean 中的字段信息
};

  $.ajax({
    url: Url + 'test/createPro',
    type: 'get', //GET
    async: false,  //或false,是否异步
    data: JSON.stringify(postData),
    timeout: 5000,  //超时时间
    dataType: 'json',  //返回的数据格式:    success:   function (result, textStatus, jqXHR) {
      if (result.result == "1") { // 编辑赋值
        layer.alert("创建成功", {icon: 0});
      } else {
        layer.alert("创建失败,请检查sql语句,注意结尾不能有分号!具体错误信息:"+result.msg, {icon: 5});
      }
    },
    error: function (xhr, textStatus) {
      layer.alert(textStatus);
    }
  });
}

3、将数据上传到后台之后,后台生成存储过程。当然一般情况下,我们还是先把数据接口和接口明细数据持久化保存,再来执行创建操作,可以保证数据不会丢失。此处由于篇幅问题,我就省略了中间这一步。

1)创建一个service 的接口:

public interface TestService {
    ResultInfo createPro(Map<String,Object> map);
}

2)然后创建接口的实现类:

@Service
public class TestServiceImpl implements TestService {

/**
 * 创建存储过程
 *
 * @param map 接口配置和接口参数信息
 * 参数详解: type 输入输出参数,取值为 in,out
 *       paraType 参数类型。取值为:1:int 2:double 3:varchar 4:datetime
 * @return
 */
@Override
@Transactional
public void createPro(Map<String,Object> map) {
  ResultInfo resultInfo = new ResultInfo();
  QtInterface qtInterface=new QtInterface();
  qtInterface =buildInterface(map, qtInterface);// 加载接口配置信息
  List<QtInterfaceParameter> paraList = new ArrayList<QtInterfaceParameter>();
  paraList = buildParam(map.get("jsonData"));// 加载接口配置信息
  StringBuffer bf = new StringBuffer(); // 建立生成过程的语句
  bf.append("create procedure \t");
  bf.append(qtInterface.getName());
  bf.append("\n");
  bf.append("(");
  String para_type = "";
  int i = 1;
  for (QtInterfaceParameter qt : paraList) {
    switch (qt.getParaType()) { // 参数类型
      case "1":
        para_type = "int";
        break;
      case "2":
        para_type = "double";
        break;
      case "3":
        para_type = "varchar(" + qt.getParaLen() + ")";
        break;
      case "4":
        para_type = "datetime";
        break;
      default:
        para_type = "varchar(255)";
        break;
    }
    if (i == paraList.size()) {
      bf.append("" + qt.getType() + " " + qt.getName() + " " + para_type + ") ");
    } else {
      bf.append("" + qt.getType() + " " + qt.getName() + " " + para_type + ", ");
    }

    i++;
  }
  bf.append(" COMMENT '"+ qtMonitorWarnInterface.getInfo() +"'\n"); // 添加描述信息
  bf.append("BEGIN\n");
  bf.append(qtInterface.getContent()); // 存储过程内容
  bf.append(";\nEND;");
  // 先执行删除操作
  jdbcTemplate.execute("drop procedure if exists " + qtInterface.getName() + " ;");
  jdbcTemplate.execute(bf.toString());

}

/**
 * 初始化接口配置信息
 *
 */
private QtInterface buildInterface(Map<String, Object> map, QtInterface qtInterface) {
  // 接口配置名称
  if (map.get("name") != null && !"".equals(map.get("name "))) {
    qtInterface.setName((String) map.get("name "));
  }
  //此处省略其他项,其他项的取值方法跟上面的一样 …
  return qtInterface;
}

/**
 * 初始化接口配置参数明细
 *
 */
  private List<QtInterfaceParameter> buildParam(String postData) {
    List<QtInterfaceParameter> list = new ArrayList<QtInterfaceParameter>();
    if(postData!=null &&!"".equals(postData)){
      List<Map<String, Object>> listParam = (List<Map<String, Object>>) JsonMapper.fromJsonString(postData, ArrayList.class);
      for (Map<String, Object> map : listParam) {
        QtInterfaceParameter para = new QtInterfaceParameter();
        // 接口配置参数名称
        if (map.get("name") != null && !"".equals(map.get("name "))) {
          para.setName((String) map.get("name "));
        }
        // 此处省略其他项,其他项的取值方法跟上面的一样 …
        list.add(para);
      }
    }
    return list;
  }

3) 添加控制器进行调用:

@Controller
@RequestMapping(value = "/test")
public class TestController {
@Autowired
private TestService testService;

@RequestMapping(value = "/createPro", method = RequestMethod.GET)
public ResultInfo createPro(@RequestBody Map<String, Object> map
) {
  ResultInfo resultInfo = new ResultInfo();
  try {
    testService.createPro(Id);
  resultInfo.setResult(1);
    resultInfo.setMsg("创建过程成功");

  } catch (Exception e) {
    resultInfo.setResult(-1);
    resultInfo.setMsg(e.getMessage());
  }
  return resultInfo;
 }
}

4)最后动态生成的SQL就是这个样子:

CREATE PROCEDURE `testbase`.`test`(in a_user_id varchar(100))
  COMMENT '测试接口'
BEGIN
select * from userInfo where user_id=a_user_id;
END

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java连接mysql数据库实现单条插入和批量插入

    本文实例为大家分享了java连接mysql数据库实现单条和批量插入的具体代码,供大家参考,具体内容如下 本文插入数据库的数据来源:java + dom4j.jar提取xml文档内容 1.连接数据库 package com.njupt.ymh; import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.Connection; public class Connect_MySQL { priv

  • Java连接Mysql 8.0.18版本的方法详解

    关于Java和Mysql 8.0.18版本的连接方式,供大家参考,具体内容如下 1.官网下载mysql-server.(Connector/J记得安装) 安装教程参考: mysql 8.0.18 安装配置方法图文教程 mysql 8.0.18.zip安装配置方法图文教程(windows 64位) 2.安装完后在C盘找到mysql-connector-java-8.0.18.jar 3.记住路径后再idea中选择File-Project Structure-Modules-+号键添加jar包 4.

  • java连不上mysql8.0问题的解决方法

    本文为大家分享了java连不上MySQL8.0问题集合,供大家参考,具体内容如下 问题1:Client does not support authentication protocol requested by Server:- 问题2:Unknown initial character set index '255' received from server- 问题3:MySQL8.0连接必要url语句 问题4:调用方法重复 运行问题1: 解决方法:(3句注意分号,wy123456是我数据库的

  • Java基于MySQL实现学生管理系统

    本文为大家分享了Java基于MySQL实现学生管理系统,供大家参考,具体内容如下 因为实验室要交作业然后就做了一个学生管理系统,贴个代码纪念一下,做的太急界面什么的也比较差. 还有一些小细节没有完善不过还是能实现主要的功能的. Window是主界面 package First; import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Window { pub

  • java连接mysql底层封装详解

    本文实例为大家分享了java连接mysql底层封装代码,供大家参考,具体内容如下 连接数据库 package com.dao.db; import java.sql.Connection; import java.sql.SQLException; /** * 数据库连接层MYSQL * @author Administrator * */ public class DBConnection { /** * 连接数据库 * @return */ public static Connection

  • Java+MySQL实现学生信息管理系统源码

    基于Java swing+MySQL实现学生信息管理系统:主要实现JDBC对学生信息进行增删改查,应付一般课设足矣,分享给大家.(由于篇幅原因,代码未全部列出,如有需要留下邮箱) 鉴于太多同学要源码,实在发不过来,上传到github上 https://github.com/ZhuangM/student.git 1. 开发环境:jdk7+MySQL5+win7 代码结构:model-dao-view 2. 数据库设计--建库建表语句: CREATE DATABASE student; DROP

  • Java连接mysql数据库代码实例程序

    这篇文章主要介绍了java连接mysql数据库代码实例程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 用java 联接mysql的实例 在联接的时候,先确保本机安装了mysql或者服务器是安装了mysql import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; imp

  • Java Spring动态生成Mysql存储过程详解

    一. 背景 由于公司业务需要动态配置一些存储过程来生成数据,之前尝试过使用jpa来完成,或多或少都存在一些问题,最后使用了spring的Jdbctemplate. 二. 环境 1.此随笔内容基于spring boot项目 2.数据库为mysql 5.7.9版本 3.jdk 版本为1.8 三. 说明 说明:为方便表示,下列存储过程在代码中的表示我称之为接口配置 四. 内容 1.定义接口和接口参数bean: 1)接口配置bean: @Entity @Table(name="qt_interface&

  • Java实现动态生成GIF图像详解

    目录 背景 特点 用途 AnimatedGifEncoder简介 GIF创作生成 一.创建maven项目 二.自定义生成 三.自定义将多张图片合成 话外题-怀念巨人 总结 背景 在互联网上有许多有趣的场景,其中的一种就是动图.这不是视频,而是一种GIF图像信息.虽然没有声音,却给我们带来了无穷的乐趣.如果说斗图是曾经聊天或者网聊的乐趣,那动图一定是承包了这种欢乐的技术原理. GIF的全称是Graphics Interchange Format,可译为图形交换格式,用于以超文本标志语言(Hyper

  • Java Spring AOP之PointCut案例详解

    目录 一.PointCut接口 二.ClassFilter接口 三.MethodMatcher接口 总结 一.PointCut接口 /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with

  • Java Spring Boot消息服务万字详解分析

    目录 消息服务概述 为什么要使用消息服务 异步处理 应用解耦 流量削峰 分布式事务管理 常用消息中间件介绍 ActiveMQ RabbitMQ RocketMQ RabbitMQ消息中间件 RabbitMQ简介 RabbitMQ工作模式介绍 Work queues(工作队列模式) Public/Subscribe(发布订阅模式) Routing(路由模式) Topics(通配符模式) RPC Headers RabbitMQ安装以及整合环境搭建 安装RabbitMQ 下载RabbitMQ 安装R

  • Java nacos动态配置实现流程详解

    目录 一.前言 二.在nacos上创建配置文件 创建配置文件 配置说明 发布并检查配置文件 三. 修改项目配置与动态读取配置文件 添加 nacos 动态配置依赖 在controller与service中使用动态配置 四. 动态配置网关的使用 一.前言 使用动态配置的原因: properties 和 yaml 是写到项目中的,好多时候有些配置需要修改,每次修改就要重新启动项目,不仅增加了系统的不稳定性,也大大提高了维护成本,非常麻烦,且耗费时间. 使用动态配置,则可以避免这些麻烦,可以动态的修改配

  • Java Spring之@Async原理案例详解

    目录 前言 一.如何使用@Async 二.源码解读 总结 前言 用过Spring的人多多少少也都用过@Async注解,至于作用嘛,看注解名,大概能猜出来,就是在方法执行的时候进行异步执行. 一.如何使用@Async 使用@Async注解主要分两步: 1.在配置类上添加@EnableAsync注解 @ComponentScan(value = "com.wang") @Configuration @EnableAsync public class AppConfig { } 2.在想要异

  • vue中v-model动态生成的实例详解

    vue中v-model动态生成的实例详解 前言: 最近在做公司的项目中,有这么一个需求,每一行有一个input和一个select,其中行数是根据服务器返回的json数据动态变化的.那么问题来了,我们要怎样动态生成v-model? 现在项目做完了就整理了一下,直接贴代码了. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <

  • Spring boot 使用mysql实例详解

    Spring boot 使用mysql实例详解 开发阶段用 H2即可,上线时,通过以下配置切换到mysql,spring boot将使用这个配置覆盖默认的H2. 1.建立数据库: mysql -u root CREATE DATABASE springbootdb 2.pom.xml: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId&g

  • java仿Servlet生成验证码实例详解

    java仿Servlet生成验证码实例详解 实现原理:使用BufferedImage对象的Graphics来进行绘制,然后输出成一张图片进行保存 实现代码及详解: public class validateCode{ private static Random rand = new Random(); public static void main(String[] args){ int val1 = rand.nextInt(9); int val2 = rand.nextInt(9); in

  • Java Spring MVC获取请求数据详解操作

    目录 1. 获得请求参数 2. 获得基本类型参数 3. 获得POJO类型参数 4. 获得数组类型参数 5. 获得集合类型参数 6. 请求数据乱码问题 7. 参数绑定注解 @requestParam 8. 获得Restful风格的参数 9. 自定义类型转换器 1.定义转换器类实现Converter接口 2.在配置文件中声明转换器 3.在<annotation-driven>中引用转换器 10. 获得Servlet相关API 11. 获得请求头 11.1 @RequestHeader 11.2 @

随机推荐