gpt4 book ai didi

java - MyBatis 插入关联

转载 作者:可可西里 更新时间:2023-11-01 07:34:10 25 4
gpt4 key购买 nike

我是 MyBatis 的新手,正在尝试将记录插入到与另一个表有关系的表中。我关注了this tutorial .但是,我的方法并不完全是该教程所解释的。

有两个表叫做'blog', 'post'。
创建表博客(
blog_id int(10) unsigned NOT NULL auto_increment,
blog_name varchar(45) 不为空,
主键 (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' 表有博客 ID 的外键。'blog' 表有它自己的值,当记录到 'post' 表时已插入,目前博客 id 直接保存。我认为 Post pojo 应该有Blog 变量而不是 blogId。目前我正在使用 blogId 进行保存。但是,在这种情况下,“博客”表的新记录不是inserted,post表中只保存了blog表的一个PK。 (博客表记录就像常数)。
    我需要了解以下内容:
    Q1.
    如何在 Post pojo 中插入具有 Blog 变量的“post”表。(我认为这是比定义 blogId 最好的方法)。这需要协会吗?请提供任何示例代码。第 2 季度。
    在我的应用程序中,我只有博客名称,没有特定博客的主键。有没有办法让 Mybatis 的工作找到给定名称的所属 Blog 记录并将 blogId 保存在 'post' 表中?
    例如:

    博客博客 = new Blog();
    b.setName("博客名称");
    post.setBlog(博客);
    postDao.savePost(post);

    或者我是否必须编写一个内部查找查询来获取博客 ID 并在映射器 xml 中进行设置?请让我知道解决方法。代码示例受到高度赞赏。

我使用 mysql 5.7。 Java 8

最佳答案

存储 blogId在 Post 对象中是做事的标准方式。 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>

注意 <association>在 ResultMap 中使用 blog.blogName在带有内部 SELECT 的插入中。

您还应该知道,此选择将​​导致每个帖子都将使用单独的 Blog 对象构建。因此,如果您选择大量帖子,性能可能会更差。

关于java - MyBatis 插入关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44612574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com