MyBatis插入关联

时间:2017-06-18 07:10:32

标签: java mysql mybatis

我是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

1 个答案:

答案 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对象构建。因此,如果您选择大量帖子,性能可能会更差。