一、java 获取时间的办法
java.util.Date
;
java.text.DateFormat
(抽象类);
java.text.SimpleDateFormat
(DateFormat的直接子类);
java.util.Calendar
(抽象类)。
因为Date的设计具有"千年虫"以及"时区"的问题,所以Date中的大部分方法已经不建议使用了,它们都被java.util.Calendar类所取代。
Calendar 类用于封装日历信息,其主要作用在于其方法可以对时间分量进行运算。
另外:获取时间的话, System.currentTimeMillis()
与 new Date().getTime()
与 Calendar.getInstance().getTime()
3个API的结果是一致的,除了计时方式UTC、GMT,和包装器以外,其余没啥区别。
System.currentTimeMillis() 耗时很少,几乎不用创建对象,所以比较快(是calendar的两三千倍),我们项目上都是用的这个。
参考:JAVA中关于获取时间(日期)的总结大全,
JAVA中 System.currentTimeMillis() 与 new Date().getTime() 与Calendar.getInstance().getTimeInMillis()区别
二、事务
事务:要么是xml、要么是注解方式,我们用的是注解的方式。@Transactional,设置的是 rollbackFor = {BizException.class}
来回滚。被catch处理了的异常,不会被事物作为判断依据; 如果异常被catch 了,但是又在catch中抛出了新的异常,那么事物会以这个新的异常作为是否进行回滚的判断依据。
我们的做法是在catch里面写TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();throw new BizException;
(自定义业务异常)
我只在总的方法上加了注解,事务的策略默认的是PROPAGATION_REQUIRED,意思是:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。所以有多个事务也会合成一个。
不过,阿里巴巴规范中推荐:事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。这样的话会让我们更清楚整个事务的流程吧,从注入事务管理器,到配置事务策略,设置状态点,到手动提交,如果有异常就手动回滚。当然这样就不要用注解了。
参考:SpringBoot声明式事务的简单运用,
Spring事务的传播:PROPAGATION_REQUIRED
三、 mybatis批量更新
一种 用for循环通过循环传过来的参数集合,循环出N条sql,(url加 &allowMultiQueries=true)
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update course
<set>
name=${item.name}
</set>
where id = ${item.id}
</foreach>
</update>
另一种 用mysql的case when 条件判断变相的进行批量更新
UPDATE course
SET name = CASE id
WHEN 1 THEN 'name1'
WHEN 2 THEN 'name2'
WHEN 3 THEN 'name3'
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
第一种效率其实相当高的,因为它仅仅有一个循环体,只不过最后update语句比较多,量大了就有可能造成sql阻塞。
第二种虽然最后只会有一条更新语句,但是xml中的循环体有点多,每一个case when 都要循环一遍list集合,所以大批量拼sql的时候会比较慢,所以效率问题严重。使用的时候建议分批插入。
参考:批量更新数据两种方法效率对比,
mybatis高效率批量update
另:MySQL事务锁问题-Lock wait timeout exceeded
四、前后台传换行符的问题
这个问题还没处理,处理后更新
(20210116更新:该问题已被前端悄悄搞定了,具体没问咋搞的。)
参考:前后台传换行符的问题,
传值包含换行符问题