[Mybatis] 초기 설정 및 xml 파일 설정

김승현·2021년 12월 30일
3

Framework

  • 일련의 클래스 묶음이나 뼈대, 틀을 제공하는 라이브러리를 구현해 놓은 것
    • 코드를 구현하는 개발시간 단축
    • 코드의 재사용성 증가

Framework의 종류

영속성 Framework

  • 정보에 대한 접근과 저장을 단순화 하는 라이브러리를 의미
  • 데이터의 CRUD를 다루는 클래스 및 설정 파일들을 라이브러리화 하여 구현한 프레임 워크
  • 종류: Mybatis, Hibernate

자바 Framework

  • Java EE를 통한 웹 어플리케이션 개발에 초점을 맞추어 필요한 요소들을 모듈화하여 제공하는 프레임 워크
  • 종류 : Spring Framework, Struts, Spring Boot

기능 및 지원 Framework

  • 특정 기능이나 업무 수행에 도움을 줄 수 있는 기능을 제공하는 프레임 워크
  • 종류 : Log4j, JUnit5



Mybatis

  • 데이터의 입력, 조회, 수정, 삭제(CRUD)를 보다 편하게 하기 위해 xml로 구조화하여 Mapper 설정 파일을 통해서 JDBC를 구현한 영속성 프레임 워크

    • mybatis-config.xml
      • mybatis에서 사용될 DB를 연동하기 위한 설정값들과 mapper.xml을 등록하기 위한 xml
    • mybatis-mapper.xml
      - mybatis에서 사용될 SQL 구문을 담고 있는 xml

초기 설정

1. xml 환경 설정

2. Mybatis 라이브러리 다운 및 연동

3. Source Folder 생성 및 xml 파일 생성

  • xml 파일 생성
    • XML File > 이름 설정 > Create XML file from a DTD file > select XML Catalog entry > 1번에서 설정한 Key, URI 선택
    • 설정 성공시 Root element에 선택한 것이 나타난다.

4. xml 작성

  • mabatis-config.xml
    • typeAliases: 매칭할 mapper의 sql태그의 parmeter Type 별칭 설정
      • mapper의 sql 태그의 type(parmeter Type)을 alias로 설정
    • environments : DB 연결 설정
    • mappers : mapper.xml 파일 연결
      • mapper.xml 경로를 resourse로 연결
<?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>
	<!--mapper에서 매칭할 parmeter Type 별칭 설정-->
	<typeAliases>
		<typeAlias type="kr.or.iei.student.model.vo.Student" alias="student"/>
	</typeAliases>
	
	
	<environments default="development">
	
		<!-- environment id를 구분하여 연결할 DB를 여려개 구성할 수 도 있음 -->
		<environment id="development">
			<transactionManager type="JDBC"/>
				<dataSource type="POOLED">
					<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
					<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
					<property name="username" value="mybatis"/>
					<property name="password" value="mybatis"/>
				</dataSource>
		</environment>
		
	</environments>
	
	<mappers>
		<mapper resource="/student/student-mapper.xml"/> 
	</mappers>
	
	
</configuration>



  • mabatis-mapper.xml

    • mapper 태그의 namespace 속성 설정

    • sql문을 담은 태그 설정

      • id 속성 설정

      • parameterType 속성 설정

        • 패키지 포함 클래스 풀네임으로 설정
        • 단, config 파일에서 별칭 설정(typeAliases) 하였다면 별칭 이용 가능
        • 자바 타입의 내장된 별칭 사용 가능(대소문자 구분)
          • String → string
          • Integer → int, integer
          • Map → map
          • HashMap → hashmap
          • Collection → collection
          • ArrayList → arraylist
      • 가져오는 파라미터값 설정: ${ } 형태와 #{ } 형태를 이용

        • ${ } : 데이터에 따른 ‘ ‘ (문자열) 처리를 해주지 않는다 - Statement방식
        • #{ } : 자동으로 데이터 타입 처리 - PreparedStatement (위치홀더 방식)
          • 단일 데이터 : #{_parameter}(사실 아무거나 써도 상관 없음)
          • 다중 데이터 : map 이나 vo 활용
      • 추후 DAO에서 (namespace.id , [parameterType] ) 를 이용하여 연결함

