[Springboot] mybatis사용한 CRUD 구현

728x90

#1) 프로젝트 개발 환경

intellj , java(jdk-11), spring boot2.7.17, mysql , maven, jsp(jstl)

 

 

#2) 프로젝트 의존성을 추가

Lombok, spring web , spring dev tools, mysql driver, mybatis framewrok

총 5가지를 추가했습니다. 

 

 

#3) 기본 설정

pom.xml

<!-- jstl (인텔리제이는 jar추가하면대서 안넣어도댐-->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

<!-- Tomcat 사용 -->
	<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>

이 두가지를 추가해줍니다.

 

다음으로는 application.properties를 추가 해 줍니다.

이 설정은 yml 이나 properties 어느 것이든 상관 없습니다.

application.properties

#server.port설정
server.port=8080

#jsp 설정
spring.mvc.view.prefix=/WEB-INF/폴더이름/
spring.mvc.view.suffix=.jsp
spring.devtools.livereload.enabled=true

#MySql 설정
class.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://@localhost:3306/spring?serverTimezone=Asia/Seoul
spring.datasource.username=root
spring.datasource.password=1234

#mysql 상세 지정
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

 

#4) 메인 어플리케이션 설정

@SpringBootApplication
@ComponentScan({"data.model.*"}) //컨트롤러가 경로 찾을 패키지 명 적기 
@MapperScan({"data.model.*"}) //mybatis에서 mapper실행하기 위한 위한 경로 적기
public class SpringBootMybatis4Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMybatis4Application.class, args);
    }

}

 

#5) 클래스 생성 (패키지 경로  / 클래스이름.class)

 

data.model.dto / MarketDto.class

@Data  //lombok -> getter/setter 해주는 것
@Alias("mdto") -> mapper에서 이 dto클래스 별명을 정한것, 이 별명을 사용함 mapper에서 
public class MarKetDto {
    private String num;
    private int price;
    private String sang;
    private String photoname;
    private Timestamp ipgoday;

}

 

data.model.service / MarketServiceInter

public interface MarketServiceInter {

//중요!!!!!!!!!! 메소드 이름 == mappper에 이름 같아야함
    
    public int getTotalCount(); 
    public List<MarKetDto> getAllSangpum();
    public void insertSangpum(MarKetDto dto);
    public MarKetDto getNum(int num);
    public void deleteOfMarket(String num);
    public void updateOfMarket(MarKetDto dto);
}

 

data.model.service / MarketService → inter 구현하는 클래스

@Service
public class MarketService implements MarketServiceInter {

	@Autowired
	MarketMapperInter mapperInter;

	@Override
	public int getTotalCount() {
		return mapperInter.getTotalCount();
	}

	@Override
	public List<MarKetDto> getAllSangpum() {
		return mapperInter.getAllSangpum();
	}

	@Override
	public void insertSangpum(MarKetDto dto) {
		mapperInter.insertSangpum(dto);

	}

	@Override
	public MarKetDto getNum(String num) {
		return mapperInter.getNum(num);
	}

	@Override
	public void deleteOfMarket(String num) {
		mapperInter.deleteOfMarket(num);
	}

	@Override
	public void updateOfMarket(MarKetDto dto) {
		mapperInter.updateOfMarket(dto);
	}
}

 

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="data.model.mapper.MarketMapperInter">
    <select id="getTotalCount" resultType="int">
        select count(*) from market
    </select>

    <select id="getAllSangpum" resultType="mdto">
        select * from market order by num desc
    </select>

    <insert id="insertSangpum" parameterType="mdto">
        insert into market values(null,#{sang},#{price},#{photoname},now())
    </insert>

    <select id="getNum" resultType="mdto" parameterType="String">
        select * from market where num=#{num}
    </select>

    <delete id="deleteOfMarket" parameterType="String">
        delete from market where num=#{num}
    </delete>

    <update id="updateOfMarket" parameterType="mdto">
        update set market sang=#{sang},price=#{price},photoname=#{photoname} where num=#{num}
    </update>
</mapper>

 

data.model.mapper / MarketMapperInter

public interface MarketMapperInter {
	public int getTotalCount(); //메소드 이름 == mappper에 이름이 된다.

	public List<MarKetDto> getAllSangpum();

	public void insertSangpum(MarKetDto dto);

	public MarKetDto getNum(String num);

	public void deleteOfMarket(String num);

	public void updateOfMarket(MarKetDto dto);

}

 

Controller

@Controller
public class MarketController {

	@Autowired
	MarketService service;

	//root 설정
	@GetMapping("/")
	public String start() {
		return "redirect:market/marketlist";
	}

	//여기에 /market/을 하였기 때문에 초기 중간경로가 market으로 설정 그러므로 중간경로에 market을 꼭 써줘야한다
	@GetMapping("/market/marketlist")
	public ModelAndView list() {
		ModelAndView modelAndView = new ModelAndView();

		//DB로부터 총 갯수 얻기
		int totalCount = service.getTotalCount();
		List<MarKetDto> list = service.getAllSangpum();

		modelAndView.addObject("totalcount", totalCount);
		modelAndView.addObject("list", list);

		modelAndView.setViewName("market/marketlist");
		return modelAndView;
	}

	//writeform으로 포워딩
	@GetMapping("/market/writeform")
	public String writeform() {
		return "market/addForm";
	}

	//사진 파일 insert 하기
	@PostMapping("/market/add")
	public String add(Model model, @ModelAttribute MarKetDto dto,
		MultipartFile uphotoname,
		HttpSession session) {

		List<MultipartFile> list = new ArrayList<MultipartFile>();

		//업로드할 save 경로 구하기
		String path = session.getServletContext().getRealPath("/save");
		System.out.println(path);

		//압로드한 파일 dto 얻기
		dto.setPhotoname(uphotoname.getOriginalFilename());

		//실제 업로드
		try {
			uphotoname.transferTo(new File(path + "\\" + uphotoname.getOriginalFilename()));
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		model.addAttribute("dto", dto);
		service.insertSangpum(dto);
		return "redirect:marketlist";
	}

	@GetMapping("/market/delete")
	public String delete(@RequestParam String num, HttpServletRequest request) {

		//글 삭제시 실제 경로 사진도 삭제되게 만들기.
		String photo = service.getNum(num).getPhotoname();

		if (!photo.equals(null)) {
			String path = request.getServletContext().getRealPath("/save");

			File file = new File(path + "\\" + photo);
			file.delete();
		}
		//삭제
		service.deleteOfMarket(num);
		return "redirect:marketlist";
	}

	//update 폼으로 넘어가기.
	@GetMapping("/market/update")
	public ModelAndView update(@ModelAttribute MarKetDto dto) {
		ModelAndView modelandview = new ModelAndView();
		modelandview.addObject("dto", dto);

		modelandview.setViewName("market/uform");
		return modelandview;
	}

	@PostMapping("/market/updateform")
	public ModelAndView updateform(@ModelAttribute MarKetDto dto) {
		ModelAndView modelandview = new ModelAndView();
		modelandview.addObject("dto", dto);

		//업데이트
		service.updateOfMarket(dto);

		modelandview.setViewName("redirect:marketlist");
		return modelandview;
	}

}

 

폼은 없이 crud 로직만 작성했습니다. 이상입니다.

728x90