最近有一个小项目需求,需要用spring mvc + mybatis实现一个复杂的配置系统。其中遇到了很多不太常见的问题,在这里特意记录下:

主要涉及的内容有

  • 事务
  • 多表删除
  • 插入并返回主键

1 spring mvc + mybatis的事务

背景

大概就是有ABC三张表,A表跟B表是一对多关系,B表跟C表是一对多关系。在创建的时候提交了一个大的json,需要先暴力删除A中某行关联的所有B和所有C,然后分别创建B,再创建C。这些操作要在一个事务中进行,不能删完,插入失败。

结构长得如下:

{
"id":"A1",
"b_arr":[{
"content":"b_123"
"c_arr":[{
"content":"c_123"
},{
"content":"c_456"
}
]
},{
"content":"b_456"
"c_arr":[{
"content":"c_789"
},{
"content":"c_101"
}
]
}
]
}

解决的办法就是直接用spring+mybatis的事务管理,配置如下:

applicationContext.xml

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

然后再对应的代码上直接加上注解就行了:

@Transactional
public void test(){
// todo 操作1
// todo 操作2
// todo 操作3
}

只有三个操作都顺利完成,才一次性commit

2 一次性删除多张表的数据

背景

同上,想要在更新其中某个内容的时候,直接删除所有相关的B表数据和C表数据,为了节省时间,就放在一个sql中操作了。

delete b,c from a
left join b on a.id = b.a_id
left join c on b.id = c.b_id
where a.id = #{id}

这样就可以根据A的一个id,同时删除B表和C表的数据了。

3 插入后直接返回主键

背景

还是上面的问题,大json中包含所有的内容,可以看到如果B表和C表的Id都是自增的。但是C表中有一个B表的外键,如果想要自动插入C表,就必须先获的B表对应的主键。

总结来说,就是需要插入一条数据后,获得其自增长的主键id。

方法采用了mybatis的useGeneratedKeys,即在mybatis的mapper配置文件中:

<insert id="saveB" parameterType="map" useGeneratedKeys="true" keyProperty="b.id">
insert into process( content) values (#{b.content})
</insert>

对应的interface是:

public void saveB(@Param(value="b") B b);

然后再service层就可以这么用了:

@Transactional
public void test(){
...
for(B b:A.b_arr){
testMapper.saveB(b);
// 注意id是直接保存在b对象中了,而不是返回值!!!
// 注意id是直接保存在b对象中了,而不是返回值!!!
// 注意id是直接保存在b对象中了,而不是返回值!!!
Integer b_id = b.getId();
....
for(C c:b.c_arr){
c.setBId(b_id);
testMapper.saveC(c);
}
}
}

程序猿的日常——Mybatis现学现卖的更多相关文章

  1. 程序猿的日常——SpringMVC系统架构与流程回顾

    web开发经历了很漫长的时间,在国内也快有十几年的时间了.从最开始的进程级到现在的MVC经历了很多的改进和优化,本篇就主要复习了解下Spring MVC相关的知识. 发展历程 第一阶段 CGI进程响应 ...

  2. 程序猿的日常——Java中的集合列表

    列表对于日常开发来说实在是太常见了,以至于很多开发者习惯性的用到数组,就来一个ArrayList,根本不做过多的思考.其实列表里面还是有很多玩法的,有时候玩不好,搞出来bug还得定位半天.所以这里就再 ...

  3. 程序猿的日常——Java基础之equals与hashCode

    equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注.不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码. equals equal ...

  4. 现学现卖】IntelliJ+EmmyLua 开发调试Unity中Xlua

    http://blog.csdn.net/u010019717/article/details/77510066?ref=myread http://blog.csdn.NET/u010019717 ...

  5. 『现学现忘』Git基础 — 4、Git下载与安装

    目录 1.Git下载 2.Git在Windows下的详细安装 3.验证Git是否安装成功 1.Git下载 进入官方地址下载Git客户端:https://git-scm.com/download/win ...

  6. 『现学现忘』Git对象 — 16、Tree对象详解

    目录 1.Tree对象介绍 2.Tree对象说明 (1)初始化一个新的本地版本库 (2)创建一个树对象(重点) (3)创建第二个文件(重点) (4)将第一个树对象加入暂存区,使其成为新的树对 3.总结 ...

  7. 『现学现忘』Git基础 — 22、Git中文件重命名

    目录 1.用学过的命令进行文件重命名 2.使用git mv命令进行文件重命名 我们这篇文章来说说在Git中如何进行文件重命名. 提示一下,下面所说明的是对已经被Git管理的文件进行重命名,未被Git追 ...

  8. angularjs现学现记之—$apply()和$digest()

    angularjs的双向数据绑定是个重要的特性,它让我们的代码简洁了许多,然而它又是如何知道数据发生了变化并改变页面的呢.最近看了一篇介绍觉得十分有用 首先,在angularjs中是有$watch事件 ...

  9. 现学现卖——Keil uVision 使用教程

    Keil uVision 使用教程 1.如果有旧的工程在,先关闭旧工程.Project -> Close Project2.新建工程.Project -> New uVision Proj ...

随机推荐

  1. Linux运维之Ansible自动化运维管理工具

    Ansible简介:Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务.后面会提到批量安装 ...

  2. TensorFlow实现的激活函数可视化

    书上的代码: # coding: utf-8 # In[1]: import matplotlib.pyplot as plt import numpy as np import tensorflow ...

  3. centos 7 安装svn客户端

    rpm -qa subversion yum remove -y subversion yum install -y subversion svnserve --version svn checkou ...

  4. 2019.01.19 bzoj4592: [Shoi2015]脑洞治疗仪(ODT)

    传送门 ODT水题. 支持区间01赋值,区间填补(把区间[l,r][l,r][l,r]从左往右数kkk个1都变成0),区间查询最长连续1个数. 思路: 区间填补操作感觉不是很好弄,写线段树的神仙可以套 ...

  5. 2018.11.07 NOIP模拟 数独(模拟)

    传送门 sbsbsb签到题. 读题时间比写题时间长系列. 写一个checkcheckcheck函数来检验当前时间段第(i,j)(i,j)(i,j)号格子能否放入kkk就行了. 代码

  6. jrebel热部署

    一,JRebel 插件 获取与安装 1,JRebel 官网下载地址https://zeroturnaround.com/software/jrebel/download/#!/free-trial P ...

  7. App测试基本流程详解(汇总整理)

    前言 看过许多大神对APP测试的理解,博主总结了一下我们平时测试APP应该注意的一些测试点并结合大神的理解,总结出这篇文章. 一.测试周期 测试周期一般为两周,根据项目情况以及版本质量可适当缩短或延长 ...

  8. UVa 10870 Recurrences (矩阵快速幂)

    题意:给定 d , n , m (1<=d<=15,1<=n<=2^31-1,1<=m<=46340).a1 , a2 ..... ad.f(1), f(2) .. ...

  9. iframe父子元素获取

    jquery.js调用iframe父窗口与子窗口元素的方法 1. jquery在iframe子页面获取父页面元素代码如下: $("#objid",parent.document) ...

  10. RestTemplate将响应数据转换为具有泛型的类对象

    前言: 重要,RestTemplate在SpringBoot项目里即便通过HttpMessageConverters添加了Fastjson且优先级比jackson要高也不会在RestTemplate里 ...