티스토리 뷰
<게시판 구현>
#게시판 테이블 생성 (MySQL)
create table trip (
tno int primary key auto_increment,
tripdate varchar(30) not null,
writer varchar(30) not null,
title varchar(200) not null,
content varchar(1000),
hit int default 0,
regdate timestamp default now() -- 시간타입 :기본값 지금시간
);
# 파일들 기본 구성
*mapper 파일을 포함한 모든 xml 파일은 한곳에 몰아서 외부에 넣을것.
-먼저 root-context.xml (데이터베이스 설정파일) 에 우리가 만들 xml 파일들을 읽어올 수 있도록
경로를 지정해주기.
* 맵퍼 인터페이스와 , 맵퍼 구현 xml 파일 생성
- 맵퍼 파일들 java, xml 은 꼭 동일한 이름으로 만들어주자.
- TripMapper.xml 파일 즉 맵퍼.xml 파일은 만들고 끝이 아니라
마이바티스에서 읽을 수 있도록 root-context.xml 에서 경로 설정을 해줘야 함.
<!-- 매퍼파일의 위치 -->
<property name="mapperLocations" value="classpath:/sqlmap/*.xml" />
*TripVO 생성
-lombok을 사용했기 때문에 어노테이션을 통해서 자동으로 생성자랑 겟터,셋터, toString을 만들도록 처리해줌.
package com.coding404.myweb.command;
import java.sql.Timestamp;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TripVO {
private int tno;
private String tripdate;
private String writer;
private String title;
private String content;
private int hit;
private Timestamp regdate;
}
*NoticeController
@Controller
@RequestMapping("/trip")
public class NoticeController {
@Autowired
@Qualifier("tripService")
private TripService tripService;
//게시글 조회(select)
@RequestMapping("/notice_list")
public String notice_list(Model model) {
/*
* service, mapper 영역에 getList 함수를 선언하고
* 등록번호 역순으로 데이터를 조회해서 가지고 나옵니다.
* model에 담아서
* 화면에서는 반복문으로 처리.
*/
ArrayList<TripVO> list = tripService.getList();
model.addAttribute("list",list);
return "trip/notice_list";
//글등록
@RequestMapping(value="/registForm", method = RequestMethod.POST)
public String registForm(TripVO vo, RedirectAttributes ra) {
int result = tripService.noticeRegist(vo);
String msg = result == 1 ? "문의사항이 정상 등록되었습니다" : "문의 등록에 실패했습니다";
ra.addFlashAttribute("msg", msg);
return "redirect:/trip/notice_list";
}
}
#서비스 계층
* TripService.java (인터페이스)
public interface TripService {
public int noticeRegist(TripVO vo);
public ArrayList<TripVO> getList();
}
*TripServiceImpl.java (인터페이스 구현)
@Service("tripService")
public class TripServiceImpl implements TripService{
@Autowired
private TripMapper tripMapper;
@Override
public int noticeRegist(TripVO vo) {
return tripMapper.noticeRegist(vo);
}
@Override
public ArrayList<TripVO> getList() {
return tripMapper.getList();
}
}
# Mapper 계층 (Mybatis)
*TripMapper.java (메서드 정의)
@Mapper
public interface TripMapper {
public int noticeRegist(TripVO vo);
public ArrayList<TripVO> getList();
}
*TripMapper.xml (mapper 구현)
<?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.coding404.myweb.trip.service.TripMapper">
<insert id="noticeRegist" parameterType="TripVO">
insert into trip(tripdate, writer, title, content)
values(#{tripdate},#{writer}, #{title}, #{content})
</insert>
<select id="getList" resultType="TripVO">
select * from trip order by tno desc;
</select>
</mapper>
위에서 parameterType 와 resultType 의 값으로 오는 TripVO 은 원래 풀경로를 써주어야 하지만.
마이바티스의 추가 속성인 configLocation 을 이용해서 풀경로를 alias (TripVO) 로 대체해서
TripVO 만 적어주었다.
root-context.xml (데이터베이스 설정파일)
<!-- 마이바티스설정 sqlSessionFactory 빈으로 생성 -->
<!-- classpath:/ 자바/리소스 경로를 가르킵니다 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 데이터베이스 정보 전달 -->
<property name="dataSource" ref="ds" />
<!-- 마이바티스 설정파일 경로 -->
<property name="configLocation" value="classpath:/mybatis-config/mybatis-config.xml" />
<!-- 매퍼파일의 위치 -->
<property name="mapperLocations" value="classpath:/sqlmap/*.xml" />
</bean>
<!-- 마이바티스 관련 어노테이션을 찾아서 설정으로 등록 (모든 인터페이스를 등록) -->
<mybatis-spring:scan base-package="com.coding404.myweb.*"/>
*confit 속성을 구현하는 xml 파일
java/resources 하위에 파일을 만들어 준다.
mybatis-config.xml
상단부에 DOCTYPE 부분 꼭 넣어줘야 함.
<?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 type="com.coding404.myweb.command.TripVO" alias="TripVO"/>
</typeAliases>
</configuration>
notice_list.jsp 페이지
select 한 데이터 출력 부분
<c:forEach var="content" items="${list }" >
<tr>
<th scope="col">번호: ${content.tno }</th>
<th scope="col">제목: ${content.title }</th>
<th scope="col">조회수: ${content.hit }</th>
<th scope="col">작성일: ${content.regdate }</th>
</tr>
</c:forEach>
결과
#JSTL 사용시 주의 사항
<c:forEach var="content" items="${list }" varStatus="num" >
-위에처럼 변수의 값을 줄 때 쌍따옴표로 감싸주지 않으면 오류가 뜸. 주의하기.
- varstatus 사용법
<td>${num.count}</td>
.count 라는 인덱스를 쓴다는 것을 알아두기.
보통 게시판의 글에대한 번호를 올려줄 때는 데이터베이스의 primary 키 값(tno) 을 쓰지않음
그래서 위에처럼 varStatus의 count 인덱스를 사용해서 화면에 보여줌.
* <td><fmt:formatDate value="${content.regdate }" pattern="yyyy-MM-dd"/></td>
formatDate 태그를 사용해서 원하는 형식으로 날짜를 표현 할 수 있음.
맨 상단부에 jstl 태그를 쓰기위해서
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
꼭 기재해주기.
<기억할것>
<select id="getList" resultType="TripVO">
select * from trip order by tno desc;
</select>
resultType 는
원래 jdbc 에서 셀렉트 구문 실행시
resultSet 이거를 대신하는 것임.
'자바 Spring' 카테고리의 다른 글
23-02-09) 스프링 9강 - 게시판 구현 3 ( 페이징 , 페이지내이션, 검색, amount 다루기 ) (1) | 2023.02.09 |
---|---|
23-02-08) spring 9강 - 게시판 구현 2 (수정, 삭제, 조회수-쿠키 , 이전글/다음글 기능) , MySQL 쿼리문 limit 기능, 페이징 구현(creteria 클래스) (0) | 2023.02.08 |
23-02-07) 스프링 9강 - 타일즈 뷰 템플릿, 롬복 (0) | 2023.02.07 |
23-02-06) 마이바티스 Mapper XML의 주요 속성 (0) | 2023.02.06 |
23-02-03) 8강 MyBatis (1) | 2023.02.03 |
- Total
- Today
- Yesterday
- 국비학원 수업
- 자바 api
- 배열 삭제
- 박문석 선생님
- 데이터베이스 수업
- 강남 중앙정보처리학원
- api 활용
- FOR문
- 국비지원 학원 수업 내용
- 배열과 탐색
- 조건문
- 자바
- nasted class
- 다중 반복문
- 오코노라멘
- 강남역 12번 춣구
- 알람 시계 문제
- 자바수업
- 자바스크립트 ES6 문법
- 내포 클래스
- 박인욱 강사님
- JS ES6 문법
- 자바#자바수강기록
- interface #자바
- input 스트림
- 국비학원
- 가비지 콜렉팅
- 배열의 정렬
- 중앙정보처리학원
- output 스트림
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |