在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查询函数写法的更多相关文章

  1. MyBatis 查询映射自定义枚举

    背景                  MyBatis查询若想映射枚举类型,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用         ...

  2. mybatis查询语句的背后之封装数据

    转载请注明出处... 一.前言 继上一篇mybatis查询语句的背后,这一篇主要围绕着mybatis查询的后期操作,即跟数据库交互的时候.由于本人也是一边学习源码一边记录,内容难免有错误或不足之处,还 ...

  3. mybatis 查询 xml list参数

    mybatis 查询 xml list参数: <select id="getByIds" resultType="string" parameterTyp ...

  4. 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的代码没有考虑到并发的情况 ...

  5. mybatis查询语句的背后

    转载请注明出处... 一.前言 在先了解mybatis查询之前,先大致了解下以下代码的为查询做了哪些铺垫,在这里我们要事先了解,myabtis会默认使用DefaultSqlSessionFactory ...

  6. mybatis查询语句的背后之参数解析

    转载请注明出处... 一.前言 通过前面我们也知道,通过getMapper方式来进行查询,最后会通过mapperMehod类,对接口中传来的参数也会在这个类里面进行一个解析,随后就传到对应位置,与sq ...

  7. mybatis查询结果和接收的不一样

    记一次大坑:mybatis查询结果和接收的不一样,折腾我好几个小时. 先上代码:代码是要查询排名,sql执行的结果 SELECT b.operator_id, b.class_count, b.cla ...

  8. 【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 ...

  9. Android 判断SD卡是否存在及容量查询

    Android 判断SD卡是否存在及容量查询的简单方法如下: 首先要在AndroidManifest.xml中增加SD卡访问权限 <!-- 在SDCard中创建与删除文件权限 --> &l ...

随机推荐

  1. 6、Java 运算符

    Java运算符按功能可分为:算数运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和条件运算符. 1.算数运算符 算术运算符包括通常的加(+).减(-).乘(*).除(/).取模(%),完成整数型和 ...

  2. 【Python学习笔记】字符串拼接方法(5种)总结

    字符串的 5 种拼接方法: “+”号 “,”号 直接连接 格式化 多行字符串拼接 第一种:“+”号 print("Hello"+"Python") 打印结果: ...

  3. 使用 VMware Workstation Pro 让 PC 提供云桌面服务——学习笔记(一)

    最终效果: 能够通过xshell等终端设备, 远程访问虚拟机 操作步骤 1. 安装VMware 网上自行下载VMware 软件,这里不给出详细操作 2. 下载安装系统 这里使用 Centos 的lin ...

  4. C++ STL sort 函数的用法

    sort 在 STL 库中是排序函数,有时冒泡.选择等 $\mathcal O(n^2)$ 算法会超时时,我们可以使用 STL 中的快速排序函数 $\mathcal O(n \ log \ n)$ 完 ...

  5. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.catherine.forrealm.about_utils.RealmHelper.findAllStudent()' on a null object reference

    报错: 解决方法: private RealmHelper realm_search = new RealmHelper(); 进而发现在写RecyclerView时,遗漏如下代码: recy_sea ...

  6. Android Studio gridview 控件使用自定义Adapter, 九宫格items自适应全屏显示

    先看效果图,类似于支付宝首页的效果.由于九宫格显示的帖子网上已经很多,但是像这样九宫格全屏显示的例子还不是太多.本实例的需求是九宫格全屏显示,每个子view的高度是根据全屏高度三等分之后自适应高度,每 ...

  7. 编译u-boot时候,make distclean 出现rm:无法删除,****是一个目录

    今天在编译u-boot的时候,make distclean,出现了rm:无法删除 "include/asm-arm/arch": 是一个目录.经过查看网友的解决办法,已经解决了. ...

  8. IDEA_Shelve代码搁置与恢复

    日常开发中,经常会遇到在当前分支开发到一半,但是需要Checkout上个版本解决bug或调查问题的情况.这个时候,我们是将代码提到Push远程?还是直接Rollback? 最理想的做法,就是将当前的开 ...

  9. python 复制与粘贴处理笔记

    在python中用有一个模块可以用来处理剪切板复制的内容,pyperclip模块 pyperclip模块有copy()和paste()函数,分别用于向计算机的剪贴板发送文本,或从它接受文本. pype ...

  10. 如何使用SPSSAU计算耦合协调度?

    什么是耦合协调度模型 耦合协调度模型用于分析事物的协调发展水平.耦合度指两个或两个以上系统之间的相互作用影响,实现协调发展的动态关联关系,可以反映系统之间的相互依赖相互制约程度.协调度指耦合相互作用关 ...