<?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="mybatis">
  
  <insert id="studentInsert">
  	INSERT INTO STUDENT VALUES(student_seq.nextval, '김말똥','01022223333','mal@naver.com','서울시 양천구',default)
  </insert>
  
  
  <insert id="studentInsertValue" parameterType="student">
  	INSERT INTO STUDENT VALUES(student_seq.nextval, #{studentName},#{studentTel},#{studentEmail},#{studentAddr},default)
  </insert>
  
  
</mapper>

5. Service 클래스에서 Sqlsession 객체를 이용하여 DB 연결

  • getSqlSession 메소드 생성

  • 팩토리 패턴 이용하여 객체 생성

    • 특정 객체를 생성하기 위한 팩토리 생성 후, 해당 특정 객체 생성하는 방법

    1) InputStream 객체 생성 : config.xml 파일의 위치인 resource를 통하여 생성

    • InputStream is = Resources.getResourceAsStream(resource);

    2) SqlSessionFactoryBuilder 객체 생성

    • SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

    3) SqlSesionnFactory 객체 생성 : SqlSessionFactoryBuilder 객체, InputStream 객체 이용

    • SqlSessionFactory factory = builder.build(is);

    4) SqlSession 객체 생성 후 리턴

    • SqlSession session= factory.openSession(false);
    • openSession 매소드의 인자값
      • true 혹은 빈 값 : AutoCommit 활성화
      • false : AutoCommit 비활성화
	// mybatis 에서는 DB에 연동하는 Connection객체를 SqlSession이라 부른다.
	private SqlSession getSqlSession() {
		// getSqlSession의 역할
		// XML 파일을 연결하여 XML 파일 정보를 바탕으로 DB와 연결하고, 해당 Connection(SqlSession)을 리턴하는 역할

		SqlSession session = null;
		String resource = "/mybatis-config.xml";

		try {
			InputStream is = Resources.getResourceAsStream(resource);

			// SqlSession을 생성하려면 Mybatis에서는 팩토리 패턴이라는 것을 사용해서 객체를 만듭니다.
			// 팩토리 패턴이라는 것은 바로 생성하는게 아니라 특정 객체를 셍성하기 위한 팩토리를 먼저 만들고,
			// 그 뒤에 해당 특정 객체를 생성하는 방법

			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			SqlSessionFactory factory = builder.build(is);

			session = factory.openSession(false);
			// openSession 이라는메소드는 세션을 가져오는 메소드
			// 세션을 생성하고 가져올때,
			// 인자 값 true 혹은 빈 인자값 : AutoCommit이 활성화된 상태
			// 인자 값 false: AutoCommit을 비활성화된 상태

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return session;
	}



index.jsp

	<h1>Mybatis 테스트</h1>
	<a href="/student/mybatis1.do">1. 학생 정보 추가하기 (입력 NO)</a><br>
	<hr>
	<h3>2. 입력한 학생정보를 DB에 저장하는 로직 처리하기</h3>
	<form action="/student/mybatis2.do" method="post">
		이름 : <input type="text" name="studentName"/><br>
		전화번호 : <input type="text" name = "studentTel"><br>
		이메일 : <input type="text" name = "studentEmail"><br>
		주소 : <input type="text" name = "studentAddr"><br>
		<input type="submit" value="전송"><br>
	</form>

MybatisTest1Servlet.java

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 현재 예제 코드는 Mybatis에 대한 동작원리 및 개념을 이해하기 위한 실습
		// insert라 하더라도 입력 받은 것은 없다(기본 정적 데이터 저장 처리)

		StudentService sService = new StudentService();

		int result = sService.insertStudent();

		if (result > 0) {
			System.out.println("insert 로직 처리 성공");
		} else {
			System.out.println("insert 로직 처리 실패");
		}

	}

MybatisTest2Servlet.java

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
		String studentName = request.getParameter("studentName");
		String studentTel = request.getParameter("studentTel");
		String studentEmail = request.getParameter("studentEmail");
		String studentAddr = request.getParameter("studentAddr");

		Student s = new Student();
		s.setStudentName(studentName);
		s.setStudentTel(studentTel);
		s.setStudentEmail(studentEmail);
		s.setStudentAddr(studentAddr);

		StudentService sService = new StudentService();
		int result = sService.insertStudent(s);

		if (result > 0) {
			System.out.println("입력받아서 처리한 결과 : 성공");
		} else {
			System.out.println("입력받아서 처리한 결과 : 실패");
		}

	}

