DB의 정보들을 관리하기위해 myBatis를 아래와 같이 적용하였다.
1. myBatis관련 라이브러리를 추가하기위해 maven의 pom.xml에 아래의 내용 등
2. DB연결정보를 /프로젝트명/src/main/resources/db.properties 에 추가
driver=org.gjt.mm.mysql.Driver
url=jdbc:mysql://접속IP/데이터베이스명
username=DB계정아이디
password=DB계정패스워드
3. myBatis Config파일 생성(/프로젝트명/src/main/resources/config/mybatis/mybatis-config.xml)
config파일은 어짜피 SqlSessionManager클래스를 만들어서 명시하니 임의로 이름을 정해줘도 상관없다(나의 경우는 mybatis-config.xml로 )
- cacheEnabled : 설정에서 각 mapper 에 설정된 캐시를 전역적으로 사용할지 말지에 대한 여부
: true | false
: default : true
- lazyLoadingEnabled : 늦은 로딩을 사용할지에 대한 여부.
사용하지 않는다면 모두 즉시 로딩할 것이다.
: true | false
: default : true
- aggressiveLazyLoading : 활성화 상태로 두게 되면 늦은(lazy) 로딩 프로퍼티를 가진 객체는
호출에 따라 로드될 것이다. 반면에 개별 프로퍼티는 요청할때 로드된다.
: true | false
: default : true
- multipleResultSetsEnabled : 한개의 구문에서 여러개의 ResultSet 을 허용할지의 여부
(드라이버가 해당 기능을 지원해야 함)
: true | false
: default : true
- useColumnLabel 칼럼명 대신에 칼럼라벨을 사용. 드라이버마다 조금
다르게 작동한다. 문서와 간단한 테스트를 통해 실제
기대하는 것처럼 작동하는지 확인해야 한다.
: true | false
: default : true
- useGeneratedKeys : 생성키에 대한 JDBC 지원을 허용. 지원하는
드라이버가 필요하다. true 로 설정하면 생성키를
강제로 생성한다. 일부 드라이버(예를들면, Derby)에서는 이 설정을 무시한다.
: true | false
: default => false
- autoMappingBehavior : MyBatis 가 칼럼을 필드/프로퍼티에 자동으로
매핑할지와 방법에 대해 명시. PARTIAL은 간단한
자동매핑만 할뿐, 내포된 결과에 대해서는 처리하지
않는다. FULL 은 처리가능한 모든 자동매핑을 처리한다.
: NONE, PARTIAL, FULL
: default : PARTIAL
- defaultExecutorType : 디폴트 실행자(executor) 설정. SIMPLE 실행자는
특별히 하는 것이 없다. REUSE 실행자는
PreparedStatement 를 재사용한다. BATCH 실행자는
구문을 재사용하고 수정을 배치처리한다.
: SIMPLE, REUSE, BATCH
: default : SIMPLE
- defaultStatementTimeout : 데이터베이스로의 응답을 얼마나 오래 기다릴지를
판단하는 타임아웃을 셋팅
: 양수
: default : 셋팅되지않음(null)
==============================================
<?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>
<!-- db 정보 파일을 로드한다. -->
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="false" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25000" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>
<typeAliases>
<typeAlias alias="hMap" type="java.util.HashMap" />
<typeAlias alias="UsersVO" type="com.bccc.vo.UsersVO" />
</typeAliases>
<!-- db 연결 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- sql 맵퍼 -->
<mappers>
<mapper resource="config/mybatis/sqlmapper/commonMapper.xml" />
</mappers>
</configuration>
=======================================
4. SQL문을 관리할 Mapper 파일 생성(/프로젝트명/src/main/resources/config/mybatis/sqlmapper/commonMapper.xml)
Mapper 파일은 mybatis-config.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="sql.commonMapper">
<select id="selectUser" parameterType="String" resultType="UsersVO">
SELECT *
FROM USERS
WHERE USER_ID = #{user_id}
</select>
</mapper>
5. mybatis-config 설정을 읽어와 처리하는 SqlSessionManager 클래스파일 생성(/프로젝트명/src/main/java/com/bccc/common/SqlSessionManager.java)
package com.bccc.common;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionManager {
public static SqlSessionFactory sqlSession;
static {
String resource = "config/mybatis/mybatis-config.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(resource);
sqlSession = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSession() {
return sqlSession;
}
}
6. SQL로 조회된 데이터를 담을 Value Object 클래스 생성 (/프로젝트명/src/main/java/com/bccc/vo/UsersVO.java)
package com.bccc.vo;
public class UsersVO {
String user_seq="";
String user_id="";
String passwd="";
int user_level = 0;
String user_name="";
String tell_no="";
String cell_no="";
String email="";
String updt_date="";
String reg_date="";
public String getUser_seq() {
return user_seq;
}
public void setUser_seq(String user_seq) {
this.user_seq = user_seq;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public int getUser_level() {
return user_level;
}
public void setUser_level(int user_level) {
this.user_level = user_level;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getTell_no() {
return tell_no;
}
public void setTell_no(String tell_no) {
this.tell_no = tell_no;
}
public String getCell_no() {
return cell_no;
}
public void setCell_no(String cell_no) {
this.cell_no = cell_no;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUpdt_date() {
return updt_date;
}
public void setUpdt_date(String updt_date) {
this.updt_date = updt_date;
}
public String getReg_date() {
return reg_date;
}
public void setReg_date(String reg_date) {
this.reg_date = reg_date;
}
public String getData() {
String data = user_seq + "," +
user_id + "," +
passwd + "," +
user_name + "," +
tell_no + "," +
cell_no + "," +
email + "," +
updt_date + "," +
reg_date ;
return data;
}
}
7. 데이터를 관리할 DefaultDAO 클래스 생성(/프로젝트명/src/main/java/com/bccc/common/DefaultDAO.java)
내 경우는 session관리를 한곳에서 하기위해 DB를 컨트롤하는 유형을 DefaultDAO에 선언해두고
실제 서비스DAO클래스에서는DefaultDAO를 extends 해서 사용했다
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.bccc.vo.UsersVO;
public class DefaultDAO {
private SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
/**
* 생성자
*/
public DefaultDAO() {
// default constructor
}
/**
* 다수의 row 를 조회하여 반환
*
* @param sqlID namespace 를 포함한 sql ID
* @return 결과 데이터 리스트
*/
protected List queryForList(String sqlID, Map map) {
SqlSession session = sqlSessionFactory.openSession();
try {
return session.selectList(sqlID, map);
} catch (Exception e) {
session.rollback();
e.printStackTrace();
} finally {
session.close();
}
return null;
}
/**
* 특정VO객체에 단일데이터를 조회하여 반환
*
* @param sqlID namespace 를 포함한 sql ID
* @return 결과 데이터 리스트
*/
protected Object queryForVO(String sqlID, Map map) {
SqlSession session = sqlSessionFactory.openSession();
try {
return session.selectOne(sqlID, map);
} catch (Exception e) {
session.rollback();
e.printStackTrace();
} finally {
session.close();
}
return null;
}
}
8. DefaulDAO 클래스를 상속받은 일반 서비스 DAO클래스 생성(/프로젝트명/src/main/java/com/bccc/dao/MainDAO.java)
package com.bccc.dao;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.bccc.common.DefaultDAO;
import com.bccc.common.SqlSessionManager;
import com.bccc.vo.UsersVO;
public class MainDAO extends DefaultDAO{
private SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
public UsersVO getSelectUsers( String id) {
Map pMap = new HashMap();
pMap.put("user_id", id);
try {
UsersVO resultVO = (UsersVO)queryForVO("sql.commonMapper.selectUser",pMap);
return resultVO;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
9. 조회된 데이터 확인(/프로젝트명/src/main/java/com/bccc/controller/MainController.java)
단순데이터 확인을 위해 Service 클래스를 구현하지않고 바로 Control 클래스에서 DAO를 호출하여 데이터를 확인했음
package com.bccc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.bccc.common.DefaultController;
import com.bccc.dao.MainDAO;
import com.bccc.vo.UsersVO;
/**
* 메인화면 페이지 컨트롤러
*
* @author <a href="mailto:haengro@gmail.com">최행로</a>
* @version
* @since
* @created 2013. 8. 27.
*/
@Controller
public class MainController extends DefaultController {
/**
* 테스트 페이지 이동
*
* @return ModelAndView ModelAndView 객체
*/
@RequestMapping(value = "/index.do")
public String bcccMain2() {
MainDAO mainDAO = new MainDAO();
UsersVO resultVO = mainDAO.getSelectUsers("test");
System.out.println("result : " + resultVO.getData());
return "/index";
}
/**
* 메인 페이지 이동
*
* @return ModelAndView ModelAndView 객체
*/
@RequestMapping(value = "/main.do")
public ModelAndView bcccMain() {
ModelAndView mav = new ModelAndView();
MainDAO mainDAO = new MainDAO();
UsersVO resultVO = mainDAO.getSelectUsers("test");
System.out.println("result : " + resultVO.getData());
return mav;
}
}
'JAVA' 카테고리의 다른 글
[Java] #12. 자바 어노테이션(Annotation) (0) | 2021.02.06 |
---|---|
[java] 프로그래머스-완전탐색(모의고사) (0) | 2021.02.03 |
[Java] 기술면접 예상질문 (0) | 2021.02.02 |
[JAVA] #1.JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2021.01.30 |
ServletContext, HttpSession, HttpServletRequest 차이점 (0) | 2020.02.10 |