ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022-03-14 스프링 부트 : DB 연동, 간단한 게시판, My Batis
    학원/Spring 2022. 3. 14. 15:42

     

     

    데이터 베이스 연동하기

     

     

    프로젝트 생성시 JDBC API를 추가로 선택

     

     

    프로젝트 우클릭 properties -> Java Build Path

     

     

    ojdbc6.jar 추가

     

     

     

    ↓application.properties에 추가로 적어줄 것

     

    #oracle set
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    spring.datasource.url=jdbc.oracle.thin:@localhost:1521:xe
    spring.datasource.username=scott
    spring.datasource.password=tiger

     

    (작성 후 refresh)

     

     

    test용으로 간단한 테이블 생성

     

     

     

    Dto 파일 생성

     

    @Data
    public class UserDto {
    	private String id;
    	private String name;
    }

     

     

    Controller

     

    @Controller
    public class UserController {
    
    	@Autowired
    	UserDao udao;
    	
    	@RequestMapping("/")
    	public String userListPage(Model model) {
    		List<UserDto> list = udao.list();
    		
    		model.addAttribute("users", list);
    		return "userlist";
    	}
    }

     

     

    Dao 

     

    @Repository
    public class UserDao {
    	
    	@Autowired
    	private JdbcTemplate template;
    	//servlet-context.xml에 bean으로 넣거나 할 필요 x 
    	
    	public List<UserDto> list() {
    		String sql = "select * from myuser";
    		List<UserDto> list = template.query(sql, new BeanPropertyRowMapper<UserDto>(UserDto.class));
    		//ResultSet 사용 없이 검색 결과 레코드의 필드를 Dto 변수에 넣고 list에 add 동작을 실행
    		
    		return list;
    	}
    }

     

     

    userlist.jsp

     

    <body>
    <h1><% out.println("JdbcTemplate : UserList"); %></h1>
    <c:forEach var ="dto" items="${users}">
    	<h1>${dto.id} / ${dto.name}</h1>
    </c:forEach>
    </body>

     

     

    실행 결과

     

     

     

    -> 이 방법을 사용시 refres gradle 하게되면 ojdbc6.jar가 사라지게 되어 계속 다시 추가해줘야 함

     

     


     

     

     

    프로젝트 생성 할 때 oracle Driver 를 추가한다

     

     

     

    프로젝트를 생성하고 나면 ojdbc8 이 추가되어있다 

    -> 원래는 6을 사용하는데 8을 사용해도 크게 문제 없기 때문에 그냥 사용

     

    aplication.properties는 위에서 작성했던 대로 #Server port, #about JSP, #oracle set 까지 작성

     

     


     

    간단한 게시판 만들기

     

    sql

     

    create table bbs(
    	id number(3),
    	writer varchar2(30),
    	title varchar2(30),
    	content varchar2(1000)
    );
    
    create sequence bbs_seq start with 1;
    
    insert into bbs values(bbs_seq.nextVal, 'Gildong', '반갑습니다', '반갑습니다 여러분');
    insert into bbs values(bbs_seq.nextVal, 'Gilnam', '안녕하세요', '안녕하세요 여러분');
    insert into bbs values(bbs_seq.nextVal, 'Gilbook', '어서오세요', '어서오세요 여러분');
    
    select * from bbs

     

     

     

    dto

     

    @Data
    public class BbsDto {
    	private int id;
    	private String writer;
    	private String title;
    	private String content;
    }

     

     

    Interface

     

    public interface IBbsDao {
    	public List<BbsDto> list();	//게시물 전체 조회
    	public int write(BbsDto bdto); //쓰기
    	public int update(BbsDto bdto); //수정
    	public int delete(int id); //삭제
    	public BbsDto veiw(int id); //게시물 하나 보기
    }

     

     

    Controller

     

    package com.ezen.spg10;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import com.ezen.spg10.dao.BbsDao;
    
    @Controller
    public class BbsController {
    	
    	@Autowired
    	BbsDao bdao;
    	
    	
    //메인페이지
    	@RequestMapping("/")
    	public String root(Model model) {
    		model.addAttribute("list", bdao.list());
    		return "list";
    	}
    	 
    //글 작성 폼으로 이동
    	@RequestMapping("/writeForm")
    	public String writeFrom(Model model) {
    		return "writeForm";
    	}
    	
    //insert 
    	@RequestMapping("write")
    	public String write(BbsDto bbsdto) {
    		//매개변수명은 클래스이름을 소문자로 적는다 
    		bdao.write(bbsdto);
    		return "redirect:/";
    	}
    	
    //상세보기 
    	@RequestMapping("view")
    	public String view(Model model, @RequestParam("id") int id) {
    		model.addAttribute("dto",bdao.view(id));
    		return "view";
    	}
    	
    //삭제
    	@RequestMapping("delete")
    	public String delete(@RequestParam("id") int id) {
    		bdao.delete(id);
    		return "redirect:/";
    	}
    }

     

     

     

     

     

    Dao

     

    package com.ezen.spg10.dao;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    import com.ezen.spg10.BbsDto;
    
    @Repository
    public class BbsDao implements IBbsDao{
    	
    	@Autowired
    	private JdbcTemplate template;
    	
    	//전체 조회
    	@Override
    	public List<BbsDto> list() {
    		String sql = "select * from bbs";
    		List<BbsDto> list = template.query(sql, new BeanPropertyRowMapper<BbsDto>(BbsDto.class));
    		return list;
    	}
    
    	//작성
    	@Override
    	public int write(BbsDto bdto) {
    		String sql = "insert into bbs values(bbs_seq.nextVal, ?,?,?)";
    		int result = template.update(sql, bdto.getWriter(), bdto.getTitle(), bdto.getContent());
    		return result;
    	}
    
    	//수정
    	@Override
    	public int update(BbsDto bdto) {
    		return 0;
    	}
    
    	//삭제
    	@Override
    	public int delete(int id) {
    		String sql = "delete from bbs where id = ?";
    		return template.update(sql, id);
    	}
    
    	//상세보기
    	@Override
    	public BbsDto view(int id) {
    		String sql = "select * from bbs where id=?";
    		BbsDto dto = template.queryForObject(sql, new BeanPropertyRowMapper<BbsDto>(BbsDto.class), id);
    		return dto;
    	}
    }

     

     

     

     

    list.jsp 

     

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>게시물 목록</title>
    </head>
    <body>
    <table width="500" cellpadding="0" cellspacing="0" border="1">
    	<tr align="center">
    		<td>번호</td><td>작성자</td><td>제목</td><td>삭제</td>
    	</tr>
    	<c:forEach items="${list}" var="dto">
    		<tr align="center">	
    			<td>${dto.id}</td>
    			<td>${dto.writer}</td>
    			<td><a href="view?id=${dto.id}">${dto.title}</a></td>
    			<td><a href="delete?id=${dto.id}"> X </a></td>
    		</tr>
    	</c:forEach>
    </table>
    <p><a href="writeForm"> 글 작성</a>
    </body>
    </html>

     

    writeForm.jsp

     

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>글쓰기</title>
    </head>
    <body>
    <table widht="500" cellpadding="0" cellspacing="0" border="1">
    	<form action="write" method="post">
    		<tr>
    			<td> 작성자 </td>
    			<td> <input type="text" name="writer"  size="50"></td>
    		</tr>
    		<tr>
    			<td> 제목 </td>
    			<td> <input type="text" name="title"  size="50"></td>
    		</tr>
    		<tr>
    			<td> 내용 </td>
    			<td> <input type="text" name="content"  size="50"></td>
    		</tr>
    		<tr>
    			<td colspan="2">
    				<input type="submit" value="입력">
    				<a href="/"> 목록 보기 </a> 
    			</td>
    		</tr>
    	</form>
    </table>
    </body>
    </html>

     

     

    View.jsp

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>상세보기</title>
    </head>
    <body>
    내용보기 <br>
    <hr>
    작성자 : ${dto.writer }<br>
    제목 : ${dto.title }<br>
    내용 : ${dto.content }<br>
    <hr>
    <br>
    <p>	<a href="/"> 목록보기</a> </p>
    
    </body>
    </html>

     

     

     

    실행 결과 

     

     

    전체 조회

     

     

    글쓰기를 완료하면 list 페이지로 돌아간다 (에러가 한번 나서 4번이 빠졌다)

     

    글 제목을 클릭하면 상세보기로 이동

     

     

    x 버튼을 누르면 글을 삭제하고 리스트를 보여준다 

     

     


     

    MyBatis

     

     

    프로젝트 생성시에 MyBatis Framework 를 추가 생성

     

    Application.properties에는 myBatis classpath를 추가하여 아래와 같이 작성

     

    #Server port
    server.port=8070
    
    #about JSP
    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
    
    
    #oracle set
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
    spring.datasource.username=scott
    spring.datasource.password=tiger
    
    #mybatis 
    mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml

     

     

     

    사진 위치에 mybatis.mapper 패키지를 만들고 ~~Dao.xml 을 만든다 

    classpath에 /**/**.xml의 ** 은 지정되지 않은 모종의 이름을 의미한다 

    /**/ -> 상위 폴더가 있을 수 도있고 없을 수도 있음 

    **.xml -> 이름은 모르겠지만 xml을 찾아주세요 

     

     

    src/main/java에 controller, dto, dao 패키지를 만들고 파일을 생성한다 

     

    Controller

     

    @Controller
    public class UserController {
    	
    	@Autowired
    	IUserDao udao;
    	
    	@RequestMapping("/")
    	public String root(Model model) {
    		List<UserDto> list = udao.list();
    		//인터페이스의 추상메서드를 호출하면, 인터페이스가 해당 메서드를 xml에서 실행
    		
    		model.addAttribute("users", list);
    		return "userlist";
    	}
    }

     

     

     

    IUserDao (interface)

    -> mybatis 사용시에는 @Mapper  어노테이션을 사용

     

    @Mapper
    public interface IUserDao {
    	public List<UserDto> list(); //
    }

    -> 이 인터페이스는 UserDao.xml가 mapping하여 사용한다.

     

     

     

    UserDao.xml

     

    <?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.ezen.spg11.dao.IUserDao">
    	
    	<select id="list" resultType="com.ezen.spg11.dto.UserDto">
    			<!-- id = "메서드이름" resultType="리턴 될 타입 경로"-->
    		select * from myuser
    	</select> 
    
    </mapper>

     

    * 실행 순서

    -> xml 파일 내 namespace 검색 -> 안쪽 태그들중 select id="메서드이름"에 해당하는 id(메서드이름)을 찾는다

    -> <select></select> 내부의 sql문 실행

    -> resultType에 맞는 자료형 형태로 리턴

     

     

    실행결과

     

     

     


     

     

    댓글

Designed by Tistory.