Mybatis를 이용하기 위해 메이븐에서 라이브러리를 받아야 합니다.
그전에는 우리는 생성할 Dao를 @Repository로 지정한 다음 컨테이너에서 스캔하도록 설정했었습니다.
@Repository
public class JdbcNoticeDao implements NoticeDao {
......
}
이안에는 DB에 맞는 드라이버를 생성하고 커넥션을 얻고 객체에다 데이터를 담아서 리턴하는 아주 긴 코드가 필요했다.
이러한 반복적인 작업을 편리하게 도와주는 Mybatis가 존재한다.
먼저 스프링 부트를 이용하므로 Maven에서 Mybatis라이브러리를 의존합니다.
mybatis-spring-boot-starter 추가합니다.
spring은 xml에 spring-boot는 application.properties에 커넥션에 관련된 설정을 해줍니다.
그런 다음 인터페이스인 NoticeDao에 @Mapper 애노테이션과 실행할 메서드에 필요한 SQL문을 작성합니다.
@Mapper
public interface NoticeDao {
@Select("SELECT * FROM Notice ORDER BY regdate DESC LIMIT 10")
List<NoticeView> getList() throws ClassNotFoundException, SQLException;
Notice get(int id);
int insert(Notice notice);
int update(Notice notice);
int delete(int id);
}
마이 바티스 스프링 연동 모듈은 다른 빈에 직접 주입할 수 있는 스레드에 안전한 매퍼를 생성할 수 있다.
@Mapper 애노테이션을 지정해주면 repository에 등록되며 mybatis가 @Mapper가 등록된 인터페이스에 접근
쿼리문을 실행해 결괏값을 가져옵니다.
사용자가 요청한 파라미터는 spring에서 어떻게 받아야 할까?
@GetMapping("list")
public String list(HttpServletRequest request) {
String p = request.getParameter("p");
System.out.println(p);
List<NoticeView> list = null;
try {
// String value = ctx.getBean("hi",String.class);
list = noticeDao.getList();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/notice/list";
}
이러한 방식으로 get방식의 p에 대한 값을 얻어올 수 있습니다.
또한 또 다른 방식도 있습니다. 직접적으로 파라미터 값을 입력할 수 있습니다.
@GetMapping("list")
public String list(String p) {
System.out.println(p);
List<NoticeView> list = null;
try {
// String value = ctx.getBean("hi",String.class);
list = noticeDao.getList();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/notice/list";
}
신기합니다.
만약 p라고 전달된 파라미터값을 내가 사용할 땐 page라는 변수명으로 변경해서 사용하고 싶을 때 이렇게 코드를 작성합니다.
@GetMapping("list")
public String list(@RequestParam("p") String page) {
System.out.println(page);
List<NoticeView> list = null;
try {
// String value = ctx.getBean("hi",String.class);
list = noticeDao.getList();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/notice/list";
}
*주의 사항 page를 문자열로 받아 정수형으로 변경하는 작업 대신 page 타입을 int로 변경해보자.
만약 int로 타입을 정해주게 되면 빈문자나, null이 오는 경우 에러가 발생할 수 있다.
수정 코드
@GetMapping("list")
public String list(@RequestParam(name = "p" ,defaultValue ="1") Integer page) {
System.out.println(page);
List<NoticeView> list = null;
try {
// String value = ctx.getBean("hi",String.class);
list = noticeDao.getList();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/notice/list";
}
p라는 파라미터를 기본값을 1로 설정하고 그렇지 않은 경우 요청된 값을 page변수에 저장한다.
이름이 같은 class가 IoC컨테이너에 담겼을 경우 어떻게 구분해야 하나?
설정 클래스로 지정한 경우 빈객체로 만들어질 때 클래스의 앞글자를 소문자로 변경해 등록하게 됩니다.
중첩될 경우 에러가 발생합니다.
따라서 컨트롤러에 개별 이름을 지정해 줄 수 있습니다.
@Controller("adminNoticeController")
@RequestMapping("/admin/board/notice/")
public class NoticeController {
@RequestMapping("reg")//post 요청
public String list() {
return "/admin/board/notice/reg";
}
}
'웹 프로그래밍 기초 > 자바기반의 웹&앱 응용SW 개발자' 카테고리의 다른 글
자바기반의 웹&앱 응용 SW개발자 양성과정 69일차 -104 (0) | 2020.06.19 |
---|---|
자바기반의 웹&앱 응용 SW개발자 양성과정 68일차 -103 (0) | 2020.06.18 |
자바기반의 웹&앱 응용 SW개발자 양성과정 67일차 -101 (0) | 2020.06.17 |
자바기반의 웹&앱 응용 SW개발자 양성과정 67일차 -100 (0) | 2020.06.17 |
자바기반의 웹&앱 응용 SW개발자 양성과정 67일차 -99 (0) | 2020.06.17 |
댓글