- Develop OS : Windows10 Ent, 64bit - WEB/WAS Server : Tomcat v9.0 - DBMS : MySQL 5.7.29 for Linux (Docker) - Language : JAVA 1.8 (JDK 1.8) - Framwork : Spring 3.1.1 Release - Build Tool : Maven 3.6.3 - ORM : Mybatis 3.2.8 |
Mybatis 연동 및 구조와 어노테이션 사용법은 이전글을 참조하시면 됩니다.
[Spring MVC/- 기본 문법] - 스프링, Mybatis - MySQL 연동 [1/2]
[Spring MVC/- 기본 문법] - @Resource, @Inject, @Autowired 사용 (자동 의존성 주입)
[Spring MVC/- 기본 문법] - @Repository, @Service 어노테이션
그리고 Mapper 인터페이스를 사용한 Mabatis 사용법은 다음글 참조하시면 됩니다.
[Spring MVC/- 기본 문법] - 스프링, Mybatis, MySQL_사용법(Mapper 인터페이스) [3/4]
1. Mybatis 설정 파일 작성
SqlSessionFactoryBean 클래스가 참조할 설정 파일을 먼저 작성합니다. 가장 기본적으로 VO(DTO) 객체를 등록해줍니다. 클래스를 찍어서 alias로 등록해주면 됩니다. alias는 앞으로 VO 객체를 지칭할 때 사용됩니다.
<?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>
<typeAliases>
<typeAlias alias="UserVO" type="com.hsweb.springweb.UserVO" />
</typeAliases>
</configuration>
package com.hsweb.springweb;
public class UserVO {
private String user_id;
private String user_pw;
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getUser_pw() {
return user_pw;
}
public void setUser_pw(String user_pw) {
this.user_pw = user_pw;
}
}
2. Mapper 파일 작성
SQL 쿼리문을 관리할 Mapper 파일입니다. 여러 개로 분리해서 사용해도 됩니다. 일단 기본적인 쿼리문을 작성해보겠습니다. namespapce는 파일마다 id가 겹칠 경우를 대비한 구분자입니다. 편한대로 지정해주면 됩니다.
* select 쿼리
- <select> 태그 사용
- id : 호출할 쿼리문 명칭
- parameterType : 동적으로 변수를 받을 때 해당 변수의 타입 지정
- resultType : 결과로 받을 VO 객체 (Mybatis 설정 파일에 기입한 alias 이름)
- #{value} : 호출될 때 받은 변수를 ParameterType에서 지정한 타입으로 넣어줌
<mapper namespace="userDB">
<!-- select 쿼리 (1개) -->
<select id="selectUser" parameterType="string" resultType="UserVO">
select * from user_info where user_id=#{value}
</select>
<!-- select 쿼리 (ALL) -->
<select id="selectUserAll" resultType="UserVO">
select * from user_info;
</select>
* insert / update / delete 쿼리
- <update>, <insert>, <delete> 태그 사용
- 반환받을 결과가 없으므로 resultType 생략
- 동적 변수가 여러개라면 VO 객체를 파라미터로 주고, #{value}에 필드명과 동일하게 value 값을 부여
- resultType 지정 불필요
<!-- insert 쿼리 -->
<insert id="insertUser" parameterType="UserVO">
insert into user_info values(#{user_id}, #{user_pw})
</insert>
<!-- update 쿼리 -->
<update id="updateUser" parameterType="userVO">
update user_info set user_pw=#{user_pw} where user_id=#{user_id}
</update>
<!-- delete 쿼리 -->
<delete id="deleteUser" parameterType="String">
delete from user_info where user_id=#{value}
</delete>
</mapper>
3. 코드에서 쿼리 수행
먼저 DB작업을 수행할 DAO 클래스를 하나 만들어주면서 @repository 어노테이션을 통해 루트 컨테이너의 빈(Bean) 객체로 등록해줍니다. 그리고 SqlSessionTemplate 객체를 하나 만들어서 역시 어노테이션을 통해 자동 의존성 주입을 받습니다. 혹시 이 부분이 헷갈리시는 분은 윗쪽의 링크글들을 참조하시면 됩니다.
package com.hsweb.springweb;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
@Repository("userDAO")
public class UserDAO {
@Resource(name="sqlSessoinTemplate")
private SqlSessionTemplate session;
}
* select 쿼리 실행
- 결과 데이터가 1개인 경우 : resultType selectOne("namespace.id", parameter)
- 결과 데이터가 1개 이상인 경우 : List<resultType> select List("namespace.id", parameter)
그밖에도 Map 타입으로 받을 수도 있고 몇 가지가 더 있습니다. 'resultType, namesapce, id'는 mapper 파일에 기입한 정보를 그대로 붙여넣기해서 쓰면 됩니다.
<!-- select 쿼리 (1개) -->
<select id="selectUser" parameterType="string" resultType="UserVO">
select * from user_info where user_id=#{value}
</select>
<!-- select 쿼리 (ALL) -->
<select id="selectUserAll" resultType="UserVO">
select * from user_info;
</select>
package com.hsweb.springweb;
import java.util.List;
import javax.annotation.Resource;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
@Repository("userDAO")
public class UserDAO {
@Resource(name="sqlSessoinTemplate")
private SqlSessionTemplate session;
// 1개만 select
public UserVO select(String id) {
UserVO user = session.selectOne("userDB.selectUser", id);
return user;
}
// 여러 개 select
public List<UserVO> selectAll() {
List<UserVO> userList = session.selectList("userDB.selectUserAll");
return userList;
}
}
잘 되는지 테스트해보면 정상적으로 쿼리가 작동하는 것을 확인할 수 있습니다.
package com.hsweb.springweb;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "/board")
public class HomeController {
// 루트 컨테이너에서 DAO 객체를 가져와 저장
@Resource(name = "userDAO")
private UserDAO dao;
// "/list" URI에 대한 요청 처리
@RequestMapping(value = "/list")
public String home() {
// 1개만 검색
UserVO vo1 = dao.select("codevang");
System.out.println("1개 검색" + vo1.getUser_id() + " : "
+ vo1.getUser_pw());
// 1개 이상 검색
List<UserVO> vo2 = dao.selectAll();
for(int i = 0; i < vo2.size(); i++) {
System.out.println("여러개 검색" + vo2.get(i).getUser_id()
+ " : " + vo2.get(i).getUser_pw());
}
return "/board/list";
}
}
* insert / update / delete 쿼리
리턴값이 없다는 것 외에는 select와 사용 방법이 동일합니다. mapper 파일에 작성한 쿼리위치와, 파라미터로 설정한 VO 객체 또는 변수만 잘 넣어주면 설정한 쿼리대로 실행시켜 줍니다. 트랜젝션 처리는 다음글에서 다루도록 하겠습니다.
<!-- insert 쿼리 -->
<insert id="insertUser" parameterType="UserVO">
insert into user_info values(#{user_id}, #{user_pw})
</insert>
<!-- update 쿼리 -->
<update id="updateUser" parameterType="userVO">
update user_info set user_pw=#{user_pw} where user_id=#{user_id}
</update>
<!-- delete 쿼리 -->
<delete id="deleteUser" parameterType="String">
delete from user_info where user_id=#{value}
</delete>
package com.hsweb.springweb;
import javax.annotation.Resource;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
@Repository("userDAO")
public class UserDAO {
@Resource(name="sqlSessoinTemplate")
private SqlSessionTemplate session;
// insert
void insertUser() {
UserVO vo = new UserVO();
vo.setUser_id("codevangDB");
vo.setUser_pw("P@ssw0rd");
session.insert("userDB.insertUser", vo);
}
// update
void updateUser() {
UserVO vo = new UserVO();
vo.setUser_id("codevang2");
vo.setUser_pw("testPassword");
session.update("userDB.updateUser", vo);
}
// delete
void deleteUser() {
session.delete("userDB.deleteUser", "codevangDB");
}
}
'▸Spring MVC > 기본 문법' 카테고리의 다른 글
스프링, Mybatis, MySQL_트랜잭션 처리 [4/5] (1) | 2020.03.22 |
---|---|
스프링, Mybatis, MySQL_사용법(Mapper 인터페이스) [3/5] (0) | 2020.03.22 |
스프링, Mybatis, MySQL_연동 및 설정 방법 [1/5] (2) | 2020.03.22 |
스프링 Restful 서비스(API)_API 구현(XML) [3/3] (0) | 2020.03.21 |
스프링 Restful 서비스(API)_API 구현(JSON) [2/3] (0) | 2020.03.20 |
댓글