优质博文IT-BLOG-CN灵感来源什么是存储过程存储过程Stored Procedure是指为了完成特定功能的SQL语句集经编译后存储在数据库中用户可通过指定存储过程的名字并给定参数如果该存储过程带有参数来调用执行。存储过程在数据库技术中属于一种服务端编程方式是一组预编译的SQL语句集常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等可以在执行过程中接受参数输入并返回查询结果。不推荐的原因【1】存储过程的所有逻辑都是在数据库层面导致代码后续的可维护性下降【2】存储过程可能会包含复杂的业务逻辑会导致数据库的负载增加影响数据库的性能【3】互联网的数据库由数据库部门专门管理和维护开发任务无法直接访问数据库。当将业务逻辑写在数据库中时后续对业务进行修改和维护时就需要同步升级存储过程。影响业务逻辑的维护性。【4】存储过程的本身是比较难以调试和测试的所有对于后续的维护也不是很方便。【5】数据库迁移困难如果需要从一种数据库迁移到另一种数据库例如从Oracle迁移到MySQL存储过程可能需要重写这会带来大量的工作量和风险。【6】管理困难随着存储过程的增多管理可能会变得非常混乱给维护工作带来极大的不便。【7】分布式场景的问题在分布式场景下存储过程可能无法很好地处理数据分片的问题。例如水平分表的情况下存储过程可能无法处理所有数据的分析结果。适合存储的场景存储过程的特点存储过程具有以下几个特点【1】封装性存储过程是由SQL语句和控制语句组成的过程它们被封装在一起形成了一个独立的对象这样可以方便客户端应用程序调用。【2】可重用性存储过程可以被多个客户端应用程序重复使用因为它们是预编译的可以在多个应用程序之间共享。【3】可编程性存储过程是可编程的可以由用户通过SQL语句和控制结构来定义和修改从而实现对数据库的操作。【4】安全性存储过程是在数据库中创建和保存的因此可以增加数据库的安全性。只有受权的用户才能调用存储过程避免了SQL注入攻击等安全问题。适合的场景像银行这类系统通常会采用商用的数据库Oracle、DB2等应为这些供应商有着完整的解决方案可以帮助银行规避大量的风险。银行的一些外围业务会使用一些国产的分布式数据库或者MySQL这样开源的数据库。银行是以数据为核心且早期银行在建设业务的时候没有好的国产数据库所以采采购了Oracle、DB2这样有成功经验的的数据库。且每套数据库都有着自己的一套存储过程开发方式只要掌握了存储过程的开发技巧对数据的交互过程是没有问题的对于前端使用go、java、c才是第二关心得问题。存储过程的语法DELIMITER // #将语句的结束符号从分号;临时改为两个//(可以是自定义) CREATE PROCEDURE CalculateSquare(IN num INT, OUT result INT) # CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...]) BEGIN SET result num * num; END // DELIMITER ; #将语句的结束符号恢复为分号【1】DELIMITER用于更改命令结束符以便在存储过程中使用BEGIN ... END语句。通常我们使用//作为新的结束符并在存储过程定义结束后将其改回;。【2】CREATE PROCEDURE用于创建新的存储过程。【3】CalculateSquare是存储过程的名称。【4】(IN num INT, OUT result INT)定义了输入和输出参数。在这个例子中num是一个输入参数result是一个输出参数。【5】BEGIN ... END之间的部分是存储过程的主体即要执行的SQL语句。调用存储过程要调用上述存储过程并获取结果你需要使用CALL语句并指定一个变量来接收输出参数的值SET input 5; SET output 0; CALL CalculateSquare(input, output); SELECT output; -- 输出应该是 25MyBatis调用存储过程【1】Mapper.xml文件的使用方式!-- 删除-无参 -- delete idcleanStored statementTypeCALLABLE {call bcjs_clean} /delete !-- 计算-有参 -- select idimplementStorage statementTypeCALLABLE parameterTypecom.meditrusthealth.fast.isip.web.request.actuary.ActuaryVersionReq {call bcjs_cal(#{projectId},#{userId},#{versionId})} /select【2】注解方式public interface LrMonitorConcentrationMapper extends BaseMapperLrMonitorConcentration { Select({call setValueIsNotNull(#{format})}) Options(statementType StatementType.CALLABLE) void implementStorage(String format); }