我的开发日记(四)

今天有点跟mysqlmybatis杠上了,解决了两个问题都是这方面的,特别是复杂SQLXML配置文件中的设置有点怀疑人生的感觉。

从mysql读取map

想法如下:因为servicehost的对应关系放在库里,读取不方便,我打算存在JVM里面。这个本来总体来说挺简单的,只是一开始不知道数据结构导致我排查了一阵子。里面有个坑:有个字节数据库字段类型数字,但是长度比较长,11位,我用get(service_id).toString()总是报错,后来多了一步:先用一个Object类型接收,然后在toString就解决了这个问题。

报错内容如下:

Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
	at com.okay.family.common.StartRun.lambda$run$0(StartRun.java:34)
	at com.okay.family.common.StartRun$$Lambda$579/1939282277.apply(Unknown Source)
	at java.util.stream.Collectors.lambda$toMap$172(Collectors.java:1320)
	at java.util.stream.Collectors$$Lambda$583/629078509.accept(Unknown Source)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at com.okay.family.common.StartRun.run(StartRun.java:34)
	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795)
	... 5 common frames omitted

XML配置

<select id="findAllHost" resultType="java.util.HashMap">
        SELECT service_id,domain
        FROM
        <include refid="ENV_TABLE"/>
    </select>
  • 接收方法List<HashMap<String, String>> findAllHost();

数据处理方法

 List<HashMap<String, String>> hosts = commonMapper.findAllHost();
        Map<Integer, String> collect = hosts.stream().collect(Collectors.toMap((x -> {
            Object service_id = x.get("service_id");
            return Integer.parseInt(service_id.toString());
        }), (x -> "https://" + x.get("domain"))));
        ServerHost.init(collect);

insert select where

这个说起来有点复杂。我需要在数据库中创建一条记录,然后部分字段内容我需要从另外的两个表里面查询。在经历过一个小时的查阅、摸索、尝试终于搞完了。

  • 这里有个坑,就是select里面如果想添加变量值作为常量,必需通过一个字段别名实现,不然会把变量值当做字段名去后面的表中查询,导致报错:### Error updating database. Cause: java.sql.SQLSyntaxErrorException: Duplicate column name '1001'

XML配置

    <insert id="addCase" useGeneratedKeys="true" keyProperty="id"
            parameterType="com.okay.family.common.bean.testcase.request.CaseAttributeBean">
        INSERT INTO
        <include refid="table"/>

        (uid,editor,envId,serviceId,moduleId,apiId,name,level,host,path,type,method,headermoco,paramsmoco)

        select * from (select
        #{uid} aa,#{uid} bb,#{envId} cc,#{serviceId} dd ,#{moduleId} ee ,#{apiId} ff,#{name} gg,1,CONCAT("https://",domain),api_url,api_action,api_method,header_para,request_par
        FROM
        <include
                refid="api_info"/>
        a LEFT JOIN
        <include refid="server_env"/>
        s ON a.service = s.service_id WHERE a.id = #{apiId}) t

    </insert>

后来想想host其实不用存在数据库的,单还是想把这个SQL记录下面,慰藉我那逝去的一个小时(中间因为拼接错误被坑了半小时左右)。


  • 郑重声明:公众号“FunTester”首发,欢迎关注,禁止第三方转载。更多原创文章:FunTester十八张原创专辑,合作请联系Fhaohaizi@163.com

热文精选

posted @   FunTester  阅读(206)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示