[Mybatis 세팅] 웹 프로젝트 mybatis적용방법

2021. 3. 17. 00:18웹프로젝트/설정

728x90

Mybatis 다운로드 방법

 

1. github.com/mybatis 접속하여 아래와 같이 mybatis.jar 다운로드

 

 

 

 

 

 

 

 

2. 다운로드 된 mybatis.jar를 mybatis를 설정할 프로젝트에 추가해줌.

 

 

 


 

 

Mybatis 프로젝트 적용

 

Mybatis를 적용하기 전 프로젝트는 순수 Java JDBC가 적용된 웹프로젝트(dynamic web project)였음.

하지만, SPRING 적용전 공부삼아 mybatis 적용을 위해 설정해봄.

 

[JDBC 적용된 웹프로젝트]

 

1. TestInsert.java

public class TestInsert implements CommandAction{
	 private DataService service = DataService.getInstance();
	@Override
	public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
		DataProcess dataProc = new DataProcess();
		Connection conn = dataProc.getConnect(PropConfig.getPropString("DB_URL"), PropConfig.getPropString("DB_USER_ID"), PropConfig.getPropString("DB_USER_PW"));
		boolean queryRet = dataProc.InsertTabDocTitleData(conn);
		try {
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
 	}
 }

 

2. DataProcess.java

public class DataProcess {
	
    private String INSERT_TAB_DOC_TITLE_SQL = "insert into tab_doc_title(doc_key_num, doc_key_num_nm) values(?,?)";

    /**
    * 데이터베이스 연결
    * @param url
    * @return
    */
    public Connection getConnect(String url, String id, String pw) {
    
      //excel 테이블 추가
      public boolean InsertTabDocTitleData(Connection conn) {
		 PreparedStatement pstmt = null;
          ResultSet rs = null;
          int rowCnt = 0;

          try {

              //PDF 파일 정보를 Insert 한다.
              pstmt = conn.prepareStatement(INSERT_TAB_DOC_TITLE_SQL);
              System.out.println("pstmt1 : " +pstmt);

              pstmt.setString(1, (new SimpleDateFormat("yyyyMMddHHmmssSSS")).format(new Date()));	//문서 KEY
              pstmt.setString(2, "통합문서1");		//문서 이름

              rowCnt = pstmt.executeUpdate();

              Thread.sleep(10);
              conn.commit();

              return true;
          }
          catch(Exception e) {
              System.out.println(e.toString());
              logger.error(e.toString());
              try {
                  conn.rollback();
              } catch (SQLException e1) {
                  // TODO Auto-generated catch block
                  System.out.println(e1.toString());
                  logger.error(e1.toString());
              }

              return false;
          } finally {
              try {
                  if( rs != null ) {rs.close();}
                  if( pstmt != null ) {pstmt.close();}
                  if( conn != null ) {conn.close();}
              } catch(Exception e) {
                  throw new RuntimeException(e.getMessage());
              }
          }
      }
 }

 

 

 

 

[mybatis 적용된 웹프로젝트]

 

적용할 프로젝트에 mybatis.jar 있는지 확인 후 없으면, 다운로드 후 추가

 

1. TestInsert.java

public class TestInsert implements CommandAction{
	private DataService service = DataService.getInstance();
	@Override
	public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {

		service.insertList();
		return null;
	}
	
}

 

 

2. DataService.java

package com.tabula.cores;

import java.sql.SQLException;

public class DataService {
	private static DataService service;
     
    private DataDAO dao = DataDAO.getInstance();
     
    public static DataService getInstance(){
        if(service == null){
            service = new DataService();
        }
        return service;
    }
    
    public int insertList() {
        
        int result = 0;
		try {
			result = dao.insertList();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
         
        return result;
    }
}

 

 

3. DataDAO.java

SqlSession사용 후 finally{}구문에서 SqlSession 닫을 때 insert,update,delete 쿼리사용시에는 닫기 전 반드시 'sqlSession.commit' 해주어야 함. (안 해주면, 에러 발생없이 디비에 반영이 안됨) 

public class DataDAO {

