1、mybatis批量更新使用foreach
代码如下:
@Update("<script>" +
"<foreach collection='list' separator=';' item='user' >" +
"UPDATE users SET " +
"ROBOT_COUNT=#{user.robotCount}," +
"UPDATA_TIME=#{user.updataTime} " +
" WHERE ROBOT_KEY=#{user.robotKey}" +
"</foreach>" +
"</script>")
Integer updateRobotList(@Param("list") List<User> list);
说明:使用注解方式使用xml标签需要加<script></script>标签,foreach作用是一次dao操作执行多条sql;类似于这样:
update users set name=''小黑'' where id=1;update users set name=''小张'' where id=2; 一次执行两条或者多条sql;
避免多次调用DAO重复执行更新单条数据,这样每次打开链接关闭连接开销很大.
另外需注意mysql连接数据库url需要加上参数 &allowMultiQueries=true 才能执行一次多个sql.
2、mysql执行有数据则更新无数据则insert
建议使用本操作,省却很多不必要的判断和实务处理.网上还有其他的处理方式replace关键字.
1》必须添加 在数据库中为唯一字段添加上唯一索引,如果两个或多个字段确定唯一性就加上联合唯一索引;
图示:
2》使用sql关键字 ON DUPLICATE KEY UPDATE
完整sql如下:
INSERT INTO USERS (NAME,AGE) VALUE('校长',26) ON DUPLICATE KEY UPDATE AGE=30;
本实例中,需要对name添加唯一索引;使得如果有校长这条数据就age=30更新,没有就插入 name=校长,age=26;
3》与foreach结合使用,代码实例如下:
@Update("<script>" +
"<foreach collection='list' separator=';' item='scenario' >" +
"INSERT INTO T_AR_GAME_SCENARIO" +
"(SCENARIO_NAME,SCENARIO_VALUE,CREATE_TIME) " +
"VALUE(#{scenario.scenarioName},#{scenario.scenarioValue},#{scenario.updateTime}) " +
"ON DUPLICATE KEY UPDATE " +
"SCENARIO_VALUE=#{scenario.scenarioValue},UPDATE_TIME=#{scenario.updateTime}" +
"</foreach>" +
"</script>")
Integer updateARGameListByForeach(@Param("list") List<TArGameScenario> list);