java获取时间+事务+mybatis批量更新+前后端传值换行符问题=2020/12/14~12/18

一、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

四、前后台传换行符的问题

这个问题还没处理,处理后更新

参考:前后台传换行符的问题,
传值包含换行符问题

你可能感兴趣的:(java,mybatis,java,mybatis,数据库,mysql,spring)