Spring - Mybatis
예제를 통해, MyBatis를 이용하여 DB에 접근해보자.
<br/>
<img alt="" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/YJC4Z9181224235518.PNG" style="border-style:solid; border-width:1px; width:360px">
우선 프로젝트의 기본적인 셋팅이다 ( MySql과 연동을 말함)*
학생정보를 DBMS로부터 가져오는 예제이다. <span style="color:#2980b9">Spring 4.2.3을 사용했다.
<br/>
학생 테이블을 다음과 같이 생성한다.
create table TB_SAMP_STUDENT(
STNT_ID int primary key,
STNT_NAME varchar(100),
STNT_AGE int,
STNT_SEX char(1)
);
<br/>
매핑 되는 학생 클래스는 다음과 같다.
public class StudentVo {
private int id;
private String name;
private int age;
private String sex;
//add getter, setter
}
<br/>
<br/>
그럼 이제 MyBatis를 활용해보자.
Mybatis 3.4.5 버전이 maven에 없으므로 web라이브러리에 추가한다. (해당 파일을 첨부)
Pom.xml에는 다음 라이브러리를 추가하자.
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<br/>
<br/>
<img alt="" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/3Q3SRZ181224235518.PNG" style="border-style:solid; border-width:1px; width:360px">
resources에 MyBatis 설정파일과 맵퍼를 추가한다.
<br/>
그 다음 <span style="color:#8e44ad">dao-context.xml에 다음을 추가하자.
<!-- Mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="DataSource" />
<property name="configLocation" value="classpath:com/cglee079/sample/mybatis/mybatis-config.xml" />
<property name="mapperLocations" value="classpath:com/cglee079/sample/mybatis/mappers/**.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
MyBatis설정 파일 위치와 Mapping 위치를 정의한다.
<br/>
<span style="color:#2980b9">myBatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- Set Config -->
</configuration>
<br/>
<span style="color:#2980b9">studentMapper.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.cglee079.sample.mapper.StudentMapper">
</mapper>
<br/>
이제 모든 설정은 끝났다.
쿼리를 추가하고 데이터를 매핑하여 가져오는 일만 남았다.
<br/>
TB_SAMP_STUENT 데이터를 가져와 뿌려주는 예제를 구현해보자.
<br/>
<span style="color:#2980b9">studentMapper.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.cglee079.sample.mapper.StudentMapper">
<select id="list" resultType="com.cglee079.sample.model.StudentVo">
SELECT
STNT_ID as 'id',
STNT_NAME as 'name',
STNT_AGE as 'age',
STNT_SEX as 'sex'
FROM TB_SAMP_STUDENT
</select>
</mapper>
-
7 : id 설정, return 객체 설정
-
9 ~ 12 : as문을 통해 클래스의 변수명과 맞춰줌.
<br/>
<br/>
<span style="color:#2980b9">studentDao.java
@Repository
public class StudentDao {
final static String namespace = "com.cglee079.sample.mapper.StudentMapper";
@Autowired
private SqlSessionTemplate sqlSession;
public List<StudentVo> list(){
return sqlSession.selectList(namespace + ".list");
}
}
-
3 : studentMapper.xml에 정의된 namespace
-
6 : dao-context.xml에 정의된 bean
-
9 : namespace + "." + id 로 쿼리 호출
<br/>
<br/>
<span style="color:#2980b9">StudentController.java
@Controller
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
List<StudentVo> students = studentService.list();
model.addAttribute("students", students);
return "home";
}
}
- 10 : 프론트 단으로 전달.
<br/>
<br/>
<span style="color:#2980b9">home.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
#
Student List.
<br/>
<table>
<tr>
<td>ID</td>
<td>Name</td>
<td>Age</td>
<td>Sex</td>
</tr>
<c:forEach var="student" items="${students}">
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.age}</td>
<td>${student.sex}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
- 15 : jstl forEach 이용
<br/>
<br/>
<span style="color:#000000">결과
<img alt="" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/EZEDH9181224235518.PNG" style="border-style:solid; border-width:1px; width:360px">
<br/>
<span style="color:#000000">MyBatis 여러 사용법을 공부해보자.
위의 예제는 하나의 쿼리문에 대해 진행하여 기본적인 사용법을 설명하였다.
다음은 여러가지 사용법에 대해서, java코드와 mapper 설정 파일을 나열한다.
<br/>
<em>#INSERT</em>
<span style="color:#2980b9">studentDao.java
public boolean insert(StudentVo student){
return sqlSession.insert(namespace + ".insert", student) == 1;
}
<br/>
<span style="color:#2980b9">studentMapper.xml
<insert id="insert">
INSERT INTO TB_SAMP_STUDENT
VALUES(#{id}, #{name}, #{age}, #{sex})
</insert>
<br/>
<em>#DELETE</em>
<span style="color:#2980b9">studentDao.java
public boolean delete(int id){
return sqlSession.delete(namespace + ".delete", id) == 1;
}
<br/>
<span style="color:#2980b9">studentMapper.xml
<delete id="delete" parameterType="Integer">
DELETE FROM TB_SAMP_STUDENT
WHERE STNT_ID = #{id}
</delete>
<br/>
<br/>
<em>#IF문</em>
<span style="color:#2980b9">studentDao.java
public List<StudentVo> list(String sex){
HashMap<String, Object> map = new HashMap<>();
map.put("sex", sex);
return sqlSession.selectList(namespace + ".list", map);
}
- 2 : mybatis가 타입인지 못하여 에러가 발생하는 경우가 있다. 다음과 같이 map형태로 처리하는 편법을 사용하면 해결 할 수 있다.
<br/>
<br/>
<span style="color:#2980b9">studentMapper.xml
<select id="list" parameterType="map" resultType="com.cglee079.sample.model.StudentVo">
SELECT
STNT_ID as 'id',
STNT_NAME as 'name',
STNT_AGE as 'age',
STNT_SEX as 'sex'
FROM TB_SAMP_STUDENT
<if test="sex != null">
WHERE STNT_SEX = #{sex};
</if>
</select>
<br/>