mybatis同时insert多张表,如何使用mybatis实现一对多的多表查询

  mybatis同时insert多张表,如何使用mybatis实现一对多的多表查询

  00-1010批量添加一对多中间表编写mybatis在多对多条件下插入一个中间表(使用insert标签的属性)。让我们来谈谈需求解决方案测试。

  00-1010建立中间表A,一个id对应多个lid;

  传入两条参数

  长id;//单个数值列表lid//设定值dao层语句

  int insertb(@Param(id)long id,@ Param( lid )List lid);

  

目录

insert into A(id,lid)values for each collection= lid item= data separator=,(#{id},#{data}) /foreach

 

  

批量添加一对多中间表

 

  00-1010我的数据库里有两个表,一个是博客表,一个是类型表,分别代表博客和博客类别。它们之间是多对多的关系,由一个中间表blog_type维护。

  (为了简单起见,blog表只有两个数据,id和title。类型表只有id和名称)

  那么需求就是:

  现在我想插入一条博客数据,因为博客和类型是多对多的关系。如果我想插入其中一个数据,我必须维护它们之间的中间表blog_type的关系(插入中间表字段)。

  

mybatis中的写法

那么我能想到的解决方案是:

 

  编写两个insert标记,第一个sql语句插入到blog表中,第二个sql语句插入到insert表中:

  insert id= insertBlogWithoutType 参数type= blog insert into t _ blog(title)values(# { title });/insert insert id= insert blog _ type insert into blog _ type(bid,tid) values (# {blog.id},# {type.id})/insert但是这样做会有问题。

  由于blog表id为自增,所以我并没有插入id。如何在第二个insert查询语句中获取刚刚插入的id呢?

  经过多次搜索,我找到了解决办法:

  要用到MyBatis中insert标签的三个属性:

  GeneratedKeys(仅对insert和update有用)这将使MyBatis使用JDBC的getGeneratedKeys方法来检索从数据库生成的主键(例如,MySQL和SQL Server之类的关系数据库管理系统的自动增量字段)。默认值为false。属性(仅对插入和更新有用)唯一地标记一个属性。MyBatis将通过getGeneratedKeys的返回值或通过insert语句的selectKey子元素来设置其键值。默认值:未设置。如果您想要获得多个生成的列,它也可以是一个逗号分隔的属性名列表。KeyColumn(只对insert和update有用)通过生成的键值设置表中的列名。此设置仅在某些数据库(如PostgreSQL)中是必需的,并且需要在主键列不是表中的第一列时进行设置。如果您想要获得多个生成的列,它也可以是一个逗号分隔的属性名列表。重新生成的代码如下:

  insert id= insertBlogWithoutType 参数type= blog useGeneratedKeys= true key property= id key column= id insert into t _ blog(title)值(# { title });/insert insert id= insert blog _ type insert into blog _ type(bid,t id)值(# {blog.id},# {type.id})/insert注意!属性是Java对象的属性名!不是数据库表中的字段名!

  

多对多条件下插入中间表(使用insert标签的属性)

编写Dao层

 

  //分成两个方法,但是在服务层int insertblogwithoutype(blog blog)中两个会合二为一;int insert Blog _ Type(@ Param( Blog )Blog Blog,@ Param( Type )Type Type);Dao层是前面mapper文件中对应的两个方法。

  Service层

  public void insertBlog(Blog blog,ListType类型){ Blog Dao . insertblogwithouttype(Blog);for(Type Type : types){ blog Dao . insert blog _ Type(blog,Type);}}这里的意思是先插入一个传入的博客(第一个参数)。然后根据插入的博客的主键(博客id)和传入类型的主键(类型id)插入中间表。

  Test类

  @ Test public void Test 2(){ application context context=new classpathmlaplicationcontext( application context . XML );blog service blogServiceImpl=(blog service)context . get bean( blogServiceImpl );//Blog Blog Blog=new Blog();Blog.settitle ([mybatis]插入多对多条件下的中间表(使用insert标记的属性));//设置此博客对应的typelisttypetypes=newArrayListType();Types.add(new Type(1, database ));Types.add(新类型(2,调试主题));blogServiceImpl.insertBlog(博客,类型);}大家可以看到,在设置博客的时候,并没有设置博客的id属性,但是在调用insertblog的时候,博客的id属性在中间表中已经知道了。MyBatis中的insert标签的三个属性就是这么做的!

  执行上述代码后,在数据库中插入一个新的blog,并维护它们之间的中间表blog_type的关系(插入中间表),这样问题就解决了。

  以上个人经验,希望能给大家一个参考,也希望大家能支持盛行的IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: