当前位置: 首页 > news >正文

网站开发网上接单雅安 网站建设

网站开发网上接单,雅安 网站建设,郑州市城市建设管理局网站,教育网站怎么做弹窗的问题描述 环境:mysql8.xmybatis3.5.13tk.mybatis4.2.3 在使用tk.mybatis做批量更新时,程序会报错,说是执行的SQL语法错误,经研究源代码发现tk.mybatis在实现批量更新时是通过多次执行update语句实现的。这本身就不符合MySQL批量…

问题描述

环境:mysql8.x+mybatis3.5.13+tk.mybatis4.2.3

在使用tk.mybatis做批量更新时,程序会报错,说是执行的SQL语法错误,经研究源代码发现tk.mybatis在实现批量更新时是通过多次执行update语句实现的。这本身就不符合MySQL批量更新的语法,可以通过自定义Mapper的方式解决。

有关MySQL批量更新SQL语句的语法请参考:MySQL专有的SQL语句

解决方案

批量更新

  • 接口
@RegisterMapper
public interface BatchUpdateByIdMapper<T> {/*** 批量更新* @param list* @return*/@UpdateProvider(type = BatchUpdateByIdProvider.class, method = "dynamicSQL")int batchUpdate(List<T> list);
}
  • provider
public class BatchUpdateByIdProvider extends MapperTemplate {public BatchUpdateByIdProvider(Class<?> mapperClass, MapperHelper mapperHelper) {super(mapperClass, mapperHelper);}public String batchUpdate(MappedStatement statement) {//1.获取实体类对应的Class对象Class<?> entityClass = super.getEntityClass(statement);//2.获取实体类在数据库中对应的表名String tableName = super.tableName(entityClass);//3.生成update子句String update = SqlHelper.updateTable(entityClass, tableName);//4.创建StringBuilder用于拼接SQL语句的各个组成部分StringBuilder sb = new StringBuilder(update);sb.append("<trim prefix=\"set\" suffixOverrides=\",\">");//5.获取所有字段信息Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);//获取主键EntityColumn pkEntityColumn = null;for (EntityColumn entityColumn : columns) {boolean isPrimaryKey = entityColumn.isId();if (isPrimaryKey) {pkEntityColumn = entityColumn;break;}}for (EntityColumn entityColumn : columns) {boolean isPrimaryKey = entityColumn.isId();//6.判断当前字段是否为主键if (!isPrimaryKey) {//7.使用非主键字段拼接SET子句String columnHolder = entityColumn.getColumnHolder("item");sb.append("<trim prefix=\"").append(entityColumn.getColumn()).append("= case\" suffix=\"end, \">");sb.append("<foreach collection=\"list\" index=\"index\" item=\"item\">");sb.append(" when ").append(pkEntityColumn.getColumn()).append(" = ").append(pkEntityColumn.getColumnHolder("item")).append(" then ").append(columnHolder);sb.append("</foreach>");sb.append("</trim>");}}sb.append("</trim>");//10.使用前面缓存的主键名、主键值拼接where子句sb.append("where ").append(pkEntityColumn.getColumn()).append(" in ");sb.append("<foreach close=\")\" collection=\"list\" item=\"item\" open=\"(\" separator=\", \">");sb.append(" #{item.").append(pkEntityColumn.getProperty()).append("}");sb.append("</foreach>");//11.将拼接好的字符串返回return sb.toString();}}

选择性批量更新

