判断同名股票是否存在的MyBatis查询函数写法

在A股中,除非股票退市,六位的股票代号是永不变化的,而名称则可能变化,比如更换主业,更换金主,因经营不善而戴帽等,这时名称都会改变。

因此,从网页上爬取的实时股票信息,需要常常与存在本地数据库里的信息进行比对,以便在股票名称变更时及时发现,于是便有了这段代码:

复制代码
        int inserted=0,updated=0;
        for(Stock s:stockList) {
            if(!stockMapper.isCodeExit(s)) {
                long nextId=stockMapper.getNextId();
                s.setId(nextId);
                stockMapper.insert(s);
                inserted++;
            }
            
            if(stockMapper.isNameChanged(s)) {
                stockMapper.updateName(s);
                updated++;
            }
        }
复制代码

stocklist是爬虫从凤凰财经获取的股票信息列表,循环中第一个判断便是看数据库中有没有代号存在,存在则进行插入超过;第二个判断便是看股票的名称是否变化了,如果变化则进行变更名称操作。

两个进行判断操作的函数如下:

    @Select("select (case count(*) when 0 then 0 else 1 end) from stock where code=#{code} ")
    boolean isCodeExit(Stock s);
    
    @Select("select (case count(*) when 1 then 1 else 0 end) from stock where code=#{code} and name!=#{name}")
    boolean isNameChanged(Stock s);

第一个函数是取名称相同的记录数量,得到0便算false,其他全算true;第二个函数是取名称不同而代号相同的记录数量,只有为1时才算true,其它全算false。

通过判断后,就进行插入或是更新操作:

    @Insert("insert into stock(id,code,name,utime) values(#{id},#{code},#{name},now())")
    int insert(Stock s);
    
    @Update("update stock set name=#{name},utime=now() where code=#{code}")
    int updateName(Stock s);

上面now()是MySQL取数据库系统时间函数,相当于Oracle里的sysdate。

再观察开头那段业务代码,里面有这样三句:

long nextId=stockMapper.getNextId();
s.setId(nextId);
stockMapper.insert(s);

可以观察得知stock的id是人为设置而不是自增的,而这取id的过程也值得说道一下:

    @Select("select (case (select count(*) from stock) when 0 then 0 else max(id)+1 end) from stock ")
    long getNextId();

一般来说,select max(id)+1 from stock就能达到目的,但如果stock表里空空如也,那么max(id)+1会返回空,MySql也不会把空转为long返回,于是程序执行就中断了。

于是用case when做个判断,stock表里没有数据则从0开始算起,这样便使程序强壮起来了。

在使用中我发现,case when 语句的语法灵活方便,且MySQL里和Oracle里是完全一样的,因为它是标准SQL,通用性比特定函数如nvl,decode,if,ifnull,iif要好,是值得推崇的写法。它与MyBatis结合返回布尔值的做法也值得掌握起来,这比去一个list回去拆开比较高效的多。

--2020年5月2日--

posted @   逆火狂飙  阅读(326)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2018-05-02 【高中数学/基本不等式】已知:a>1/3,b>1/3,且ab=2/9 求证:2/3倍根号2<=a+b<1
2015-05-02 查看Linux上MySQL版本信息
2014-05-02 CardLayout使用
2014-05-02 JCheckBox使用示例
2014-05-02 【Canvas与化学】钠元素
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示