最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Spring動(dòng)態(tài)生成Mysql存儲(chǔ)過程詳解

 更新時(shí)間:2020年06月03日 14:56:30   作者:畫筆灬  
這篇文章主要介紹了Java Spring動(dòng)態(tài)生成Mysql存儲(chǔ)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、 背景

  由于公司業(yè)務(wù)需要?jiǎng)討B(tài)配置一些存儲(chǔ)過程來(lái)生成數(shù)據(jù),之前嘗試過使用jpa來(lái)完成,或多或少都存在一些問題,最后使用了spring的Jdbctemplate。

二、 環(huán)境

  1.此隨筆內(nèi)容基于spring boot項(xiàng)目

  2.數(shù)據(jù)庫(kù)為mysql 5.7.9版本

  3.jdk 版本為1.8

三、 說明

  說明:為方便表示,下列存儲(chǔ)過程在代碼中的表示我稱之為接口配置  

四、 內(nèi)容

  1、定義接口和接口參數(shù)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)接口配置參數(shù)bean:

@Entity
@Table(name="qt_interface_parameter")
public class QtInterfaceParameter {
 @Id
 private String id;
 @Column(name="inter_id")
 private String interId;
 private String name; //參數(shù)名稱
 private String explain_info; //參數(shù)描述
 private String type;// 輸入輸出類型
 private String paraType; // 參數(shù)類型
 private Integer paraLen;
//此處省略get、set…
}

2、編寫頁(yè)面輸入接口配置的信息;

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">接口狀態(tài)<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">已創(chuàng)建</option>
    </select>
 
  </div>
</div>
<div class="form-group">
  <label for="content" class="col-sm-2 control-label">接口內(nèi)容<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">接口參數(shù):</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部分代碼太長(zhǎng),就只貼一個(gè)提交方法吧

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)// 參數(shù)明細(xì)信息,字段就是接口配置參數(shù)bean 中的字段信息
};
 
  $.ajax({
    url: Url + 'test/createPro',
    type: 'get', //GET
    async: false,  //或false,是否異步
    data: JSON.stringify(postData),
    timeout: 5000,  //超時(shí)時(shí)間
    dataType: 'json',  //返回的數(shù)據(jù)格式:    success:   function (result, textStatus, jqXHR) {
      if (result.result == "1") { // 編輯賦值
        layer.alert("創(chuàng)建成功", {icon: 0});
      } else {
        layer.alert("創(chuàng)建失敗,請(qǐng)檢查sql語(yǔ)句,注意結(jié)尾不能有分號(hào)!具體錯(cuò)誤信息:"+result.msg, {icon: 5});
      }
    },
    error: function (xhr, textStatus) {
      layer.alert(textStatus);
    }
  });
}

3、將數(shù)據(jù)上傳到后臺(tái)之后,后臺(tái)生成存儲(chǔ)過程。當(dāng)然一般情況下,我們還是先把數(shù)據(jù)接口和接口明細(xì)數(shù)據(jù)持久化保存,再來(lái)執(zhí)行創(chuàng)建操作,可以保證數(shù)據(jù)不會(huì)丟失。此處由于篇幅問題,我就省略了中間這一步。

1)創(chuàng)建一個(gè)service 的接口:

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

2)然后創(chuàng)建接口的實(shí)現(xiàn)類:

@Service
public class TestServiceImpl implements TestService {
 
/**
 * 創(chuàng)建存儲(chǔ)過程
 *
 * @param map 接口配置和接口參數(shù)信息
 * 參數(shù)詳解: type 輸入輸出參數(shù),取值為 in,out
 *       paraType 參數(shù)類型。取值為: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(); // 建立生成過程的語(yǔ)句
  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()) { // 參數(shù)類型
      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()); // 存儲(chǔ)過程內(nèi)容
  bf.append(";\nEND;");
  // 先執(zhí)行刪除操作
  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 "));
  }
  //此處省略其他項(xiàng),其他項(xiàng)的取值方法跟上面的一樣 …
  return qtInterface;
}
 
/**
 * 初始化接口配置參數(shù)明細(xì)
 *
 */
  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();
        // 接口配置參數(shù)名稱
        if (map.get("name") != null && !"".equals(map.get("name "))) {
          para.setName((String) map.get("name "));
        }
        // 此處省略其他項(xiàng),其他項(xiàng)的取值方法跟上面的一樣 …
        list.add(para);
      }
    }
    return list;
  }

