前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的开发日记(四)

我的开发日记(四)

作者头像
FunTester
发布2020-06-21 13:57:35
6270
发布2020-06-21 13:57:35
举报
文章被收录于专栏:FunTesterFunTester

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

从mysql读取map

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

报错内容如下:

代码语言:javascript
复制
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配置

代码语言:javascript
复制
<select id="findAllHost" resultType="java.util.HashMap">
        SELECT service_id,domain
        FROM
        <include refid="ENV_TABLE"/>
    </select>
  • 接收方法List<HashMap<String, String>> findAllHost();

数据处理方法

代码语言:javascript
复制
 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配置

代码语言:javascript
复制
  <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>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从mysql读取map
    • 报错内容如下:
      • XML配置
        • 数据处理方法
        • insert select where
          • XML配置
          相关产品与服务
          云数据库 SQL Server
          腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档