  • Mapper接口
@RegisterMapper
public interface BatchUpdateSelectiveByIdMapper<T> {/*** 选择性批量更新* @param list* @return*/@UpdateProvider(type = BatchUpdateSelectiveByIdProvider.class, method = "dynamicSQL")int batchUpdateSelective(List<T> list);
}
  • provider
public class BatchUpdateSelectiveByIdProvider extends MapperTemplate {public BatchUpdateSelectiveByIdProvider(Class<?> mapperClass, MapperHelper mapperHelper) {super(mapperClass, mapperHelper);}/*** 批量更新* @param statement* @return*/public String batchUpdateSelective(MappedStatement statement) {//1.获取实体类对应的Class对象Class<?> entityClass = super.getEntityClass(statement);//2.获取实体类在数据库中对应的表名String tableName = super.tableName(entityClass);//3.生成update子句String update = SqlHelper.updateTable(entityClass, tableName);//4.创建StringBuilder用于拼接SQL语句的各个组成部分StringBuilder sb = new StringBuilder(update);sb.append("<trim prefix=\"set\" suffixOverrides=\",\">");//5.获取所有字段信息Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);//获取主键EntityColumn pkEntityColumn = null;for (EntityColumn entityColumn : columns) {boolean isPrimaryKey = entityColumn.isId();if (isPrimaryKey) {pkEntityColumn = entityColumn;break;}}for (EntityColumn entityColumn : columns) {boolean isPrimaryKey = entityColumn.isId();//6.判断当前字段是否为主键if (!isPrimaryKey) {//7.使用非主键字段拼接SET子句String columnHolder = entityColumn.getColumnHolder("item");sb.append("<trim prefix=\"").append(entityColumn.getColumn()).append("= case\" suffix=\"end, \">");sb.append("<foreach collection=\"list\" index=\"index\" item=\"item\">");sb.append("<if test=\"item.").append(entityColumn.getProperty()).append(" != null\"> ");sb.append(" when ").append(pkEntityColumn.getColumn()).append(" = ").append(pkEntityColumn.getColumnHolder("item")).append(" then ").append(columnHolder);sb.append(" </if>");sb.append("</foreach>");sb.append("</trim>");}}sb.append("</trim>");//10.使用前面缓存的主键名、主键值拼接where子句sb.append("where ").append(pkEntityColumn.getColumn()).append(" in ");sb.append("<foreach close=\")\" collection=\"list\" item=\"item\" open=\"(\" separator=\", \">");sb.append(" #{item.").append(pkEntityColumn.getProperty()).append("}");sb.append("</foreach>");//11.将拼接好的字符串返回return sb.toString();}}

测试代码

@Test
void batchUpdate(){List<Subject> list = List.of(Subject.builder().id(13L).name("111").build(),Subject.builder().id(14L).name("222").build(),Subject.builder().id(15L).name("333").build(),Subject.builder().id(16L).name("444").build());subjectMapper.batchUpdateSelective(list);
}
http://www.yayakq.cn/news/586264/

相关文章:

  • wordpress 单页导航手机优化大师官网
  • 濮阳建网站的做网站项目计划书
  • 漳州网站建设喊博大科技淘宝客的网站是怎么做的
  • 选择热门网站做推广的原因设计网站怎么做
  • esc怎么做网站要建立网站和账号违法违规行为数据库和什么黑名单
  • .net电子商城网站开发设计上海开公司
  • 企业站群cms企业在什么网站推广
  • 西平网站建设网站建设后的优势
  • 网站开发无锡大连网站开发乛薇
  • 深圳网站建设html5网站建设后如何检测
  • 做网站搞什么流量海宁市建设局官方网站6
  • 大连鼎信网站建设公司地址北京网页设计
  • 网站设计基础海南seo
  • 江西那家做网站公司好淘宝联盟怎么样做网站
  • 网站建设合同标的怎么写军事新闻最新消息
  • 深圳外贸建站模版上海企业优化
  • 苏州网站建设书生青岛网站推广公司
  • 网站策划建站高端网站定制站
  • wordpress 酒seo词条
  • 泉州网站建设有哪些短链接生成方案
  • 城市中国商业网站平台具有营销价值好的网站
  • 恩平国有建设用地使用权拍卖网站wordpress增加启动页
  • 做毕业设计网站的步骤有什么网站做任务给钱的
  • 上海建筑建材业网站迁移网站被入侵
  • 中国做乱的小说网站seo最强
  • 别人做的网站怎么安全放在我的公司邢台建设局网站上中标公示查询
  • 网站建设平台硬件要求在线设计响应式网站
  • 招商网站的建设目的做博客网站
  • html格式网站家装公司网站建设
  • 服务器架设国外做违法网站wordpress分页设置问题