	private static DataDAO dao;
	public static DataDAO getInstance() {
		if(dao == null){
            dao = new DataDAO();
        }
         
        return dao;
	}
	
	SqlSessionFactory sqlSessionFactory = SqlMapClient.getSqlSessionFactory();

	public int insertList() throws SQLException {
		int resultCnt = 0;
		
	    SqlSession sqlSession = sqlSessionFactory.openSession();
	 
	    try {
			String docKeyNum ="123";
			String docKeyNumNm = "통합문서23";
			Map<String,String> paramMap = new HashMap<String,String>();
	    	paramMap.put("docKeyNum",docKeyNum);
			paramMap.put("docKeyNumNm",docKeyNumNm);
			List<Map<String,String>> paramList = new ArrayList<Map<String,String>>();
			paramList.add(paramMap);
			resultCnt = sqlSession.insert("testsql.tabDocTitleInsert", paramList);
	    }catch(Exception e) {
	    	e.printStackTrace();
	    }finally {
	    	sqlSession.commit();
	        sqlSession.close();
	    }
	    return resultCnt;
	}
}

 

 

 

4.SqlMapClient.java

public class SqlMapClient {

	public static SqlSessionFactory sqlSessionFactory;
	  static{
	         
	        String resource = "com/tabula/properties/mybatisInfo.xml";
	        InputStream inputStream = null;
	         
	        try {
	            inputStream = Resources.getResourceAsStream(resource);
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	         
	        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	 
	    }
	     
	    public static SqlSessionFactory getSqlSessionFactory(){
	        return sqlSessionFactory;
	    }
}

 

 

5.mybatisInfo.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties resource="com/tabula/properties/db.properties"/>

	 	<environments default="development">
      	  <environment id="development">
				<transactionManager type="JDBC"/>
					<dataSource type="POOLED">
						<property name="driver" value="${DB_DRIVER}"/>
						<property name="url" value="${DB_URL}"/>
						<property name="username" value="${DB_USER_ID}"/>
						<property name="password" value="${DB_USER_PW}"/>
					</dataSource>
			</environment>
		</environments>
		<mappers>
			<mapper resource="com/tabula/properties/mybatisSql.xml"></mapper>
		</mappers>
</configuration>

 

 

6.db.properties

DB_URL=프로젝트에연결할 DB URL
DB_USER_ID=프로젝트에연결할 DB USER ID
DB_USER_PW=프로젝트에연결할 DB USER PW
DB_DRIVER=프로젝트에연결할 DB 

 

 

7. mybatisSql.xml

insert 파라미터로 List나 Map을 사용할 경우 foreach구문으로 세팅해주어야함.

<?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="testsql" >
    <insert id="tabDocTitleInsert" parameterType="java.util.List">
    	insert into tab_doc_title(
    		doc_key_num,
    	    doc_key_num_nm
       ) values(
    		 <foreach collection="list" item="value" index="idx" separator=",">
        		#{value.docKeyNum}
        		,#{value.docKeyNumNm}
  		    </foreach>
    	)
    </insert>
</mapper>      

 

 

 

 

 


 

 

참고

 

 

1. 참고로, 'insert'쿼리 사용시 나의 경우 DTO 세팅 없이 'insert'쿼리에 넘길 파라미터를 최종적으로 List를 사용해서 넘김.

List나 Array타입을 collection으로 설정할 수 있으며, 이 때 List나 Array데이터는 Map으로 타입이 변환되어 저장됨.

(근데, List로 넘길때는 타입이 Map이 아니면(String, int, ... 등등의 타입) List에 담을 타입을 Map으로 감싼 뒤에 List에 담아서 넘겨야만 정상적으로 실행가능한 것 같음.)

 

 

2. mybatis foreach문 지원태그