StudentService.java

package kr.or.iei.student.model.service;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import kr.or.iei.student.model.dao.StudentDAO;
import kr.or.iei.student.model.vo.Student;

public class StudentService {

	private StudentDAO sDAO = new StudentDAO();

	// mybatis 에서는 DB에 연동하는 Connection객체를 SqlSession이라 부른다.
	private SqlSession getSqlSession() {
		// getSqlSession의 역할
		// XML 파일을 연결하여 XML 파일 정보를 바탕으로 DB와 연결하고, 해당 Connection(SqlSession)을 리턴하는 역할

		SqlSession session = null;
		String resource = "/mybatis-config.xml";

		try {
			InputStream is = Resources.getResourceAsStream(resource);

			// SqlSession을 생성하려면 Mybatis에서는 팩토리 패턴이라는 것을 사용해서 객체를 만듭니다.
			// 팩토리 패턴이라는 것은 바로 생성하는게 아니라 특정 객체를 셍성하기 위한 팩토리를 먼저 만들고,
			// 그 뒤에 해당 특정 객체를 생성하는 방법

			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			SqlSessionFactory factory = builder.build(is);

			session = factory.openSession(false);
			// openSession 이라는메소드는 세션을 가져오는 메소드
			// 세션을 생성하고 가져올때,
			// 인자 값 true 혹은 빈 인자값 : AutoCommit이 활성화된 상태
			// 인자 값 false: AutoCommit을 비활성화된 상태

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return session;
	}

	public int insertStudent() {

		// getSqlSession 메소드를 호출하여 DB와 연동된 SqlSession값을 가져와함
		SqlSession session = getSqlSession();

		int result = sDAO.insetStudent(session);

		if (result > 0) {
			session.commit();
		} else {
			session.rollback();
		}

		session.close();

		return result;
	}

	public int insertStudent(Student s) {

		SqlSession session = getSqlSession();

		int result = sDAO.insetStudent(session, s);

		if (result > 0)
			session.commit();
		else
			session.rollback();

		session.close();

		return result;

	}

}

StudentDAO

package kr.or.iei.student.model.dao;

import org.apache.ibatis.session.SqlSession;

import kr.or.iei.student.model.vo.Student;

public class StudentDAO {

	public int insetStudent(SqlSession session) {

		// int result = session.insert("mybatis.studentInsert");
		// return result;

		// student-mapper.xml의 mapper 태그 namespace 값과 해당 insert태그 id 값으로 연결
		return session.insert("mybatis.studentInsert");
	}

	public int insetStudent(SqlSession session, Student s) {

		return session.insert("mybatis.studentInsertValue", s);
	}

}

Student.java

package kr.or.iei.student.model.vo;

import java.sql.Date;

public class Student {

	private int studentNo;
	private String studentName;
	private String studentTel;
	private String studentEmail;
	private String studentAddr;
	private Date regDate;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(int studentNo, String studentName, String studentTel, String studentEmail, String studentAddr,
			Date regDate) {
		super();
		this.studentNo = studentNo;
		this.studentName = studentName;
		this.studentTel = studentTel;
		this.studentEmail = studentEmail;
		this.studentAddr = studentAddr;
		this.regDate = regDate;
	}

	public int getStudentNo() {
		return studentNo;
	}

	public void setStudentNo(int studentNo) {
		this.studentNo = studentNo;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public String getStudentTel() {
		return studentTel;
	}

	public void setStudentTel(String studentTel) {
		this.studentTel = studentTel;
	}

	public String getStudentEmail() {
		return studentEmail;
	}

	public void setStudentEmail(String studentEmail) {
		this.studentEmail = studentEmail;
	}

	public String getStudentAddr() {
		return studentAddr;
	}

	public void setStudentAddr(String studentAddr) {
		this.studentAddr = studentAddr;
	}

	public Date getRegDate() {
		return regDate;
	}

	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}

}
profile
개발자로 매일 한 걸음

0개의 댓글