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

从mysql读取map

想法如下:因为​​service​​和​​host​​的对应关系放在库里,读取不方便,我打算存在​​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记录下面,慰藉我那逝去的一个小时(中间因为拼接错误被坑了半小时左右)。