java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 多对多中间表插入数据

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

作者:黄国攀

这篇文章主要介绍了MyBatis 实现多对多中间表插入数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

多对多中间表插入数据

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

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

方法

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

具体实现

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="," 每遍历一次后,在后面加上你所填的符

结果测试

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文