INSERTINTOlp_user_test_batch(id,user_id,user_name,user_age,type,create_time,update_time)VALUES(#{item.id,jdbcType=BIGINT},#{item.userId,jdbcType=VARCHAR},#{item.userName,jdbcType=VARCHAR},#{item.userAge,jdbcType=INTEGER},#{item.type,jdbcType=INTEGER},#{item.createTime,jdbcType=TIMESTAMP},#{item.updateTime,jdbcType=TIMESTAMP})测试结果
批量新增或更新方式注:需要给唯一主键添加唯一索引,update才会生效
INSERTINTOlp_user_test_batch(id,user_id,user_name,user_age,type,create_time,update_time)VALUES(#{item.id,jdbcType=BIGINT},#{item.userId,jdbcType=VARCHAR},#{item.userName,jdbcType=VARCHAR},#{item.userAge,jdbcType=INTEGER},#{item.type,jdbcType=INTEGER},#{item.createTime,jdbcType=TIMESTAMP},#{item.updateTime,jdbcType=TIMESTAMP})ONDUPLICATEKEYUPDATEuser_name=VALUES(user_name),user_age=VALUES(user_age),type=VALUES(type),update_time=VALUES(update_time)测试结果
单条sql+批量方式的SqlSession
INSERTINTOlp_user_test_batch(id,user_id,user_name,user_age,type,create_time,update_time)VALUES(#{item.id,jdbcType=BIGINT},#{item.userId,jdbcType=VARCHAR},#{item.userName,jdbcType=VARCHAR},#{item.userAge,jdbcType=INTEGER},#{item.type,jdbcType=INTEGER},#{item.createTime,jdbcType=TIMESTAMP},#{item.updateTime,jdbcType=TIMESTAMP})ONDUPLICATEKEYUPDATEuser_name=VALUES(user_name),user_age=VALUES(user_age),type=VALUES(type),update_time=VALUES(update_time)测试结果注:当前表内数据行数10000
优点:速度快缺点:使用特殊语法onduplicatekeyupdate语法增加sql难度性
优点:通过日志观察,生成一条执行语句sql,多行参数,统一commit缺点:比方式一速度略慢
java程序循环调用单条修改语句执行方式:一条sql,程序循环执行
for(UserTestBatchDOuserTestBatch:testBatchDAOList){userTestBatchDOMapper.updateByUserId(userTestBatch);}测试结果注:当前表内数据行数10000
优点:方便单条控制提交事物缺点:耗时,耗性能、每一次循环都需要与数据库交互一次
Mybatisforeach循环执行方式:拼接好一条sql,后执行
测试结果注:当前表内数据行数10000
优点:生成多条sql,统一执行,与数据库交互次数少缺点:生成多条拼接的update语句,update语句比较多,量大了就有可能造成sql阻塞。
mybatissql使用casewhen
缺点:xml中的循环体有点多,每一个casewhen都要循环一遍list集合,所以大批量拼sql的时候会比较慢。生成多条拼接sql,sql长度过长,容易sql超长引起报错Packetforqueryistoolarge。
Mybatis内置执行器类型ExecutorType有3种分别是ExecutorType.SIMPLE:不做特殊处理,为每个语句的执行创建一个新的预处理语句。ExecutorType.REUSE:可以复用预处理语句。ExecutorType.BATCH:可以批量执行所有更新语句
SIMPLE与BATCH(批量)对比默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优;但是批量模式无法返回自增主键