초보 개발자의 기록

MyBatis? 본문

MyBatis

MyBatis?

bambinodeveloper 2020. 12. 11. 01:54
728x90

RIA(Rich Internet Application) :

웹 애플리케이션의 장점은 유지하면서 기존 웹 브라우저 기반 인터페이스의 단점인 늦은 응답 속도, 데스크톱 애플리케이션에 비해 떨어지는 조작성 들을 개선하기 위한 기술의 통칭( 웹의 한계를 뛰어넘음)

웹의 새로고침 없이 마치 응용프로그램처럼 구현되는 류의 프로그램

 

-마이플랫폼(Miplatform): 국내 유일의 유무선 통합 UI 개발/운용 환경

 

-마이바티스(MyBatis) : 자바 퍼시스턴스 프레임워크의 하나로 XML서술자나 애너테이션(annotation) 을 사용하여

                              저장프로시저나 SQL문으로 객체들을 연결시킨다

                              IBatis의 포그이며, 원 개발자들이 포함된 팀에 의해 유지보수된다.

                              JDBC로 처리하는 상당부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.

                              매핑(Mapping)? sql문과 VO 자동매칭 

                              기술만 달라지고, VO,DAO 는 존재해야함

 

mybatis.org/mybatis-3/ko/getting-started.html#

 

MyBatis – 마이바티스 3 | 시작하기

Copyright © 2009–2020MyBatis.org. .

mybatis.org

이클립스이용 -아래 두가지 eclipse Marketplace에서 install 

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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="org.mariadb.jdbc.Driver"/>
        <property name="url" value="jdbc:mariadb://localhost:3307/db1202"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
  </environments>
  
  <!--매퍼들의 위치 등록  -->
  <mappers>
    <mapper resource="mybatis/config/DeptMapper.xml"/>
  </mappers>

	
</configuration>

 

MyBatisManager.java

자바코드와 상관성이 없기때문에 자바가 xml파일을 읽어들이기 위해서는 fileStream이 필요함

SqlSessionFactory :SqlSession인스턴스 얻기위한 팩토리 - 다른곳에서 사용할 수 있도록 getter생성

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*
  DB접속 정보 및 메퍼들에 대한 위치가 지정된 마이바티스의 설정파일을 읽어보자
 * */

package db;

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

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

public class MybatisManager {
	private SqlSessionFactory sqlSessionFactory; //SqlSession의 인스턴스를 얻기위한 팩토리 객체

	public MybatisManager() {
		String resource = "mybatis/config/config.xml";
		InputStream inputStream;
		
		try {
			inputStream = Resources.getResourceAsStream(resource);
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			System.out.println(sqlSessionFactory);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}

	public static void main(String[] args) {
		new  MybatisManager();
	}
}

MariaDB:  db1202 dept table을 이용하여 CRUD수행

DeptMapper.xml 

namespace?

패키지명, 해당 VO관련되도록 적어줌

네임스페이스은 인터페이스 바인딩을 가능하게 한다.

네임스페이스을 사용하고 자바 패키지의 네임스페이스을 두면 코드가 깔끔해지고 마이바티스의 사용성이 크게 향상됨

<?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.config.Dept">
	<!--
	개발자는 mybatis를 이용할 경우, 자바코드에서 쿼리문을 작성하지 않으며,
	수많은 jdbc관련 코드 또한 작성할 필요가 없고, 오직 쿼리문에만 집중하면 된다.
	-->
	
	<!--모든 글 가져오기-->
	<select id="selectAll" resultType="emp.model.Dept">
		SELECT * FROM dept ORDER BY deptno ASC
	</select>
	
	<!--한건가져오기-->
	<select id="select" parameterType="int" resultType="emp.model.Dept">
		SELECT * FROM dept WHERE deptno=#{deptno}
	</select>
	
	<!--글 등록 -->
	<insert id="insert" parameterType="emp.model.Dept">
		INSERT INTO dept (dname, loc) VALUES(#{dname}, #{loc})
	</insert>
	
	<!--한건 수정하기-->
	<update id="update" parameterType="emp.model.Dept">
		UPDATE dept SET dname=${dname}, loc=#{loc} WHERE deptno=#{deptno}
	</update>
	
	<!--삭제하기-->
	<delete id="delete" parameterType="int">
		DELETE FROM dept WHERE deptno=#{deptno}
	</delete>
</mapper>

모든 글 가져오기

<select id="select" resultType="어디에 담을것인지? VO의 위치">

여러건인데 왜 VO에 담는가? ArrayList가 아닌지? List는 내부적으로 숨겨져있음

 

 

parameterType="자료형(int= java.lang.Integer)

#{파라미터명}

Dept.java

package emp.model;

public class Dept {
	private int deptno;
	private String dname;
	private String loc;
	
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
}

DeptDAO.java

SqlSessionFactory 에서 SqlSession 만들기 :

          SqlSessionFactory 이름에서 보듯이 SqlSession 인스턴스를 만들수 있다.

          SqlSession 은 데이터베이스에 대해 SQL명령어를 실행하기 위해 필요한 모든 메소드를 가지고 있다.

           그래서 SqlSession 인스턴스를 통해 직접 SQL 구문을 실행할 수 있다. 

/*
 지금까지는 DAO의 코드 기술을 JDBC로 이용하였기 때문에 쿼리문보다 그 외의 코드가 더 장황했었다.
 따라서, 이번 DAO에서는 mybatis 프레임웍을 도입하여, 코드를 보다 간결하게 작성해보겠다.
*/
package emp.model;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import db.MybatisManager;

public class DeptDAO {
	//DAO에서 SQL문이 들어있는 xml을 호출하자! 
	//이때, 어떤 쿼리수행을 원하는지를 구분하기 위해서는 
	//xml태그에 부여한 id를 이용하면 된다.
	//xml태그를 호출하기 위해서는 mybatis의 SqlSession이 필요하고,
    //현재는 MyBatisManager 클래스의 멤버로두었다.
	MybatisManager manager = new MybatisManager();
	SqlSessionFactory factory;
	
	public DeptDAO() {
		factory = manager.getSqlSessionFactory();
	}
	
	//모든 데이터 가져오기 
	public List selectAll() {
		SqlSession session = factory.openSession(); //쿼리문 수행객체 생성
		return session.selectList("mybatis.config.Dept.selectAll");
	}
}

list.jsp

<%@page import="emp.model.Dept"%>
<%@page import="java.util.List"%>
<%@page import="emp.model.DeptDAO"%>
<%@ page contentType="text/html;charset=utf-8"%>
<%
	//DAO이용하여 부서 정보 출력해보자
	DeptDAO dao = new DeptDAO();
	List<Dept> list = dao.selectAll();
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
</style>
<script>
</script>
</head>
<body>
<%for(int i=0; i<list.size(); i++){ %>
	<%Dept dept =list.get(i);%>
	부서번호<%=dept.getDeptno() %>, 부서명<%=dept.getDname() %>, 위치<%=dept.getLoc() %><br>
<%} %>
</body>
</html>

결과출력>


 

jenkwon92 - Overview

jenkwon92 has 9 repositories available. Follow their code on GitHub.

github.com

 

728x90
반응형