티스토리 뷰
해당 포스팅은 "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(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
`writer` varchar(30) DEFAULT 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 실행시
아래와 같은 결과가 나오면 끝.
'프로그래밍 > jsp·java' 카테고리의 다른 글
eclipse 단축키 (0) | 2021.02.14 |
---|---|
eclipse 유용한 플러그인(plugin) 추천 (0) | 2021.02.14 |
Spring(스프링) & mybatis(마이바티스) 오류 정리 및 해결 방법 (0) | 2019.09.23 |
Spring(스프링) & mybatis(마이바티스) & mysql 설정하기 (0) | 2019.09.23 |
JAVA ·JSP 한글 깨지는 문제 해결 - 한글 인코딩 (0) | 2019.05.02 |