我是MyBatis的新手并尝试将记录插入与另一个表有关系的表中。我跟着this tutorial。但是,我的方法并不完全是教程解释的内容。
有两个名为'blog','post'的表
CREATE TABLE blog (
blog_id int(10) unsigned NOT NULL auto_increment,
blog_name varchar(45) NOT NULL,
PRIMARY KEY (blog_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE post (
post_id int(10) unsigned NOT NULL auto_increment,
title varchar(45) NOT NULL,
blog_id int(10) unsigned NOT NULL,
PRIMARY KEY (post_id),
KEY FK_post_blog (blog_id),
CONSTRAINT FK_post_blog FOREIGN KEY (blog_id) REFERENCES blog (blog_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
以下是pojo类的映射:
public class Blog {
private Integer blogId;
private String blogName;
private Date createdOn;
private List<Post> posts = new ArrayList<>();
//getters and setters
}
public class Post {
private Integer postId;
private String title;
private String content;
private Integer blogId; // <= How currently saving instead of 'private Blog blog;'
//getters and setters
}
以下是我的PostMapper.xml
<mapper namespace="PostMapper">
<resultMap id="result" type="Post">
<result property="postId" column="post_id"/>
<result property="title" column="title"/>
<result property="blogId " column="blog_id "/>
</resultMap>
<insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="postId">
INSERT INTO post (title, blog_id) VALUES (#{title}, #{blogId});
</insert>
</mapper>
解释要求:
一个博客有很多'帖子'。 'post'表有blog id的外键。
'blog'表有自己的值,当有'post'表的记录时
插入,目前博客ID直接保存。我认为Post pojo应该有
Blog变量而不是blogId。 Currentlty我用blogId保存。
但是,在这种情况下,“博客”表的新记录不是
插入后,只将博客表的PK保存到帖子表中。 (博客表
记录就像常数)
我需要知道以下内容:
的 Q1。
如何在Post pojo中插入具有Blog变量的'post'表。(我认为这是定义blogId的最佳方法)。这需要关联吗?请提供任何示例代码。
的 Q2。
在我的应用程序中,我只有Blog名称,而不是特定Blog的主键。有没有办法让Mybatis的工作找到给定名称的归属博客记录,并在'post'表中保存blogId?
例如:
博客博客=新博客();
b.setName(“博客名称”);
post.setBlog(博客);
postDao.savePost(POST);
或者我是否必须编写内部查找查询以获取博客ID并在mapper xml中设置?请让我知道解决方法。代码示例非常受欢迎。
我使用的是mysql 5.7。 Java 8
答案 0 :(得分:3)
在Post对象中存储blogId
是执行操作的标准方法。 MyBatis不支持嵌套插入。无论如何,您必须将数据库中的博客ID作为外键。这样做通常更容易:
Blog blog = blogDao.getByName(name)
blog.SetPosts(postDao.getByBlog(blog))
getByBlog方法使用现有的PostMapper ResultMap和类似SELECT * FROM post WHERE blog_id=#{blog_id}
的选择。
如果您确实希望Post拥有Blog对象字段,您可以执行以下操作
<resultMap id="PostWithBlog" type="Post">
<result property="postId" column="post_id"/>
<result property="title" column="title"/>
<association property="blog" column="blog_id" javaType="Blog">
<id property="id" column="blog_id"/>
<result property="name" column="blog_name/>
<result property="created_on" column="blog_created_on"/>
</association>
</resultMap>
<select id="selectPostWithBlog" parameterType="int" resultMap="PostWithBlog">
SELECT p.postId AS post_id, p.title AS title, p.blog_id AS blog_id, b.blogName AS blog_name, b.created_on AS blog_created_on
FROM post p JOIN blog B ON p.blog_id=b.blog_id
WHERE p.post_id = #{postId}
</select>
<insert id="insertWithBlog" parameterType="Post" useGeneratedKeys="true" keyProperty="postId">
INSERT INTO post (title, blog_id) VALUES (#{title}, SELECT blog_id FROM blog WHERE name=#{blog.name});
</insert>
注意ResultMap中的<association>
以及带有内部SELECT的插入中blog.blogName
的使用。
您还应该知道,此选择将导致每个Post都将使用单独的Blog对象构建。因此,如果您选择大量帖子,性能可能会更差。