mysql mybatis时间戳比较_在MYSQL和MyBatis中踩过的坑和小技巧

1. sum()和count()使用场景不对导致出错:

count(*)、count(1)、count(0)就是指绝对的行数,哪怕某行所有字段全部为null也会计算在内。count(1)和count(*)相比,innodb来说count(*)效率低。

如果count(列名)查询出来的结果就是查出列名中不为null的行数;

sum(列名)对指定列名进行求和

2. 比较好用的一些函数

2.1 CONCAT_WS和CONCAT比较举例:

函数

NULL

空字符串''

小结

CONCAT

SELECT CONCAT('First name',NULL,'Last Name') AS TEST;

SELECT CONCAT('First name','','Last Name') AS TEST2;

默认拼接的时候没有分隔符,直接拼接起来

CONCAT_WS

SELECT CONCAT_WS(',','First name',NULL,'Last Name') AS TEST;

SELECT CONCAT_WS(',','First name','','Last Name') AS TEST2;

拼接的内容之间使用第一个参数提供的分隔符分隔。如果想要直接拼接,但是需要忽略Null的话,可以使用空字符串做分隔符。效果就和CONCAT()一样了

2.2 GREATEST()和LEAST()

3. MyBatis把int类型的0处理成空串’’和mysql处理空串’’为0的问题,在Mybatis的Mapper中整数类型条件该如何判断?

当数据库字段类型是整数,如果参数变量为空字符串或者NULL,Mybatis会自动将参数赋值0,所以如果要判断整数参数的多种状态在传递数值到Mapper之前就要判断是否为空字符串和NULL并将相应的状态数值赋值给该参数,否则参数值等于空字符串、NULL和0得到的结果是一样的。

一般情况下,涉及到int类型的操作的时候,在Service中会统一把数字类型先变成字符串类型,然后再传递到Mapper中操作。

4. 时间戳的使用

在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它(可以给createtime使用这个):TIMESTAMP DEFAULT CURRENT_TIMESTAMP

在创建新记录和修改现有记录的时候都对这个数据列刷新(可以给update使用这个):

TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

5. Mysql中字符的定义

1. char和varchar限制的是字符,而不是字节。对不同的字符集来说,字符和字节的关系是不一定的。

2. 并且也不能按照换算关系换算比如一个汉字在utf8中用三个字节表示,那么换算成英语应该是对应三个英文字母。这种换算是错误的。如果声明了varchar(2)那么放中文汉字是两个汉字,放英文字母同样是两个

6. 在使用resultMap的时候,要把ID写在第一行,否则的话,就会报错。

原因可以通过查看resultMap的定义发现resultMap规定了排序,需要按照定义来排序才能解析通过,然后执行

id CDATA #REQUIRED

type CDATA #REQUIRED

extends CDATA #IMPLIED

autoMapping (true|false) #IMPLIED

>

7. 一般情况在Mapper中判断参数是否为空的时候是字符串居多,今天遇上需要判断list类型的的参数是否为空,依然习惯性的使用了下面的写法:

CT.TEST IN

#{item.test}

结果就报错了下面的错误:

Caused by: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.String

### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.String

最后,改成以下写法:

CT.TEST IN

#{item.test}

搞定。

8. 关于时间列表排序或者比较大小的问题

要想对一系列的时间进行排序,在排序之前要统一用date_format()把时间的格式转一下。否则的话,排序出来的顺序可能会出现错误。

9. 在MySQL中使用union的时候,如果紧挨着union的内层进行排序的话,是没有作用的

10. 更新一张表,限制条件也是从要更新的表里面抽取的。这是如果按照常规的sql来写。就会出现语法错误,执行不下去,需要变成下面的这种写法

-- 更新同一张表的写法

UPDATE BLOOD_PRESSURE_RECORD A1,

-- 从表中查出条件

(SELECT

MIN(BLOOD_PRESSURE_RECORD_KEY_ID) AS BLOOD_PRESSURE_RECORD_KEY_ID

FROM

BLOOD_PRESSURE_RECORD

WHERE

HYPERTENSION_RECORD_KEY_ID = 14) A2

SET

A1.SYSTOLIC_PRESSURE = 222,

A1.DIASTOLIC_PRESSURE = 321,

A1.MEASURE_DATE = '2016-10-12',

A1.MEASURE_DOCTOR = '123',

A1.EDITOR_ID = 34,

A1.EDITOR_NAME = '医生一号',

A1.UPDATE_TIME = NOW()

WHERE

A1.IS_ENABLE = 1

AND A1.BLOOD_PRESSURE_RECORD_KEY_ID = A2.BLOOD_PRESSURE_RECORD_KEY_ID

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值