判断同名股票是否存在的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日--
判断同名股票是否存在的MyBatis查询函数写法的更多相关文章
- MyBatis 查询映射自定义枚举
背景 MyBatis查询若想映射枚举类型,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用 ...
- mybatis查询语句的背后之封装数据
转载请注明出处... 一.前言 继上一篇mybatis查询语句的背后,这一篇主要围绕着mybatis查询的后期操作,即跟数据库交互的时候.由于本人也是一边学习源码一边记录,内容难免有错误或不足之处,还 ...
- mybatis 查询 xml list参数
mybatis 查询 xml list参数: <select id="getByIds" resultType="string" parameterTyp ...
- mybatis查询异常-Error querying database. Cause: java.lang.ClassCastException: org.apache.ibatis.executor.ExecutionPlaceholder cannot be cast to java.util.List
背景,mybatis查询的时候直接取的sqlsession,没有包装成SqlSessionTemplate,没有走spring提供的代理. 然后我写的获取sqlsession的代码没有考虑到并发的情况 ...
- mybatis查询语句的背后
转载请注明出处... 一.前言 在先了解mybatis查询之前,先大致了解下以下代码的为查询做了哪些铺垫,在这里我们要事先了解,myabtis会默认使用DefaultSqlSessionFactory ...
- mybatis查询语句的背后之参数解析
转载请注明出处... 一.前言 通过前面我们也知道,通过getMapper方式来进行查询,最后会通过mapperMehod类,对接口中传来的参数也会在这个类里面进行一个解析,随后就传到对应位置,与sq ...
- mybatis查询结果和接收的不一样
记一次大坑:mybatis查询结果和接收的不一样,折腾我好几个小时. 先上代码:代码是要查询排名,sql执行的结果 SELECT b.operator_id, b.class_count, b.cla ...
- 【mybatis】【mysql】mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains no ...
- Android 判断SD卡是否存在及容量查询
Android 判断SD卡是否存在及容量查询的简单方法如下: 首先要在AndroidManifest.xml中增加SD卡访问权限 <!-- 在SDCard中创建与删除文件权限 --> &l ...
随机推荐
- WordPress固定链接后404的解决方法
一般Wordpress自带的链接是一大串数字加符号,不美观也不明确,一般要设置成固定链接,而设置成功后大部分情况访问文章,子链接都会出现404界面,我找了网上的资料,才知道需要配置伪静态链接, 一般的 ...
- C++socket编程write()、read()简介及与send()、recv()的区别
1. write 函数原型:ssize_t write(int fd, const void*buf,size_t nbytes)write函数将buf中的nbytes字节内容写入文件描述符fd.成功 ...
- centos环境 使用kubeadm快速安装k8s集群v1.16.2
全程使用root用户运行,宿主机需要连接外网 浏览一下官方kubeadm[有些镜像用不了] https://kubernetes.io/docs/setup/production-environmen ...
- Linux Centos 下安装npm 实测可用
转载地址 https://blog.csdn.net/u012129607/article/details/60966045 1.root 登录linux 2.没有目录就自己创建一个 cd /usr/ ...
- 集中式版本管理系统 SVN使用
SVN的使用 SVN的文件状态 黑色:正常的文件 黄色文件(在Android Stduio中颜色):被忽略的文件 红色:文件没有Add的新文件(没有加入版本控制subversion中) 绿色:新文件A ...
- flask_restful实现文件下载功能
环境:前后端完全分离,后端flask_restful,前端vue from flask_restful import reqparse, Resource from flask import send ...
- noip复习——逆元
逆元,即对给定\(a,p\ (a \perp p)\),求\(x\)使得\(ax \equiv 1 \ (\bmod p)\) 逆元可以看做\(a\)在模\(p\)意义下的\(a^{-1}\).因此, ...
- Pytorch_第十篇_卷积神经网络(CNN)概述
卷积神经网络(CNN)概述 Introduce 卷积神经网络(convolutional neural networks),简称CNN.卷积神经网络相比于人工神经网络而言更适合于图像识别.语音识别等任 ...
- Vue.js中传值给子部件及触发动作的问题
最近研究一个用vue.js做的程序并修改增加功能.其中用到传值给子部件等问题. template中有个子部件: <template> ...... <child-form v-if ...
- 【Apollo】(1)--- Apollo入门介绍篇
Apollo入门介绍篇 Apollo有一点很好,就是它是由国内携程团队开发,而且文档写的很全,代码也完全开源.如果去了解它也可以直接去看它的官方文档. 一.配置中心概念 1.背景 在实际开发中都会与配 ...