MyBatis 多对多 中间表插入数据

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

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

方法:在MyBatis中要用到insert和update元素下的3个属性:
useGeneratedKeys (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL 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);
    }
MyBatis 中实现多对多关系的插入数据,通常需要通过中间来完成。具体步骤如下: 1. 确保在数据库中已经创建了两个实体以及它们之间关联的中间中间通常包含两个外键,分别指向两个实体的主键。 2. 在 MyBatis 的映射文件中定义相应的操作。首先,为每个实体定义一个映射文件,并在这些文件中配置相应的SQL语句。 3. 创建一个插入语句,用于向中间插入数据。这个插入语句可能会涉及到获取实体的ID,然后使用这些ID作为外键插入中间中。 4. 使用MyBatis提供的动态SQL功能,或者编写多个独立的插入操作,来处理不同实体之间的关联关系插入。如果使用动态SQL,可以使用`<foreach>`标签来遍历实体关联列,并生成对应的插入SQL。 5. 在Java代码中,首先分别插入两个实体数据,获取它们的主键值。然后,根据获取到的主键值,将关联的数据插入中间中。 下面是一个简化的例子,用于说明上述步骤: ```xml <!-- 映射文件 --> <mapper namespace="com.example.mapper.UserMapper"> <!-- 插入用户数据 --> <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO users(name, email) VALUES(#{name}, #{email}) </insert> <!-- 插入用户与角色的关联数据 --> <insert id="insertUserRole" parameterType="com.example.entity.User"> INSERT INTO user_roles(user_id, role_id) VALUES <foreach item="roleId" collection="roleIds" separator=","> (#{userId}, #{roleId}) </foreach> </insert> </mapper> ``` 在这个例子中,`UserMapper` 中定义了两个插入操作:`insertUser` 用于插入用户数据,而 `insertUserRole` 则用于插入用户和角色之间的关联数据。`user_roles` 是中间,它将用户ID和角色ID关联起来。 在实际应用中,还需要在Java代码中正确处理主键值的获取和传递,以及进行适当的事务管理,确保数据的一致性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值