  • collection : 전달받은 인자. Lust or Array 형태만 가능
  • item : 전달받은 인자값을 alias명으로 대체
  • open : 구문이 시작될 때 삽입할 문자열
  • close : 구문이 종료될 때 삽입할 문자열
  • seperator : 반복되는 사이에 출력할 문자열
  • index : 반복되는 구문 번호. 0부터 순차적으로 증가

2-1. 배열 파라미터를 Map을 통해 넘겼을 경우

String[] userArray = {"1","2","3"}

/*DAO*/
public List<Members> getAuthUserList(String[] userArray) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("userArray",userArray);
		return sqlSession.selectList("getAuthUserList", map);
}

/*xml*/
<select id="getAuthUserList"  resultType="members">
  SELECT m.*,a.name FROM members AS m 
  JOIN authority AS a ON m.authority = a.authority
  WHERE m.authority IN
  <foreach collection="userArray" item="arr" open="(" close=")" separator=",">
   #{arr}
  </foreach>
  ORDER BY m.authority;
</select>

 

2-2. 배열 파라미터를 직접 넘겼을 경우

String[] userArray = {"1","2","3"}

/*DAO*/
public List<Members> getAuthUserList(String[] userArray) {
		return sqlSession.selectList("getAuthUserList", userArray);
}

/*xml*/
<!-- collection을 반드시 'array'로 작성하여야 함 -->
<select id="getAuthUserList"  resultType="members">
  SELECT m.*,a.name FROM members AS m 
  JOIN authority AS a ON m.authority = a.authority
  WHERE m.authority IN
  <foreach collection="array" item="arr" open="(" close=")" separator=",">
   #{arr}
  </foreach>
  ORDER BY m.authority;
</select>

 

 

2-3. 리스트 Map을 통해 넘길 경우

List<Members> chkList = userService.getUserList();

/*DAO*/
public List<Members> getListTest(List<Members> chkList) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("chkList",chkList);
		return sqlSession.selectList("getListTest", map);
}

/*xml*/
<!-- collection을 반드시 넘겨주는 리스트 변수 값과 동일하게 작성하여야 함 -->
<select id="getListTest" resultType="members">
  SELECT m.*,a.name FROM members AS m 
  JOIN authority AS a ON m.authority = a.authority
  WHERE m.authority IN
  <foreach collection="chkList" item="item" open="(" close=")" separator=",">
   #{item.authority}
  </foreach>
  ORDER BY m.authority;
</select>

 

2-4. 리스트 직접 넘길 경우

List<Members> chkList = userService.getUserList();

/*DAO*/
public List<Members> getListTest(List<Members> chkList) {
		return sqlSession.selectList("getListTest", chkList);
}

/*xml*/
<!-- collection을 반드시 'list'로 작성해야함 -->
<select id="getListTest" resultType="members">
SELECT m.*,a.name FROM members AS m 
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
 #{item.authority}
</foreach>
ORDER BY m.authority;
</select>

 

 

 

 

참고 :

atoz-develop.tistory.com/entry/JAVAWEB-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-MyBatis-%EC%84%B8%ED%8C%85-%EB%B0%8F-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

 

[JAVA/WEB] 웹 프로젝트에 MyBatis 세팅 및 적용하기

관련 글 - MyBatis 설정 파일 - SQL Mapper 작성 방법 - MyBatis 설정 파일 작성 방법 [JAVA/WEB] 웹 프로젝트에 MyBatis 세팅 및 적용하기 환경 및 버전 정보 IntelliJ IDEA 2019.3 Ultimate, JDK 11, Tomcat 9,..

atoz-develop.tistory.com

blog.naver.com/PostView.nhn?blogId=onnyang&logNo=10180243634

 

MyBatis foreach 사용법(list 나 array 타입 select 조건 관련)

http://yousik.blogspot.kr/2012/04/mybatis-foreach.html

java119.tistory.com/85

 

[MyBatis] 동적 쿼리 foreach문 문법 총 정리

시작하기에 앞서 참고 자료 *ibatis iterate문 지원 태그 property : 파라미터명 prepend : 쿼리로 쓰일 문자 open : 구문이 시작될때 삽입할 문자열 close : 구문이 종료될때 삽입할 문자열 conjunction :..

java119.tistory.com

 

728x90