티스토리 뷰

해당 포스팅은 "Spring(스프링) & mybatis(마이바티스) & mysql 설정하기"

다음 단계로 진행되는 글입니다

 

 

 

우선 예제에 사용할 테이블을 아래와 같이 생성 후 데이터를 임으로 등록

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE IF NOT EXISTS `tb_test` (
  `seq` int(11NOT NULL AUTO_INCREMENT,
  `title` varchar(100DEFAULT NULL,
  `writer` varchar(30DEFAULT NULL,
  `wdate` datetime DEFAULT NULL,
  PRIMARY KEY (`seq`)
); 
 
INSERT INTO `tb_test` (`seq``title``writer``wdate`VALUES
    (1'게시물 첫번째''홍길동''2019-09-24 00:42:38'),
    (2'게시물 두번째''성춘향''2019-09-24 00:47:41'),
    (3'게시물 세번째''심청''2019-09-24 00:48:33');
 
cs

 


root-context.xml에 mapperLocations property를 추가해 줍니다

(쿼리를 담고 있는 xml 파일들의 경로라 보시면 됩니다) 

 

 

1

2

3

4

5

6

<bean id="sqlSessionFactory" name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

  <property name="configLocation"  value="classpath:/mybatis-config.xml" />

  <property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />

</bean>

 

cs

 


src/main/java에  아래와 같이 bean, dao, service packge 생성

 

 


com.project.my.bean > TestBean class를 생성합니다

 

 

TestBean.class에 아래와 같이 소스를 삽입합니다

(각 항목의 getter와 setter는 위에서 생성한 tb_test 테이블의 필드와 동일합니다)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.project.my.bean;
import java.sql.Timestamp;
 
public class TestBean {
    
    private int seq;
    private String title;
    private String writer;
    private Timestamp wdate;
    
    public int getSeq() {
        return seq;
    }
    public void setSeq(int seq) {
        this.seq = seq;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getWriter() {
        return writer;
    }
    public void setWriter(String writer) {
        this.writer = writer;
    }
    public Timestamp getWdate() {
        return wdate;
    }
    public void setWdate(Timestamp wdate) {
        this.wdate = wdate;
    }
    
}
 
cs

 

 


쿼리문을 담고 있는 Mapper(파일)에서 사용할 수 있도록 Bean 경로(type) 및 별칭(alias)을 지정합니다

 

mybatis-config.xml에 아래 <typeAliases> 영역 추가합니다

 

 

alias는 TestBeanAlias 로 임의로 지정하고

type은 com.project.my.bean 에서 생성한 TestBean 경로를 적어줍니다 

(alias명을 TestBean으로 지정하지 않은 이유는 예제이기 때문에 구분이 되도록 하기 위해서 입니다) 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
 
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
 
    <typeAliases>        
        <typeAlias alias="TestBeanAlias" type="com.project.my.bean.TestBean"/>
    </typeAliases>
 
</configuration>
cs

 


SQL 쿼리 문을 담고 있을 Mapper(xml) 파일을 아래와 같이 src/main/resources 경로에 생성합니다

 

1. 파일명은 testMapper.xml로 지정합니다

   파일명은  "프리픽스+Mapper.xml" 형태로 mappers 경로에 위치해야 합니다 

   왜? root-context.xml에 아래와 같이 설정했기 때문입니다

   <property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />

   (파일명을 아무렇게나 지정하게 하시려면 "*Mapper.xml" 부분을 "*.xml"로 변경 하시면 되겠습니다)  

 

 

 

2. testMapper.xml에 다음과 같이 코딩합니다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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.project.my.testMapper">
 
    <select id="test" resultType="TestBeanAlias">
        select * from tb_test
    </select>
 
</mapper>
       
cs

 

3. 참고로

1) 코딩시 아래와 같이 형식을 유지하여 하며

 

 

2) mapper namespace명은 top level package명.파일명과 형식으로 지정하는 것이 좋습니다 

3) <select> ~ </select>는 DB의 값을 추출 결과를 가져올 때 사용 되며,

    insert(삽입) / update(갱신) / delete(삭제) 도 존재합니다

4) id는 Controller 또는 Dao에서 사용하기 위한 값이며,

   (하단부에 다시 한번 설명)  

5) resultType의 값(TestBeanAlias)은 결과값을 담을 Bean을 의미합니다

  TestBeanAlias은  mybatis-config.xml에서 지정한 alias="TestBeanAlias"을 의미합니다 

 

 


