MySQL随笔(一)
一、MYSQL 获取当前时间加上一个月
update user set leverstart=now(),leverover=date_add(NOW(), interval 1 MONTH) where id=1;
注:
date_add() 增加 date_sub() 减少
month 月份 minute 分钟 second 秒
now() 当前时间
二、Mybatis批量插入数据
ServiceImpl:
List<ReportWarrantDetail > reportWarrantDetails = new ArrayList<>();
ReportWarrantDetail reportWarrantDetail = new ReportWarrantDetail();
reportWarrantDetail.setId("1");
reportWarrantDetail.setParentId("2");
reportWarrantDetail.setTransDate(new Date());
reportWarrantDetails.add(reportWarrantDetail);
Integer count = reportWarrantDetailMapper.insertBatch(reportWarrantDetails);
Mapper.java:
int insertBatch(List<ReportWarrantDetail> reportWarrantDetails);
Mapper.xml:
<insert id ="insertBatch" parameterType="java.util.List" >
<foreach collection="list" item="reportWarrantDetail" index="index" separator=";">
insert into t_report_warrant_detail
<trim prefix="(" suffix=")" suffixOverrides="," >
id,parent_id,trans_date,
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=", " >
#{reportWarrantDetail.id,jdbcType=BIGINT}, #{reportWarrantDetail.parentId,jdbcType=BIGINT}, #{reportWarrantDetail.transDate,jdbcType=TIMESTAMP},
</trim>
</foreach>
</insert>
注:
对于foreach标签的解释参考了网上的资料,具体如下:
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map
insert into t_report_warrant_detail (id, parent_id, trans_date) values (?,?,? ),(?,?,? ),(?,?,? ),(?,?,? ),(?,?,? )
三、批量更新
Mapper.xml:
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="reportWarrantDetail" index="index" open="" close="" separator=";">
update t_report_warrant_detail
<set>
is_valid = 'N',
update_time = now(),
</set>
where id = ${reportWarrantDetail.id}
</foreach>
</update>
四、mysql按,分隔字符串
在mysql中提供了一些字符串操作的函数,其中SUBSTRING_INDEX(str, delim, count)
str: 要处理的字符串
delim: 分割符
count: 计数 如果为正数,则从左开始数,如果为负数,则从右开始数
例:
str = 'www.baidu.com';
五、IF和IFNULL函数用法
IFNULL(expr1,expr2)
如果 expr1 不是null,IFNULL返回 expr1,否则它返回 expr2。
IF(expr1,expr2,expr3)
如果expr1的值为true,则返回expr2的值,如果expr1的值为false,
则返回expr3的值。
六、Case。。。When。。。Then。。。End用法
第一种:简单Case函数
case 列名
when 条件值1 then 选择项1
when 条件值2 then 选项2.......
else 默认值 end
第二种:Case搜索函数
case
when 列名= 条件值1 then 选择项1
when 列名=条件值2 then 选项2.......
else 默认值 end
比较: 两种格式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。如下面这个例子:
CASE col
WHEN col_1 IN ( 'a', 'b') THEN '第一类'
WHEN col_1 IN ('a') THEN '第二类'
ELSE'其他' END
这个语句中,满足条件a永远不会返回第二类,因为按顺序发现a在第一类的时候查询就已经结束了。所以case无法用于一个东西在一个分类里有不同的属性的条件。
case when 好处很明显就是非常易于看懂,相比实现同样条件用复杂的自连接查询,在逻辑上很容易看懂(自连接查询在不同的情况下可能会有BUG)。