mybatis如何批量添加一对多中间表
作者:菜鸡rick 发布时间:2021-08-26 03:16:41
批量添加一对多中间表
建立中间表A,一个id对应多个lid;
传入两条参数
long id;//单个数值
List lid;//集合数值
dao层语句
int insertb(@Param("id")long id,@Param("lid")List lid);
mybatis中的写法
insert into A(id,lid) values
<foreach collection="lid" item="data" separator=",">
(#{id},#{data})
</foreach>
多对多条件下插入中间表(使用insert标签的属性)
说下需求
我的数据库中有两张表,一张是Blog表,一张是Type表,分别代表了博客和博客类别,它们之间是多对多关系,它们由一张中间表blog_type维护。
(简单起见,blog表只有两个数据,id和title。type表只有id和name)
那么需求就是:
现在我想插入一条Blog数据,因为blog和type是多对多关系,想插入其中一个数据,就得维护他们之间那个中间表blog_type的关系(插入中间表字段)。
解决方案
那么我能想到的解决方案是:
写两段insert标签,第一段sql语句插入blog表,第二段sql语句插入insert表:
<insert id="insertBlogWithoutType" parameterType="blog">
insert into t_blog (title)
values (#{title});
</insert>
<insert id="insertBlog_Type">
insert into blog_type (bid, tid) values(#{blog.id},#{type.id})
</insert>
但是这么做会有它的问题
由于blog表id为自增,所以我并没有插入id。如何在第二个insert查询语句中获取刚刚插入的id呢?
经过多方查找我发现了解决方案:
要用到MyBatis中insert标签的三个属性:
useGeneratedKeys
(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。keyProperty
(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。keyColumn
(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
重新生成的代码如下所示:
<insert id="insertBlogWithoutType" parameterType="blog" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into t_blog (title)
values (#{title});
</insert>
<insert id="insertBlog_Type">
insert into blog_type (bid, tid) values(#{blog.id},#{type.id})
</insert>
注意!keyProperty是Java对象的属性名!不是数据库表中字段名!
测试
编写Dao层
//分成两个方法,但是他们两个将在Service层合二为一
int insertBlogWithoutType(Blog blog);
int insertBlog_Type(@Param("blog")Blog blog, @Param("type")Type type);
Dao层就是对应的前面mapper文件里的两个方法
Service层
public void insertBlog(Blog blog, List<Type> types) {
blogDao.insertBlogWithoutType(blog);
for (Type type : types) {
blogDao.insertBlog_Type(blog, type);
}
}
这里的意思是,先插入一个传进来的blog(第一个参数)。然后插入之后根据插进来的blog的主键(blog的id)和传入的type的主键(type的id),插入中间表。
Test类
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BlogService blogServiceImpl = (BlogService) context.getBean("BlogServiceImpl");
//设置blog
Blog blog = new Blog();
blog.setTitle("【MyBatis】多对多条件下插入中间表(使用insert标签的属性)");
//设置该blog对应的type
List<Type> types = new ArrayList<Type>();
types.add(new Type(1,"数据库"));
types.add(new Type(2,"Debug专题"));
blogServiceImpl.insertBlog(blog, types);
}
可以看到,设置blog的时候,并没有设置blog的id属性,但是调用insertBlog时,插入中间表却已经知道了blog的id属性。这就是MyBatis中insert标签的三个属性的作用了!
执行完上面的代码,数据库里既插入了一条新的blog,又维护了他们之间那个中间表blog_type的关系(插入了中间表),至此问题解决。
来源:https://blog.csdn.net/whwwycl/article/details/92803335


猜你喜欢
- 一、JAVA简要概述先说一下java之父,詹姆斯·高斯林这是一个爱喝咖啡而又强大的男人。再来看一下JAVA有多火在TIOBE排行榜上JAVA
- 本文旨在通过重写Comparator接口的compare()方法实现对List的升序、降序、倒序排序。首先明确一点:compare(Inte
- 目录介绍需求来源传统算法问题新算法特点性能数据效果“我”是什么适用范围能用多久★★集成建议★★常规集成大型分布式集成配置变更代码示例运行环境
- 1 使用阿里的FastJson1.1 项目的pom.xml依赖<dependency> <groupId>com.a
- 这篇文章主要介绍了SpringMVC Mybatis配置多个数据源并切换代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- Android 调用系统相机拍摄获取照片的两种方法实现实例在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的
- 需求:视频通话界面,两个surfaceView一个显示本端的视图,另一个显示对端的视图,由于显示比例的问题总会存在一个覆盖另一个的问题,为保
- 基本操作import org.apache.hadoop.conf.Configuration;import org.apache.hado
- 目录带装饰效果的 ContainerRow 行布局和 Column列布局ListView列表组件GridView网格组件代码实现结语:左侧是
- 相关知识:Java中三种简单注解介绍和代码实例一、作用用 @Deprecated注解的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危
- 目前常用的ORM框架有 Mybatis(batis)、MybatisPlus,Hibernate、Jpa等几个框架,今天就简单介绍一下搭建M
- 起源 [1946: John von Neumann, Stan Ulam, and Nick Metropolis, all a
- 本文实例讲述了C#生成二维码的方法。分享给大家供大家参考。具体实现方法如下:首先引用ThoughtWorks.QRCode.dll具体代码如
- 我们肯定遇到过打开别人的项目时一直处于Building‘XXX'Gradle project info的情况。本文通过两种方法带领大
- 问题我们发现,之所以我们现在离不开 xml 配置文件,是因为我们有一句很关键的配置:<!-- 告知spring框架在,读取配置文件,创
- 数学工具类Math,供大家参考,具体内容如下1. 概述java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学
- 在maven中有几种方法打包项目,在之前的一篇博客中【Java】打包Jar包并用脚本执行,已经介绍了怎么在没有maven插件的情况下,怎么打
- 1.什么是PDF/UA文件PDF/UA,即Universally Accessible PDF,该格式的PDF文件是于2012年8月以ISO
- 个人认为单例模式是设计模式中最简单也是最常用的一种,是对有限资源合理利用的一种方式。这个模式看似简单,但是其中蕴含了关于并发、类加载、序列化
- 二叉树的深度题目:输入一颗二叉树的根节点,求该树的的深度。输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点