电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java Spring動態生成Mysql存儲過程詳解

瀏覽:59日期:2022-08-31 16:37:09

一、 背景

由于公司業務需要動態配置一些存儲過程來生成數據,之前嘗試過使用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' name='name' /> </div> <label for='status' class='col-sm-2 control-label'>接口狀態<a style='color:red;'>*</a>:</label> <div > <select 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 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 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 style='width:100%;'> <table 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)然后創建接口的實現類:

@Servicepublic class TestServiceImpl implements TestService { /** * 創建存儲過程 * * @param map 接口配置和接口參數信息 * 參數詳解: type 輸入輸出參數,取值為 in,out * paraType 參數類型。取值為:1:int 2:double 3:varchar 4:datetime * @return */@Override@Transactionalpublic 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('BEGINn'); 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 {@Autowiredprivate 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 ’測試接口’BEGINselect * from userInfo where user_id=a_user_id;END

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 宠物店加盟_宠物连锁店_开宠物店-【派多格宠物】 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 混合生育酚_醋酸生育酚粉_琥珀酸生育酚-山东新元素生物科技 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 踏板力计,制动仪,非接触多功能速度仪,逆反射系数测试仪-创宇 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 出国劳务公司_正规派遣公司[严海]| 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 清管器,管道清管器,聚氨酯发泡球,清管球 - 承德嘉拓设备 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 生产加气砖设备厂家很多,杜甫机械加气砖设备价格公道 | 深圳标识制作公司-标识标牌厂家-深圳广告标识制作-玟璟广告-深圳市玟璟广告有限公司 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 联系我们-腾龙公司上分客服微信19116098882| 工业CT-无锡璟能智能仪器有限公司| 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 |