FunTester 我的开发日记 (四)

FunTester · 2020年06月18日 · 846 次阅读

今天有点跟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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册