springboot如何初始化执行sql语句

网友投稿 323 2022-10-18


springboot如何初始化执行sql语句

springboot初始化执行sql语句

开发的时候需要增加一些函数和表,同时因为一些基础数据例如字典表也需要插入一些数据,当然我可以跟组员说一声然后把sql语句给他们在本地执行,但是这样太low,不够自动化。

于是就开始研究如何在springboot启动时执行sql语句

最后查到资料

spring.datasource.schema=classpath:schema.sql

这个配置项决定建库文件的位置,注意classpath,之前我在网上查找资料都没有这个classpath,结果我的schema.sql文件放在哪都不好使,后来加上classpath才好用,文件放在resource下面就行了

我发现后面才是坑的地方,建立方法。

新建方法,首先要先删掉它,不然会报错,当然,方法里没有数据,自然想删就删,但是除此之外还有很多坑

drop function if exists `getChildrenProductName`;|

create function `getChildrenProductName`(orgid varchar(50))

returns varchar(4000)

BEGIN

DECLARE `oTemp` VARCHAR(4000);

DECLARE `oTemhttp://pChild` VARCHAR(4000);

DECLARE `oTempName` VARCHAR(4000);

DECLARE `oTempChildName` VARCHAR(4000);

DECLARE i int;

SET oTemp = CAST(orgid AS CHAR);

SET oTempChild = CAST(orgid AS CHAR);

set oTempName = '$';

set oTempChildName = '';

set i = 0;

WHILE oTempChild IS NOT NULL

DO

if i>0 then

set oTempName = concat(oTempName,",",oTempChildName);

end if;

SET oTemp = CONCAT(oTemp,',',oTempChild);

set i = i +1;

SELECT GROUP_CONCAT(p.product_name,p.partnum) into oTempChildName FROM product p

left join bom b on b.PartID = p.PartID

WHERE FIND_IN_SET(b.ParentPartID,oTempChild) > 0;

SELECT GROUP_CONCAT(p.PartID) INTO oTempChild FROM product p

left join bom b on b.PartID = p.PartID

WHERE FIND_IN_SET(b.ParentPartID,oTempChild) > 0;

END WHILE;

RETURN oTempName;

END;|

我这个人做事是步步为营的,都是先在数据库里执行了sql语句能用才会写上去的,但是我发现在mysql中能使用,放到schema.sql语句中就不好使了。在网上找了半天资料,发现没有提到这个问题的

过程就不说了,折腾了半天,我debug才发现,springboot框架把默认是按;号来分割语句的,所以创建函数时,他就把整个创建的语句按;号分割了,自然就报错了,这就是我在上面使用 | 的原因

当然,这也要配置

spring.datasource.separator=|

这样就可以了

对了,还有插入数据的需要,因为我是后添加的数据,所以不能重复添加,只有不存在数据才能添加,这个方法是我网上找的,可以用

INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?)

springboot项目中自己编写sql语句并调用

第一步:在 mapper 的接口中定义方法(使用到的PublishVo对象需要自己定义):

第二步:在 mapper 对应的 xml 文件中写 SQL 语句:

注意:xml 文件中 select 标签的 id 属性就是上一步在 mapper 接口中定义的那个方法名,resultType 就是返回的类型,在上一步的 mapper 接口中的返回类型是自定义的实体类型 PublishVo,因此就写上实体类 PublishVo 的全路径。

SQL语句的条件值要使用#,不能使用$,因为$会产生SQL注入问题。

第三步: 在 Controller 中编写 mapper 的调用

第四步:编写 service:

第五步:编写 service 的实现类:

然后再前端写方法调用后端的接口即可


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:做好线路运维管理,竟然能节省这么多费用
下一篇:某省电力公司
相关文章

 发表评论

暂时没有评论,来抢沙发吧~