Implements Article Query Mapper

This commit is contained in:
Rebwon
2021-10-02 17:23:57 +09:00
committed by MaengSol
parent 7b4f275643
commit 1023c8cded
14 changed files with 161 additions and 1 deletions

View File

@@ -4,10 +4,12 @@ import com.yam.app.common.EntityStatus;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Getter
@ToString(exclude = "password")
@NoArgsConstructor
public final class Account {
private Long id;

View File

@@ -6,11 +6,15 @@ import com.yam.app.common.EntityStatus;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Getter
@ToString
@NoArgsConstructor
@EqualsAndHashCode(of = "id")
public final class Article {
private Long id;

View File

@@ -1,7 +1,10 @@
package com.yam.app.article.domain;
import java.util.Optional;
public interface ArticleReader {
Article findByTitle(String title);
Optional<Article> findById(Long articleId);
}

View File

@@ -1,10 +1,12 @@
package com.yam.app.article.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Getter
@ToString
@NoArgsConstructor
public final class ArticleTag {
private Long id;

View File

@@ -1,10 +1,12 @@
package com.yam.app.article.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Getter
@ToString
@NoArgsConstructor
public final class Tag {
private Long id;

View File

@@ -3,6 +3,7 @@ package com.yam.app.article.infrastructure;
import com.yam.app.article.domain.Article;
import com.yam.app.article.domain.ArticleReader;
import com.yam.app.article.domain.ArticleRepository;
import java.util.Optional;
import org.mybatis.spring.SqlSessionTemplate;
public final class MybatisArticleRepository implements ArticleReader, ArticleRepository {
@@ -28,4 +29,9 @@ public final class MybatisArticleRepository implements ArticleReader, ArticleRep
public Article findByTitle(String title) {
return template.getMapper(ArticleReader.class).findByTitle(title);
}
@Override
public Optional<Article> findById(Long articleId) {
return template.getMapper(ArticleReader.class).findById(articleId);
}
}

View File

@@ -6,8 +6,10 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;
@MappedTypes(EntityStatusTypeHandler.class)
public final class EntityStatusTypeHandler implements TypeHandler<EntityStatus> {
@Override

View File

@@ -2,10 +2,12 @@ package com.yam.app.member.domain;
import com.yam.app.common.EntityStatus;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Getter
@ToString
@NoArgsConstructor
public final class Member {
private Long id;

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yam.app.article.domain.ArticleRepository">
<insert id="save" parameterType="com.yam.app.article.domain.Article">
INSERT INTO ARTICLE(title, content, image, status, created_at, modified_at, member_id)
VALUES (#{title}, #{content}, #{image}, #{status}, #{createdAt}, #{modifiedAt}, #{authorId})
</insert>
</mapper>

View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yam.app.article.domain.ArticleReader">
<select id="findByTitle" parameterType="String" resultMap="onlyArticle">
SELECT a.id AS article_id,
a.title AS article_title,
a.content AS article_content,
a.image AS article_image,
a.status AS article_status,
a.member_id AS article_author_id,
a.created_at AS article_created_at,
a.modified_at AS article_modified_at
FROM article a WHERE a.title = #{title};
</select>
<select id="findById" parameterType="Long" resultMap="articleAndTag">
SELECT a.id AS article_id, a.title AS article_title, a.content AS article_content,
a.image AS article_image, a.status AS article_status, a.member_id AS article_author_id,
a.created_at AS article_created_at, a.modified_at AS article_modified_at,
atg.id AS article_tag_id, atg.article_id AS article_tag_article_id,
t.id AS tag_id, t.name AS tag_name
FROM article a
LEFT OUTER JOIN article_tag atg ON atg.article_id = a.id
LEFT OUTER JOIN tag t ON t.id = atg.tag_id
WHERE a.id = #{articleId};
</select>
<resultMap id="onlyArticle" type="com.yam.app.article.domain.Article">
<id property="id" column = "article_id"/>
<result property="title" column="article_title"/>
<result property="content" column="article_content"/>
<result property="image" column="article_image"/>
<result property="status" column="article_status"/>
<result property="authorId" column = "article_author_id"/>
<result property="createdAt" column="article_created_at"/>
<result property="modifiedAt" column="article_modified_at"/>
</resultMap>
<resultMap id="articleAndTag" type="com.yam.app.article.domain.Article">
<id property="id" column = "article_id"/>
<result property="title" column="article_title"/>
<result property="content" column="article_content"/>
<result property="image" column="article_image"/>
<result property="status" column="article_status"/>
<result property="authorId" column = "article_author_id"/>
<result property="createdAt" column="article_created_at"/>
<result property="modifiedAt" column="article_modified_at"/>
<collection property="tags" resultMap="articleTagEntity"/>
</resultMap>
<resultMap id="articleTagEntity" type="com.yam.app.article.domain.ArticleTag">
<id property="id" column="article_tag_id"/>
<result property="articleId" column="article_tag_article_id"/>
<association property="tag" javaType="com.yam.app.article.domain.Tag">
<id property="id" column="tag_id"/>
<result property="name" column="tag_name"/>
</association>
</resultMap>
</mapper>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yam.app.article.domain.ArticleTagRepository">
<insert id="save" parameterType="com.yam.app.article.domain.ArticleTag">
INSERT INTO ARTICLE_TAG(article_id, tag_id)
VALUES (#{articleId}, #{tag.id})
</insert>
</mapper>

View File

@@ -14,3 +14,16 @@ insert into account(email, email_check_token, email_check_token_generated_at, em
values ('rebwon@gmail.com', 'emailchecktoken1', now(), true, now(), now(),
'$2a$10$EqbMbYB0vcZnuA5CClqa9uiLDnjA6pCjxn208ZchzA2q3ofqnkhcq',
false, 'DEFAULT', 1, 'ALIVE');
insert into article(title, content, image, status, created_at, modified_at, member_id)
values ('sample-title', 'sample-content', 'sample.png', 'ALIVE', now(), now(), 1);
insert into tag(name)
values ('hibernate'),
('spring'),
('jpa');
insert into article_tag(article_id, tag_id)
values (1, 1),
(1, 2),
(1, 3);

View File

@@ -1,6 +1,7 @@
package com.yam.app.article.domain;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
@@ -17,6 +18,13 @@ public final class FakeArticleRepository implements ArticleRepository, ArticleRe
.get();
}
@Override
public Optional<Article> findById(Long articleId) {
return data.values().stream()
.filter(a -> a.getId().equals(articleId))
.findFirst();
}
@Override
public void save(Article entity) {
entity.setId(idGenerator.incrementAndGet());

View File

@@ -1,2 +1,34 @@
package com.yam.app.article.infrastructure;public final class MybatisArticleRepositoryTests {
package com.yam.app.article.infrastructure;
import static org.assertj.core.api.Assertions.assertThat;
import com.yam.app.article.domain.Article;
import com.yam.app.article.domain.ArticleReader;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
@SpringBootTest
@ActiveProfiles("test")
@Disabled
final class MybatisArticleRepositoryTests {
@Autowired
private ArticleReader articleReader;
@Test
void articleReader_find_by_title() {
Article article = articleReader.findByTitle("sample-title");
assertThat(article).isNotNull();
}
@Test
void articleReader_find_by_id() {
Article article = articleReader.findById(1L).get();
assertThat(article.getTags().size()).isEqualTo(3);
}
}