1. MyBatis의 Mapper(Java 객체와 SQL 연동)
: MyBatis에서 Mapper 역할을 하는 매핑파일(XML)은 데이터 조작을 하는 객체와 쿼리(SQL)를 연결(mapping),
데이터 조작을 하는 객체는 일반적으로 DAO객체가 그 역할을 하고 있다.
** DAO는 인터페이스로만 주어지고, MyBatis가 DAO를 구현해준다.
** <mappper>는 어느 DAO에 매핑될지 지정, <mapper>는 여러 <SQL세팅>으로 구성 가능
** 각 <SQL세팅>은 DAO의 어느 메소드에 매핑될지 지정
2. MyBatis x 스프링 설정 파일
: MyBatis를 스프링과 같이 사용하려면, 컨텍스트(컨테이너)에 두 가지 필요
1) SqlSessionFactory 정의
: MyBatis 스프링 연동 모듈에서는 SqlSessionFactoryBean을 설정 -> 구현 가능함
2) Mapper 정의
[방법1] 매퍼 interface + MapperFactoryBean 사용
[방법2] XML 파일로 Mapper 세팅
3. SqlSession은 매번 가져와서 사용해야 한다.
왜? SqlSession은 종료되면 자동적으로 닫히기 때문에
[처음] IWriteDAO dao = sqlSession.getMapper(IWriteDAO.class);
[필요할 때마다] dao = sqlSession.getMapper(IWriteDAO.class);
4. STS15_MyBatis
** src > main > webapp > WEB-INF > spring > sppServlet > servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.lec.sts15_mybatis" />
<!-- spring-jdbc 빈 객체 생성 -->
<!-- DataSource 객체 -->
<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<beans:property name="username" value="scott0316"/>
<beans:property name="password" value="tiger0316"/>
</beans:bean>
<!-- MyBatis 설정 -->
<!-- SqlSessionFactoryBean 생성 -->
<beans:bean name="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource"/>
<beans:property name="mapperLocations" value="classpath:com/lec/sts15_mybatis/mapper/*.xml"/>
</beans:bean>
<!-- SqlSessionTemplate 생성 -->
<beans:bean name="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<beans:constructor-arg index="0" ref="SqlSessionFactory"/>
</beans:bean>
</beans:beans>
** [src/main/java] com.lec.sts15_mybatis.board.controller > BoardController.java
package com.lec.sts15_mybatis.board.controller;
import org.apache.ibatis.session.SqlSession;
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.RequestMethod;
import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.command.BCommand;
import com.lec.sts15_mybatis.board.command.BDeleteCommand;
import com.lec.sts15_mybatis.board.command.BListCommand;
import com.lec.sts15_mybatis.board.command.BSelectCommand;
import com.lec.sts15_mybatis.board.command.BUpdateCommand;
import com.lec.sts15_mybatis.board.command.BViewCommand;
import com.lec.sts15_mybatis.board.command.BWriteCommand;
@Controller
@RequestMapping("/board")
public class BoardController {
private BCommand command;
// MyBatis
private SqlSession sqlSession;
public BoardController() {
super();
System.out.println("BoardController() 생성");
}
@Autowired
public final void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
C.sqlSession = sqlSession;
}
@RequestMapping("/list.do")
public String list(Model model) {
command = new BListCommand();
command.execute(model);
return "board/list";
}
@RequestMapping("/write.do")
public String write(Model model) {
return "board/write";
}
@RequestMapping(value = "/writeOk.do", method = RequestMethod.POST)
public String writeOk(BWriteDTO dto, Model model) {
model.addAttribute("dto", dto);
new BWriteCommand().execute(model);
return "board/writeOk";
}
@RequestMapping("/view.do")
public String view(int uid, Model model) {
model.addAttribute("uid", uid);
new BViewCommand().execute(model);
return "board/view";
}
@RequestMapping("/update.do")
public String update(int uid, Model model) {
model.addAttribute("uid", uid);
new BSelectCommand().execute(model);
return "board/update";
}
@RequestMapping(value = "/updateOk.do", method = RequestMethod.POST)
public String updateOK(BWriteDTO dto, Model model) {
model.addAttribute("dto", dto);
new BUpdateCommand().execute(model);
return "board/updateOk";
}
@RequestMapping("/deleteOk.do")
public String deleteOk(int uid, Model model) {
model.addAttribute("uid", uid);
new BDeleteCommand().execute(model);
return "board/deleteOk";
}
}
** [src/main/java] com.lec.sts15_mybatis.board > C.java
package com.lec.sts15_mybatis.board;
import org.apache.ibatis.session.SqlSession;
public class C {
// MyBatis 용 SQLSession
public static SqlSession sqlSession;
}
** [src/main/java] com.lec.sts15_mybatis.board.beans > IWriteDAO.java
<?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.lec.sts15_mybatis.board.beans.IWriteDAO">
<!-- list.do -->
<select id="select" resultType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
SELECT
wr_uid "uid",
wr_subject subject,
wr_content content,
wr_name name,
wr_viewcnt viewcnt,
wr_regdate regdate
FROM
test_write
ORDER BY
wr_uid DESC
</select>
<!-- view.do -->
<select id="selectByUid" resultType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
SELECT
wr_uid "uid", wr_subject subject, wr_content content, wr_name name,
wr_viewcnt viewcnt, wr_regdate regDate
FROM test_write
WHERE wr_uid=#{uid}
</select>
<!-- 조회수 증가 -->
<update id="incViewCnt" flushCache="true">
UPDATE test_write
SET wr_viewcnt = wr_viewcnt + 1
WHERE wr_uid = #{param1}
</update>
<update id="update" flushCache="true"
parameterType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
UPDATE test_write
SET wr_subject = #{subject}, wr_content = #{content}
WHERE wr_uid = #{uid}
</update>
<!-- delete.do -->
<delete id="deleteByUid" flushCache="true">
DELETE FROM test_write WHERE wr_uid = #{uid}
</delete>
</mapper>
** [src/main/java] com.lec.sts15_mybatis.board.beans > IWriteDAO2.java
<?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.lec.sts15_mybatis.board.beans.IWriteDAO">
<!-- write -->
<!--
<insert id="insert" flushCache="true"
parameterType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
INSERT INTO test_write
(wr_uid, wr_subject, wr_content, wr_name)
VALUES
(test_write_seq.nextval, #{subject}, #{content}, #{name})
</insert>
-->
<insert id="insert" flushCache="true">
INSERT INTO test_write
(wr_uid, wr_subject, wr_content, wr_name)
VALUES
(test_write_seq.nextval, #{param1}, #{param2}, #{param3})
</insert>
</mapper>
** [src/main/java] com.lec.sts15_mybatis.board.command > BListCommand.java
package com.lec.sts15_mybatis.board.command;
import java.util.List;
import org.springframework.ui.Model;
import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.*;
public class BListCommand implements BCommand {
@Override
public void execute(Model model) {
// BWriteDAO dao = new BWriteDAO();
// List<BWriteDTO> list = dao.select();
// model.addAttribute("list", list);
// MyBatis 사용
IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
model.addAttribute("list", dao.select());
} // end execute()
} // end Command
** [src/main/java] com.lec.sts15_mybatis.board.command > BWriteCommand.java
package com.lec.sts15_mybatis.board.command;
import java.util.Map;
import org.springframework.ui.Model;
import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;
public class BWriteCommand implements BCommand {
@Override
public void execute(Model model) {
// Model 안에 있는 값(attribute) 꺼내기
Map<String, Object> map= model.asMap();
BWriteDTO dto = (BWriteDTO)map.get("dto");
// BWriteDAO dao = new BWriteDAO();
// int result = dao.insert(dto);
// model.addAttribute("result", result);
// MyBatis 사용
IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
//model.addAttribute("result", dao.insert(dto));
model.addAttribute("result",
dao.insert(dto.getSubject(), dto.getContent(), dto.getName()));
} // end execute
} // end Command
** [src/main/java] com.lec.sts15_mybatis.board.command > BViewCommand.java
package com.lec.sts15_mybatis.board.command;
import java.util.Arrays;
import java.util.Map;
import org.springframework.ui.Model;
import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;
public class BViewCommand implements BCommand {
@Override
public void execute(Model model) {
Map<String, Object> map = model.asMap();
int uid = (Integer)map.get("uid");
// BWriteDAO dao = new BWriteDAO();
// BWriteDTO dto = dao.readByUid(uid);
// model.addAttribute("list", Arrays.asList(dto));
// Arrays.asList(new String[]{"aaa", "bbb"})
// Arrays.asList("aaa", "bbb")
// MyBatis 사용
IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
dao.incViewCnt(uid); // 조회수 증가
BWriteDTO dto = dao.selectByUid(uid); // 똑똑하게 BWriteDTO 를 리턴한다.
model.addAttribute("list", Arrays.asList(dto));
} // end execute()
} // end Command
** [src/main/java] com.lec.sts15_mybatis.board.command > BSelectCommand.java
package com.lec.sts15_mybatis.board.command;
import java.util.Arrays;
import java.util.Map;
import org.springframework.ui.Model;
import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;
public class BSelectCommand implements BCommand {
@Override
public void execute(Model model) {
Map<String, Object> map = model.asMap();
int uid = (Integer)map.get("uid");
// BWriteDAO dao = new BWriteDAO();
// BWriteDTO dto = dao.selectByUid(uid);
// model.addAttribute("list", Arrays.asList(dto));
IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
BWriteDTO dto = dao.selectByUid(uid);
model.addAttribute("list", Arrays.asList(dto));
} // end execute()
} // end Command
** [src/main/java] com.lec.sts15_mybatis.board.command > BUpdateCommand.java
package com.lec.sts15_mybatis.board.command;
import java.util.Map;
import org.springframework.ui.Model;
import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;
public class BUpdateCommand implements BCommand {
@Override
public void execute(Model model) {
Map<String, Object> map = model.asMap();
BWriteDTO dto = (BWriteDTO)map.get("dto");
// BWriteDAO dao = new BWriteDAO();
// int cnt = dao.update(dto);
// model.addAttribute("result", cnt);
IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
model.addAttribute("result", dao.update(dto));
} // end execute()
} // end Command
** [src/main/java] com.lec.sts15_mybatis.board.command > BDeleteCommand.java
package com.lec.sts15_mybatis.board.command;
import java.util.Map;
import org.springframework.ui.Model;
import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;
public class BDeleteCommand implements BCommand {
@Override
public void execute(Model model) {
Map<String, Object> map = model.asMap();
int uid = (Integer)map.get("uid");
// BWriteDAO dao = new BWriteDAO();
// int cnt = dao.deleteByUid(uid);
// model.addAttribute("result", cnt);
IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
model.addAttribute("result", dao.deleteByUid(uid));
} // end execute
} // end Command
6. MyBatis 버전으로 완성되면 아래의 코드 및 클래스를 삭제해도 작동 가능하다
1) com.lec.sts15_mybatis.board > BWriteDAO 클래스 삭제 가능
2) com.lec.sts15_mybatis.board.controller > BoardController 컨트롤러에서 사용하던 JdbcTemplate 변수 삭제 가능
3) com.lec.sts15_mybatis.board > C.java에서 사용하던 JdbcTemplate 변수 삭제 가능
4) src > main > webapp > WEB-INF > spring > sppServlet > Servletservlet-context.xml
설정파일의 JdbcTemplate 빈 설정 삭제 가능
5) com.lec.sts15_mybatis.board > C.java의 쿼리문 모두 삭제 가능
'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글
2020.07.03 (0) | 2020.07.03 |
---|---|
2020.07.02 (0) | 2020.07.02 |
2020.06.30 (0) | 2020.06.30 |
2020.06.29 (0) | 2020.06.29 |
2020.06.23 (0) | 2020.06.23 |