3) 添加控制器進(jìn)行調(diào)用:

@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("創(chuàng)建過程成功");
 
  } catch (Exception e) {
    resultInfo.setResult(-1);
    resultInfo.setMsg(e.getMessage());
  }
  return resultInfo;
 }
}

4)最后動(dòng)態(tài)生成的SQL就是這個(gè)樣子:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA打包應(yīng)用程序的教程圖解

    IDEA打包應(yīng)用程序的教程圖解

    這篇文章主要介紹了IDEA打包應(yīng)用程序的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • mybatis mapper.xml 區(qū)間查詢條件詳解

    mybatis mapper.xml 區(qū)間查詢條件詳解

    這篇文章主要介紹了mybatis mapper.xml 區(qū)間查詢條件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java統(tǒng)計(jì)字符串中重復(fù)字符出現(xiàn)次數(shù)的方法

    java統(tǒng)計(jì)字符串中重復(fù)字符出現(xiàn)次數(shù)的方法

    這篇文章主要介紹了java統(tǒng)計(jì)字符串中重復(fù)字符出現(xiàn)次數(shù)的方法,涉及java針對(duì)字符串的遍歷與判斷相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08
  • 基于Java實(shí)現(xiàn)音樂播放器的示例代碼

    基于Java實(shí)現(xiàn)音樂播放器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫一個(gè)簡(jiǎn)單的音樂播放器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-07-07
  • Spring底層原理深入分析

    Spring底層原理深入分析

    Spring框架是一個(gè)開放源代碼的J2EE應(yīng)用程序框架,由Rod Johnson發(fā)起,是針對(duì)bean的生命周期進(jìn)行管理的輕量級(jí)容器(lightweight container)。 Spring解決了開發(fā)者在J2EE開發(fā)中遇到的許多常見的問題,提供了功能強(qiáng)大IOC、AOP及Web MVC等功能
    2022-07-07
  • Java MD5加密(實(shí)例講解)

    Java MD5加密(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇Java MD5加密(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-08-08
  • Java程序運(yùn)行之JDK,指令javac java解讀

    Java程序運(yùn)行之JDK,指令javac java解讀

    這篇文章主要介紹了Java程序運(yùn)行之JDK,指令javac java,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java如何保證多個(gè)線程按一定順序執(zhí)行

    java如何保證多個(gè)線程按一定順序執(zhí)行

    這篇文章主要介紹了java如何保證多個(gè)線程按一定順序執(zhí)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • JAVA中AES加密方法實(shí)例分析

    JAVA中AES加密方法實(shí)例分析

    這篇文章主要介紹了JAVA中AES加密方法,實(shí)例分析了java中AES加密與解密的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java 創(chuàng)建URL的常見問題及解決方案

    Java 創(chuàng)建URL的常見問題及解決方案

    這篇文章主要介紹了Java 創(chuàng)建URL的常見問題及解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評(píng)論

秦皇岛市| 永春县| 襄垣县| 清水县| 盱眙县| 临海市| 平乡县| 灵武市| 壤塘县| 开封县| 新竹县| 绥宁县| 静安区| 重庆市| 明水县| 金坛市| 朔州市| 东港市| 东光县| 广水市| 石楼县| 庄浪县| 开平市| 平昌县| 同德县| 玛沁县| 米泉市| 三江| 新宾| 南宁市| 黑水县| 石台县| 谷城县| 河源市| 咸丰县| 长子县| 姚安县| 那曲县| 鄢陵县| 北宁市| 共和县|