Implements Article Query Mapper
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user