MySQL
1.通过SQL语句规范时间格式:
select
DATE_FORMAT(t.startTime,"%Y-%m-%d %H:%i") AS startTime,
DATE_FORMAT(t.endTime,"%Y-%m-%d %H:%i") AS endTime
from table
2.不存在则插入,存在则更新
不存在则插入,存在则更新的实现方案大致可以分为三种。
- 逻辑控制+SQL语句
首先通过代码检测是否存在主键,如果存在则插入,否则进行更新操作。该方法需要代码层的支撑,编写复杂,性能不高。 - 传统的SQL语句实现
在SQL语句中存在着if判断
if not exists (select ...)
insert ...
else
update
该方法其实也使用了判断语句,且编写过程复杂,性能不高。
- ON DUPLICATE KEY UPDATE
mysql提供了on duplicate key update语句(在key值存在时更新)。
1:ON DUPLICATE KEY UPDATE需要有在INSERT语句中有存在主键或者唯一索引的列,并且对应的数据已经在表中才会执行更新操作。而且如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。
2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据。
注意update方法里面无需使用set关键字。该语句的使用如下:
insert into tableName
(key,value)
values
(x1,x2)
on duplicate key update
value = 'x2'
//需要注意的是update后面的语句并不建议更改key值,但是可以更改key为不冲突的其他key值
Mybatis
1.where标签
再使用mybatis的过程中经常会使用if便签,if便签会根据test的boolean结果来决定是否需要将内部的SQL嵌套到SQL语句中,在if语句中经常使用到了and,而往往会遇到where and连用错误。
mybatis提供了where便签,该标签主要提供两大作用:
- 如果where便签的子句没有需要进行嵌套的,则不再SQL语句中添加where关键字
select *
from tableName
<where>
<if test = "1!=1">
and columnName = 'x'
</if>
<where>
以上SQL语句等价于
select *
from tableName
- 如果where便签和内部的if便签产生了where and效果,则where标签则自动的去掉and关键字。
select *
from tableName
<where>
<if test = "1 == 1">
and columnName = 'x'
</if>
<where>
以上SQL语句等价于
select *
from tableName
where columnName = 'x'
2.set标签
使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。 set标签一般使用在update中。
update tableName
<set>
<if test = "">
columnName1 = 'x1',
</if>
<set>
等价于
update tableName
set
columnName1 = 'x1'
即通过使用set便签可以自动生成set,和省去最后一个,后。但需要注意的是update语句必须有set子句,且set子句必须有赋值语句。否则报错。
3.模糊查询
CONCAT("%", #{o.id},"%") 在使用mysql进行模糊查询时一般是进行字符串相加,再mybatis中使用concat关键字将字符串相加。concat关键字可以将他所包好的字符串按照先后顺序进行添加。
4.foreach便签
mybatis可以动态生成SQL语句,因此可以借助foreach标签来实现一个些功能。在mybatis中的foreach便签相当于将数组或者链表中的元素拼接成一个字符串。(foreach对数组和链表的处理是将他们转化为map,它支持map的处理)。
<select id="dynamicForeach2Test" resultType="Blog">
select * from t_blog where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")"><!--处理数组-->
#{item}
</foreach>
</select>
<select id="countByUserList" resultType="_int" parameterType="list">
select count(*) from users
<where>
id in
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item.id, jdbcType=NUMERIC}
</foreach>
</where>
</select>