返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis 实现多对多中间表插入数据
  • 704
分享到

MyBatis 实现多对多中间表插入数据

2024-04-02 19:04:59 704人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录多对多中间表插入数据方法具体实现多对多的关联表中,如何同时插入数据的学习心得插入步骤多对多中间表插入数据 在做这个员工管理系统demo的时候,由于user和role是多对多关系,

多对多中间表插入数据

在做这个员工管理系统demo的时候,由于user和role是多对多关系,且user主键是自增的,所有我们没办法提前知晓这个user_id,所以插入的时候,就需要先插入user,然后再找到刚插入的id拿出来,再插入中间表user_role,这样才能将表关系对应起来,才能算一个完整的插入的过程。

所以现在的问题就是怎么知道这个user_id,再怎么拿出来,再插入中间表user_role。

方法

在MyBatis中要用到insert和update元素下的3个属性:

  • useGeneratedKeys (仅对 insert 和 update 有用)这会令 mybatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MysqlSQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
  • keyProperty (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selecTKEy 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
  • keyColumn (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 postgresql)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

具体实现

1.插入user表,可以看到我们并没有插入user_id这个属性,因为是自增的。

<insert id="insert" useGeneratedKeys="true" keyProperty="user_id" keyColumn="user_id">
        insert into user
        (user_name,user_gender,user_email,user_phone,user_address,user_birthday,department_id)
        values(#{user_name},#{user_gender},#{user_email},#{user_phone},#{user_address},#{user_birthday},#{department_id})
    </insert>

2.重点是中间表user_role ,可以看到,我们直接就使用user下面的user_id了,我们也没有做查询操作,所以我们并不知晓它的具体值。

<insert id="insertUserRole">
        insert into user_role values(#{user.user_id},#{role.role_id})
    </insert>

3.test类,为了方便大家更好的理解,我们可以做一次测试

通过下面代码可以看到:我们在插入user后,就能够把user_id打印出来,再插入到中间表中,并没做其他诸如查询的操作。

Date date = new Date();
        User user = new User("mike33", "male", "axxxx@163.com", "183xxxxxxxx", "chengdu", date, 1);
        Role role = new Role();
        role.setRole_id(4);
        //插入user
        service.insert(user);
        //打印user_id
        System.out.println("user_id----->>>>" + user.getUser_id());
        //插入中间表
        service.insertUserRole(user, role);

结果:可以看到我们直接插入后,就能取得user_id了,然后再插入中间表,这就解决了这个问题。

当然由于插入一个新的user,必须同时满足user和role的映射,所以这里使用spring transaction来保证这个插入过程的完整性。

使用注解方式实现。

@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
    public void insertUserRole(User user, Role role) {
        this.insert(user);
        mapper.insertUserRole(user, role);
    }

多对多的关联表中,如何同时插入数据的学习心得

今天在写学校的实训项目时,遇到如下问题,一个实体类与另一个实体类是多对多的关系,且有个实体类中所存储的是另一个实体类的集合,所以在进行插入操作是,要同时向两张表中插入数据,现在已经得到解决办法。

Student类:

    public class Student implements Serializable {
        private Integer id;
        private String name;
        private Integer age;
        private String bir;
        private String phone;
        private String qq;
        private String attr;
        private String starts;
        private String mark;
        private Integer cityId;
        private Integer clazzId;
        private Integer groupId;
        private String cityName;
        private String clazzName;
        private String groupName;
        private List<Tag> tagList;
    }

Tag表: 

public class Tag implements Serializable {
    private Integer id;
    private String name;
    private String type;
    private Date createtime;
}

有如下需求,在插入学生时,学生会有很多的标签(tag),在页面传回数据是,用了一个tagList集合来接收,现在要将学生的信息插入到学生表中,然后将学生的标签放在另一张关联表中。

插入步骤

步骤一:

先插入学生信息:

<insert id="save" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
    insert into t_student(name, age, bir, phone, qq, attr, starts, mark, cityid, clazzid, groupid) values(#{name}, #{age}, #{bir},#{phone},#{qq},#{attr},#{starts},#{mark},#{cityId},#{clazzId},#{groupId})
</insert>
// useGeneratedKeys 是否以jdbc的方式将插入后的自增主键又返回个实体类
// keyProperty 实体类中对应的主键属性名
// keyCloumn 数据库中对应的主键属性名

2.插入关联表数据

<insert id="saveStudentTag" parameterType="com.lbw.ems.entity.Student">
        insert into t_student_tag(studentid, tagid) values
        <foreach collection="tagList" item="tag" separator=",">
            (#{id}, #{tag.id})
        </foreach>
    </insert>
// 因为此时我们需要当前的学生的Id,所以我们的参数类型还是一个Student类,在插入是,我们需要的是Student类中tagList集合中所有的id
所以使用了foreach标签
// foreach标签 遍历array、list、map(我只用过list)
// collection 填你想要遍历的集合在实体类中对应的属性名
// item 将每次遍历出来的对象取一个名字,不然不好取值,尤其是在两个实体类的字段名相同的时候,真的难顶
// sparator="," 每遍历一次后,在后面加上你所填的符

结果测试

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: MyBatis 实现多对多中间表插入数据

本文链接: https://lsjlt.com/news/140697.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MyBatis 实现多对多中间表插入数据
    目录多对多中间表插入数据方法具体实现多对多的关联表中,如何同时插入数据的学习心得插入步骤多对多中间表插入数据 在做这个员工管理系统demo的时候,由于user和role是多对多关系,...
    99+
    2024-04-02
  • MyBatis实现批量插入数据,多重forEach循环
    目录批量插入数据,多重forEach循环下面是一个实际应用mybatis insert foreach项目场景批量插入数据,多重forEach循环 在业务开发过程中,遇到批量插入时,...
    99+
    2024-04-02
  • MyBatis如何实现多表查询(多对一、一对多)
    MyBatis实现多表查询  一、多对一查询 数据库的准备 创建两张表,一张老师表,一张学生表 将老师主键id关联学生外键tid 创建sql的语句 create ta...
    99+
    2024-04-02
  • mybatis通过中间表实现一对多查询功能
    需求: 通过一个学生的id查询出该学生所学的所有科目。 使用到的表格: 1.student:学生表 2.subject:科目表 3.stu_sub:学生-科目表(这里的成绩字段没...
    99+
    2024-04-02
  • MyBatis怎么实现批量插入数据,多重forEach循环
    今天小编给大家分享一下MyBatis怎么实现批量插入数据,多重forEach循环的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-29
  • 如何实现数据库修改多对多的中间表的记录
    本篇内容主要讲解“如何实现数据库修改多对多的中间表的记录”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现数据库修改多对多的中间表的记录”吧! ...
    99+
    2024-04-02
  • Mysql数据库sql语句实现多表关联插入
    前言 最近在工作中遇到了sql批量插入数据且两张表有关联id的问题。A、B两张表,B表存储了A表的id。A表虽然是自增id,但在生产环境业务处理中难免会出现并发问题。那么sql批量插入数据时B表如何存...
    99+
    2023-09-24
    数据库 mysql sql
  • springboot+mybatis实现多数据源
    1. 前言 最近做项目碰到了一个需要连4个不同数据库的需求,其中db1、db2表结构都不相同;另外两个数据库same_db_private、same_db_public表结构完全相同,一个对内一个对外...
    99+
    2023-09-11
    mybatis spring boot java
  • mybatis如何批量添加一对多中间表
    目录批量添加一对多中间表mybatis中的写法多对多条件下插入中间表(使用insert标签的属性)说下需求解决方案测试批量添加一对多中间表 建立中间表A,一个id对应多个lid; 传...
    99+
    2024-04-02
  • mybatis主表与明细表一对多的同时插入操作方法
    对主表(采购申请表)和明细表(申请物资表)同时进行插入操作insert: <!--对申请主表插入一条记录 --> <insert id="save" parame...
    99+
    2023-02-13
    mybatis主表与明细表一对多同时插入 mybatis一对多同时插入
  • 如何实现MySQL中插入多行数据的语句?
    如何实现MySQL中插入多行数据的语句?在MySQL中,有时我们需要一次性插入多行数据到表中,这时我们可以使用INSERT INTO语句来实现。下面将介绍如何使用INSERT INTO语句来插入多行数据,并给出具体的代码示例。假设我们有一个...
    99+
    2023-11-09
    MySQL 插入 多行
  • MyBatis中多对一和一对多数据的处理方法
    目录多对一的处理1、数据库设计2、搭建测试环境3、按查询嵌套处理4 、按结果嵌套处理一对多的处理1、实体类编写2、按结果嵌套处理3、按查询嵌套处理4、小结多对一的处理 多对一的理解:...
    99+
    2023-01-03
    MyBatis多对一 MyBatis一对多处理
  • SpringBoot中Mybatis注解一对多和多对多查询实现示例
    目录一、模拟的业务查询二、对应的实体类如下三、对应的建表语句和模拟数据如下四、@One一对一映射五、@Many一对多查询六、@One @Many的总结一、模拟的业务查询 系统中的用户...
    99+
    2024-04-02
  • MyBatis如何实现批量插入数据
    本文小编为大家详细介绍“MyBatis如何实现批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis如何实现批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、SQL实现示例假设我们...
    99+
    2023-07-04
  • 向MySQL中插入100万条数据需要多长时间
    本篇内容主要讲解“向MySQL中插入100万条数据需要多长时间”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“向MySQL中插入100万条数据需要多长时间”吧!目...
    99+
    2024-04-02
  • MyBatis-Plus实现多表联查
    MyBatis-Plus多表联查写法 前言一、引依赖二、使用方法三、(实战)多表查询参数说明 四、(实战)多表分页查询 前言 收获大佬封装的一个jar包,可以支持MyBatis-...
    99+
    2023-09-03
    mybatis java sql
  • MyBatis中怎么实现一对多查询和多对一查询
    这篇“MyBatis中怎么实现一对多查询和多对一查询”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBatis中怎么实现一...
    99+
    2023-06-29
  • Mybatis操作多数据源的实现
    目录1. 注入多数据源2. 动态数据源(1) 创建并注入动态数据源(2) Mybatis配置类(3) 使用注解简化数据源切换3. 结语现在有一个Mysql数据源和一个Postgres...
    99+
    2023-05-20
    Mybatis操作多数据源 Mybatis 多数据源
  • 通过Mybatis实现单表内一对多的数据展示示例代码
    表:  需求:  将表中的数据,按照一级二级分类返回给前端json数据代码实现:  java代码: public class ResultIndustry { private String industryFirst;//一级行业 pri...
    99+
    2023-05-31
    mybatis 一对多
  • springboot中mybatis多数据源动态切换实现
    目录多数据源配置引入 动态数据源路由实现 动态数据源切换使用 案例源码 在开发中,动态数据源配置还是用的比较多的,比如在多数据源使用方面,又或者是在多个DB之间切换方面。这里给出一个...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作