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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。