Database DAO class 생성

 

 

1) com.project.my.dao에 TestDao Interface를 생성합니다

 

 

생성된 TestDao에

java.util.List와 Bean(com.project.my.bean.TestBean)을 import 한 후 

public List.. 와 같이 코딩합니다

 

 

2) TestDaoImpl명으로 class를 생성합니다

   아래와 같이 TestDao를 필히 Interface 해야 합니다

   (참고 : Impl은 implements(상속)의 약자) 

 

 

TestDaoImpl을 다음과 같이 코딩합니다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.project.my.dao;
 
import java.util.List;
 
import com.project.my.bean.TestBean;
 
import org.springframework.stereotype.Repository; 
import org.apache.ibatis.session.SqlSession;
 
import javax.inject.Inject;
 
//@Autowired or @Repository 자동 주입
@Repository
public class TestDaoImpl implements TestDao {
    private static final String namespace="com.project.my.testMapper"
 
    @Inject
    private SqlSession sqlSession;
    
    
    @Override
    public List<TestBean> selectTest() throws Exception {
        
        // TODO Auto-generated method stub
        return sqlSession.selectList(namespace+".test");
    }
 
}
cs

 

3) 소스 설명 

 

@Repository : 해당 class가 Dao라는 것을 스프링에 인식(주입) 시킴 

 

namespace= "com.project.my.testMapper" 영역과

namespace+".test" 는 결국 testMapper.xml 파일의 id="test"를 호출하기 위함이라고 보면 됨  

 

testMapper.xml 파일 소스

 

selectList 는 리스트(row가 1개 이상) 데이터를 select 하기위한 메소드로

참고로 메소드에는 insert, update, delete, select(selectList, selectOne)이 있음

 

 

 

SqlSession은 데이터베이스에 대해 SQL명령어를 실행하기 위해 필요한 모든 메소드를 가지고 있다

 

기타 : @Resource @Autowired @Inject 어노테이션 간략 설명

어노테이션 @Autowired @Inject @Resource
설      명 스프링 전용 자바에서 지원 자바에서 지원
연결방식 타입에 맞춰 연결 타입에 연결  이름으로 연결

 


TestService interface와 TestServiceImpl class 생성

 

1) TestService 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.project.my.service;
 
import java.util.List;
 
import com.project.my.bean.TestBean;
 
 
public interface TestService {
    
     public List<TestBean> selectTest() throws Exception;
 
 
}
 
cs

 

 

 

2) TestServiceImpl 

   (dao 생성시와 동일하게 위 TestSerive interface 합니다)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.project.my.service;
 
import java.util.List;
 
import com.project.my.bean.TestBean;
import com.project.my.dao.TestDao;
 
 
import javax.inject.Inject;
import org.springframework.stereotype.Service;
 
 
@Service
public class TestServiceImpl implements TestService {
 
     @Inject
     private TestDao dao;    
    
    @Override
    public List<TestBean> selectTest() throws Exception {
        // TODO Auto-generated method stub
        return dao.selectTest();
    }
 
}
 
cs

 

 


HomeController 의 수정

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.project.my;
 
import java.util.Locale;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
import java.util.List;
import javax.inject.Inject;
 
import com.project.my.bean.TestBean;
import com.project.my.service.TestService;
 
 
@Controller
public class HomeController {
    
    
    @Inject
     private TestService service;
 
    
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) throws Exception {
        
        List<TestBean> list = service.selectTest();
        
        model.addAttribute("list", list);
 
        return "index";
    }
    
}
cs

 

 


root-context.xml 추가 

 

1
2
    <context:component-scan base-package="com.project.my.dao"></context:component-scan>
    <context:component-scan base-package="com.project.my.service"></context:component-scan>
cs

 

 


index.jsp 추가

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index Page</title>
</head>
<body>
 
    <table>
        <thead>
            <tr>
                <th>제목</th>
                <th>작성자</th>
                <th>작성일</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach items="${list}" var="list">
                <tr>
                    <td>${list.title}</td>
                    <td>${list.writer}</td>
                    <td>${list.wdate}</td>
               
                </tr>
            </c:forEach>
        </tbody>
    </table>
 
 
</body>
</html>:component-scan>
cs

 

 

Run on Server 실행시

 

 

 

 

아래와 같은 결과가 나오면 끝.

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday