<!-- jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- tomcat-embed-jasper -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
yml은 자동 들여쓰기 적용
mybatis:
type-aliases-package: data.model.* #data.model.mapper(dao역할)/data.model.dto 를 등록한 것
mapper-locations:
- /mapper/**/*.xml #src/main/resources 안 mapper 폴더 안 .xml 파일 위치 등록
#yml버전 자동 들여쓰기 적용
#tomcat port
server:
port: 9001
#jsp - yml에서는 앞에가 같으면 띄어서 적어짐
spring:
mvc:
view:
prefix: /WEB-INF/
suffix: .jsp
devtools:
livereload:
enabled: true
#mysql
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/coffee?serverTimezone=Asia/Seoul
username: tjdgus
password: 1234
#mybatis setting
mybatis:
type-aliases-package: data.model.* #data.model.mapper(dao역할)/data.model.dto 를 등록한 것
mapper-locations:
- /mapper/**/*.xml #src/main/resources 안 mapper 폴더 안 .xml 파일 위치 등록
src/main/resources 안 mapper 폴더 안 MarketSql.xml
reference Maven 들어가서 Download Artifact Javadoc 체크해주면 빨간줄 사라짐
<?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">
<!-- reference Maven 들어가서 Download Artifact Javadoc 체크해주면 빨간줄 사라짐 -->
<mapper namespace="data.model.mapper.MarketMapperInter">
<select id="getTotalCount" resultType="int">
select count(*) from market
</select>
<select id="getAllSangpums" resultType="mdto"> <!-- dto에 @Alias("mdto")로 설정해줌 -->
select * from market order by num
</select>
<insert id="insertMarket" parameterType="mdto">
insert into market (price,sang,photoname,ipgoday) values(#{price},#{sang},#{photoname},now())
</insert>
</mapper>
이곳에서 dao의 역할을 대신 해줄 수 있기 때문에 dao는 필수가 아니게 된다
package data.model.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import data.model.dto.MarketDto;
@Mapper //sql문 전달자 역할
public interface MarketMapperInter { //이곳에서 dao의 역할을 대신 해줄 수 있기 때문에 dao는 필수가 아니게 된다
public int getTotalCount(); //메소드명이 id역할을 수행 / sql의 mybatis와 이름(id)이 같아야함 ... interface ->MarketSql.xml 로 가야함
public List<MarketDto> getAllSangpums();
public void insertMarket(MarketDto dto);
public MarketDto getData(String num);
public void updateMarket(MarketDto dto);
public void deleteMarket(String num);
}
package boot.mvc.sist;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("data.model.*")
@MapperScan("data.model.mapper") //@MapperScan bean에 등록하는 것 대신 등록 / mapper는 dao의 역할
public class SpringBootMybatis4Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatis4Application.class, args);
}
}
Spring boot에서 jpa나 mybatis사용시 mapper에 추가적인 자바코드가 필요할 때 사용하는 공간
MarketMapperInter 쓰다가 java문을 더 써줄게 있다면 service interface에 그대로 가져와서 MarketService를 만들어준다
MarketMapperInter에서 그대로 가져왔다 (MarketService.java에서 implements만을 받을 용도)
이 interface는 단순히 service에서 implements를 받기 위해 만들어진 interface이다
넘겨줄 인자값이 2개 이상이라 map으로 넣어주려면 그 map을 풀어서 인자값으로 각각 넣어주면 된다
package data.model.service;
import java.util.List;
import data.model.dto.MarketDto;
public interface MarketServiceInter { //MarketMapperInter 쓰다가 java문을 더 써줄게 있다면 service interface에 그대로 가져와서 MarketService를 만들어준다
public int getTotalCount();
public List<MarketDto> getAllSangpums();
public void insertMarket(MarketDto dto); //넘겨줄 인자값이 2개 이상이라 map으로 넣어주려면 그 map을 풀어서 인자값으로 각각 넣어주면 된다
public MarketDto getData(String num);
public void updateMarket(MarketDto dto);
public void deleteMarket(String num);
}
이 service는 옛날의 dao처럼 추가 코드를 작성할 곳으로 사용할 곳
옛날의 dao라 생각 / mapper(sql)를 보완해주는 공간
MarketMapperInter.java 1개로 자바개념을 다 할 수 있다면 data.model.service를 만들어줄 필요 없다
service에서 mapper를 implement를 받지는 않는다
MarketServiceInter는 implements를 받기 위해서 만든 interface
실제로 @Autowired를 받아오는 곳은 MarketMapperInter이다
package data.model.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import data.model.dto.MarketDto;
import data.model.mapper.MarketMapperInter;
@Service //옛날의 dao라 생각 / mapper(sql)를 보완해주는 공간
public class MarketService implements MarketServiceInter { //MarketMapperInter.java 1개로 자바개념을 다 할 수 있다면 data.model.service를 만들어줄 필요 없다
//mapper를 implement를 받지는 않는다
//MarketServiceInter는 implements를 받기 위해서 만든 interface
@Autowired
MarketMapperInter mapperInter; //실제로 @Autowired를 받아오는 곳은 MarketMapperInter이다
@Override
public int getTotalCount() {
// TODO Auto-generated method stub
return mapperInter.getTotalCount();
}
@Override
public List<MarketDto> getAllSangpums() {
// TODO Auto-generated method stub
return mapperInter.getAllSangpums();
}
@Override
public void insertMarket(MarketDto dto) {
// TODO Auto-generated method stub
mapperInter.insertMarket(dto);
}
@Override
public MarketDto getData(String num) {
// TODO Auto-generated method stub
return mapperInter.getData(num);
}
@Override
public void updateMarket(MarketDto dto) {
// TODO Auto-generated method stub
mapperInter.updateMarket(dto);
}
@Override
public void deleteMarket(String num) {
// TODO Auto-generated method stub
mapperInter.deleteMarket(num);
}
}
자바코드를 보완한 service를 @Autowired 해줘야한다
@Autowired
MarketService service;
package data.model.controller;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import data.model.dto.MarketDto;
import data.model.mapper.MarketMapperInter;
import data.model.service.MarketService;
@Controller
public class MarketController {
// @Autowired
// MarketMapperInter mapper;
@Autowired
MarketService service; //MarketService를 받아와서 사용하면 된다 / mapper를 보완해서 service를 만들었기 때문
@GetMapping("/")
public String start()
{
return "redirect:market/list";
}
@GetMapping("/market/list")
public ModelAndView list()
{
ModelAndView model=new ModelAndView();
//db로부터 총 갯수 얻기
int totalCount=service.getTotalCount();
List<MarketDto> list=service.getAllSangpums();
model.addObject("totalCount", totalCount);
model.addObject("list", list);
model.setViewName("market/marketlist");
return model;
}
@GetMapping("/market/writeform")
public String writeform()
{
return "market/addform";
}
@PostMapping("/market/add")
public String add(@ModelAttribute MarketDto dto,
@RequestParam MultipartFile upload,
HttpSession session)
{
String path=session.getServletContext().getRealPath("/save");
System.out.println(path);
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
if(upload.getOriginalFilename().equals(""))
dto.setPhotoname(null);
else {
String fName=sdf.format(new Date())+upload.getOriginalFilename();
dto.setPhotoname(fName);
try {
upload.transferTo(new File(path+"/"+fName));
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
service.insertMarket(dto);
return "redirect:list";
}
@GetMapping("/market/delete")
public String delete(@RequestParam String num,
HttpServletRequest request)
{
String photo=service.getData(num).getPhotoname();
if(photo!=null)
{
String path=request.getServletContext().getRealPath("/save");
File file=new File(path+"/"+photo);
file.delete();
}
service.deleteMarket(num);
return "redirect:list";
}
}