[TIL] 23.04.04 스프링
이미지를 여러개 업로드 하는방법
<input type="file" name="photo" class="form-control" style="width: 200px;" multiple="multiple">
input태그에 multiple 옵션을 넣어준다.
controller의 메서드 파라미터에 @RequestParam ArrayList<MultipartFile> photo, 이렇게 리스트로 받는다.
ArrayList<String> files = new ArrayList<String>();
//파일명 담기
for(MultipartFile f : photo) {
String fileName = "p_"+sdf.format(new Date()) + "_" + f.getOriginalFilename();
files.add(fileName);
//업로드
try {
f.transferTo(new File(path + "\\" + fileName));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
model.addObject("files", files);
수정된 컨트롤러 코드
mysql에서 계정만들고 스키마(db) 만들기
계정을 workbench에서 만들고 그 계정으로 들어가서 스키마(원형통)를 하나 만들어준다.
cmd에서 저장하는 코드는
>mysql -u springheesoo -p
아까 스키마를 만들어줬다면
>show databases;
를 칠 경우 만들어준 스키마가 보인다.
jdbc url : jdbc:mysql://localhost:3306/{db명(스키마명)}?serverTimezone=Asia/Seoul
인데 mysql workbench에서는 계정 우클릭하고 copy jdbc~~를 누르면 비슷하게 나오긴한다.
jdbc:mysql://127.0.0.1:3306/?user=springheesoo
jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
퀀텀db설치법
https://sallykim5087.tistory.com/127
~~
Mybatis 세팅
mybatis를 쓰기위해 mvnrepo에서 아래 의존성 코드가져온다
mybatis, mybatis spring, Spring jdbc, mysql connecter j
받아온다.
받은 코드는 pom.xml에 적어준다.
mybatis-config.xml
src/main/resources폴더에 mybatis-config.xml 만든다.
mybatis-config.xml에 아래 doctype 넣어준다.
하는 역할은 스프링에 dto를 등록하면서, 별칭을 넣어주는 역할이다(너무길어서, 다른곳에서 쓸때 사용할 별칭설정)
<!-- 이 Doctype넣어주고 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 아래에 dto있을때마다 등록해준다. -->
<configuration>
<typeAliases>
<!-- alias는 resultType에서 쓴다. -->
<typeAlias alias="CarDto" type="spring.db.car.MyCarDto"/>
</typeAliases>
</configuration>
Mapper가 뭔가?
model 1 방식에서 dao안에 sql문을 적어줬는데 Mybatis에서는 여기에 Mapper에 넣어준다.
https://twofootdog.github.io/Spring-DAO%EC%99%80-Mapper%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90/
src/main/resources폴더에 mapper패키지만들고 안에 mycarMapper.xml 만들고
mycarMapper.xml에 아래 doctype을 넣어주고, 그 아래에 sql문을 적는다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mycar">
<select id="getTotalCountOfMyCar" resultType="int">
select count(*) from mycar
</select>
<select id="getAllDatasOfMycar" resultType="CarDto">
select * from mycar order by num desc
</select>
<insert id="insertOfMyCar" parameterType="CarDto">
insert into mycar (carname,carprice,carcolor,carguip) values(#{carname},#{carprice},#{carcolor},#{carguip})
</insert>
<!-- resultType:반환타입, parameterType:파라미터의 타입 -->
<select id="getOneDataOfMyCar" resultType="CarDto" parameterType="String">
select * from mycar where num=#{num}
</select>
<update id="updateOfMyCar" parameterType="CarDto">
update mycar set carname=#{carname}, carprice=#{carprice}, carcolor=#{carcolor}, carguip=#{carguip} where num = #{num}
</update>
<delete id="deleteOfMyCar" parameterType="String">
delete from mycar where num = #{num}
</delete>
</mapper>
모든 sql명령어는 태그로 감싸져 있다. 속성중 id는 Dao에서 접근할때 사용한다.
resultType은 반환타입이고 parameterType은 파라미터로 들어오는 데이터의 타입이다.
root-context.xml
root-context.xml은 bean설정하고 dao에 필요한 팩토리 연결하는 곳, mysql에 대한 설정도 여기서 한다. 세션팩토리도 적음(세션팩토리가 Mapper랑 mybatis 설정).
경로 : src/main/webapp/WEB-INF/spring/root-context.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul"></property>
<property name="username" value="springheesoo"></property>
<property name="password" value="1234"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
driverClassName과 url, username,password를 수정해주는데
driverClassName : Driver class name
url은 위의 jdbc url(가운데 spring은 스키마 이름이다.)
username : 나의 계정이름 password:password
configLocation의 value : classpath:mybatis-config.xml(이름적어준다.)
mapperLocations의 value : classpath:mapper/매퍼이름.xml 인데 *Mapper.xml로 뒷부분 통일해줌.
configLocation은 mybatis위치(mybatis-config.xml)를 적는거고
mapperLocation도 mapper의 위치를 적는것이다.
Dao에 적는 것
클래스 선언부 위에 @Repository 적는다.
클래스 안의 맨 위에 SqlSession session을 선언하는데 @Autowired로 등록해준다.
SqlSession 설명 : https://mybatis.org/spring/ko/sqlsession.html
기존 model 1 방식처럼 dao를 적되 SqlSession를 이용한다. SqlSession로 session이란 변수를 만들었다고 가정하고 아래처럼 적는다.
@Repository // dao를 bean에 등록
public class MyCarDao {
@Autowired
private SqlSession session;
// 총개수
public int getTotalCount() {
//select할게 하나면 selectOne 여러개면 selectList
return session.selectOne("getTotalCountOfMyCar");// mycarMapper의 id를 넣어준다.
}
// 전체 데이터
public List<MyCarDto> getAllDatas() {
return session.selectList("getAllDatasOfMycar");
}
// insert
public void insertMyCar(MyCarDto dto) {
session.insert("insertOfMyCar", dto);
}
// 수정폼
public MyCarDto getData(String num) {
//파라미터가있으면 파라미터가 두개인걸 고름.
return session.selectOne("getOneDataOfMyCar", num);
}
public void updateMyCar(MyCarDto dto) {
session.update("updateOfMyCar", dto);
}
//delete
public void deleteMyCar(String num) {
session.delete("deleteOfMyCar", num);
}
}
session.여기에는메서드명("mapper에서적은 불러올 id", "입력값이 있을경우 적는다.")
그후 controller를 수정한다.
사용하는 Dao를 controller아래에 하나 선언하고 @Autowired로 감싼다.
메서드에 파라미터로 이전 페이지에서 num같은것을 넘겨받을것이 있으면 @RequestParam String num 이런식으로 적는다. Model로 값을 넘길거면 Model model도 적는다. (ModelAndView를 써도 된다.)
@ModelAttribute는 사용자가 요청시 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션인데 설명하면
이전 페이지에서 값을 넘길때 여러가지값들을 넘기면, 넘긴 각각의 값들이 @ModelAttribute의 뒤에 적힌 객체(dto)로 바인딩된다.
@Controller
public class CarController {
@Autowired
MyCarDao dao;
@GetMapping("/samsung/list")
public String list(Model model) {
//전체개수
int totalCount = dao.getTotalCount();
//목록가져오기
List<MyCarDto> list = dao.getAllDatas();
//request에 저장.
model.addAttribute("totalCount", totalCount);
model.addAttribute("list", list);
return "car/carlist";
}
@GetMapping("/samsung/writeform")
public String write() {
return "car/writeform";
}
//insert
@PostMapping("/samsung/write")
public String insert(@ModelAttribute MyCarDto dto) {
dao.insertMyCar(dto);
return "redirect:list";//redirect시에는 이런식으로 쓴다.(/samsung/write -> /samsung/list)
}
//수정폼으로 가기
@GetMapping("/samsung/updateform")
public String updateform(/*form에서 가져올정보를 가져온다.*/@RequestParam String num, Model model) {
//dto가져오기
MyCarDto dto = dao.getData(num);
//저장
model.addAttribute("dto", dto);
return "car/updateform";
}
//액션
@PostMapping("/samsung/update")
public String update(@ModelAttribute MyCarDto dto) {
dao.updateMyCar(dto);
return "redirect:list";
}
@GetMapping("/samsung/delete")
public String delete(@RequestParam String num) {
dao.deleteMyCar(num);
return "redirect:list";
}
}
explorer 이미지
개발할때
sql(mapper)먼저 적고 dao 적고 controller 순으로 개발한다. 디스패처서블릿은 반대임.
mapper는 sql문을 적는다
dao에는 mapper에 쓴 것을 id로 불러온다.