MyBatis

1.특징

  • java 의 SQL Mapper Framework
  • 다른 언어 버전도 존재

2.spring project 에서 MyBatis를 사용할 때 필요한 라이브러리

  • sping-jdbc, mybatis, mybatis-spring

3.spring 에서 데이터베이스를 사용할 때는 데이터베이스 접속 정보를 반드시 bean으로 만들어야 한다.

  • 코드로 직접 설정하는것은 안된다.

4.spring 에서 데이터베이스 접속정보를 저장하는 bean 생성

  • org.springframework.jdbc.datasource.DriverManagerDataSource 클래스의 bean을 생성
  • driverClassName 프로퍼티 : 데이터베이스 종류
  • url 프로퍼티 : 데이터베이스 접속 위치

  • username 프로퍼티 : 계정 설정

  • password 프로퍼티 : 비밀번호

username 과 password 는 입력하지 않아도 되는 경우가 있다.

5.오라클 사용 준비와 접속 확인

  • url : 211.183.6.60
  • username : user01~user30
  • password : usert30

1) java에서 오라클을 사용하려면 오라클 라이브러리를 다운로드 받아야 한다

  • pom.xml 에 작성
  • 오라클은 중앙 저장소에서 드라이버를 다운로드를 제공하지 않기 때문에 repository를 설정해야 한다.
    <!--  중앙 저장소 이외에서 다운로드 받아야 할 때 설정 : 다운로드 받는 서버 설정  -->
    <repositories>
        <repository>
            <id>codelds</id>
            <url>https://code.lds.org/nexus/content/groups/main-repo</url>
        </repository>
    </repositories>
  • dependency 안에 작성
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.3</version>
        </dependency>

2) 위 작업을 했는데 에러 발생한 경우 - 다운로드 받을 수 없다 라는 에러 임

<repository>
    <id>oracle</id>
    <name>ORACLE JDBC Repository</name>
    <url>http://maven.jahia.org/maven2</url> 
</repository>

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.2</version>
</dependency>
  • 여기까지 오라클 쓸 준비가 끝남

3) Spring Bean Configuration 파일을 추가하고 데이터베이스 접속정보를 작성

    <!--  spring 프로젝트에서 데이터 베이스를 사용할 때 필수 설정  -->
    <bean
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        id="dataSource">
        <property name="driverClassName"value="oracle.jdbc.driver.OracleDriver" />
        <property name="url"value="jdbc:oracle:thin:@192.168.0.107:1521:xe" />
        <property name="username" value="scott" />
        <property name="password" value="tiger" />
    </bean>

4) class 이름에 에러

  • 클래스 이름을 잘못 기재했거나 라이브러리가 다운로드 안된것
  • pom.xml 에 가서 클래스가 소속된 라이브러리의 의존성을 설정했는지 확인해보고 설정했는데도 에러가 나면 이것은 다운로드가 제대로 안되는 것이므로 버전을 변경해보고 m2 디렉토리를 삭제하고 다시 실행을 함.

  • pom.xml 파일에 spring-jdbc 라이브러리의 의존성을 설정

        <!-- spring에서 데이터베이스 사용할 때 사용할 라이브러리 의존성  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>

5) main 메소드를 소유한 클래스를 만들어서 데이터베이스 연결

6.Maven Project를 github에서 내려받은 경우에는 마우스 오른쪽을 클릭해서 [Maven] - [Update Project] 메뉴를 실행해야 합니다.

MyBatis 사용

1.java에서 MyBatis를 사용하는 방법

1) xml 을 이용하는 방법

2)인터페이스를 이용하는 방법

2.xml을 이용하는 방법

1) mybatis 환경 설정 파일을 생성 - 생략 가능

  • DTO 클래스의 패키지를 등록해서 mapper 파일에서 패키지이름을 작성하지 않고 DTO 클래스를 사용하거나 Map의 Key 이름과 데이터베이스의 컬럼이름 매핑등을 설정

2) mapper 파일을 생성하고 필요한 SQL을 작성

3) Spring 설정 파일에 SqlSession 클래스의 bean을 등록

4) Dao 클래스에 SqlSession을 주입받아서 SQL을 실행

실습

1.실습에 사용할 테이블과 샘플 데이터를 생성

CREATE TABLE goods(
    code number(6) PRIMARY KEY,
    name varchar2(50) NOT NULL,
    manufacture varchar2(50),
    price number(10)
);

INSERT INTO goods(code, name, manufacture, price)
values(1, '낙지', '목포', 8000);
INSERT INTO goods(code, name, manufacture, price)
values(2, '과메기', '포항', 20000);
INSERT INTO goods(code, name, manufacture, price)
values(3, '인삼', '금산', 200000);

COMMIT;

SELECT * FROM GOODS;

2.프로젝트에 테이블의 데이터와 매핑할 DTO 클래스 생성

//접근자 메소드와 toString 메소드를 만들어주는 어노테이션
@Data
public class Good {
    private int code;
    private String name;
    private String manufacture;
    private int price;
}

3.MyBatis 사용 설정

  • mybatis 와 mybatis-spring 라이브러리가 필요
  • pom.xml 파일에 아래의 의존성 추가
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>

4.MyBatis 환경 설정 파일

  • DTO 클래스의 패키지이름이나 Map의 컬럼 매핑 등을 설정
  • 루트 디렉토리에 mybatis-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>
    <typeAliases>
        <!-- sql 파일에서는 sqlmapper 패키지이름을 생략할 수 있음 -->
        <package name="sqlmapper"/>
    </typeAliases>
</configuration>

XML
1.데이터를 표현하는 파일
상단에 DTD(!DOCTYPE 태그)가 없음
개발자가 파싱해서 원하는 대로 사용

2.설정파일
상단에 DTD(!DOCTYPE 태그)가 있음
파일의 내용을 DTD에 설정한 곳에서 해석
정해진 규칙대로 코드를 작성

5. SQL Mapper 파일 생성

  • 실행할 SQL을 작성하는 파일

1) MyBatis 의 테이블의 자료형 매핑

number <-> Integer, Doble, Float, Byte, Short, Long, BigDecimal
char, varchar2, clob <->String
date <-> java.sql.Date, java.util.Date
time <-> java.sql.Time, java.util.Date
timestamp <-> java.sql.Timestamp
blob <-> byte[ ]

2) select 구문 작성

<select id="구별할 이름" resultType="결과 자료형" parameterType="매개변수 자료형">
    select
    from
    where
</select>
  • resultType은 select 절에 작성한 컬럼의 데이터를 전부 저장할 수 있는 자료형
    • select에서 하나의 컬럼만 가져오는 경우는 그 컬럼의 값을 저장할 수 있는 자료형
    • 여거래의 컬럼을 가져오는 경우는 java.util.Map 이나 DTO 클래스이름을 적어야함.
  • parameterType은 where 절에서 값을 나중에 결정하는 것들 전체를 저장할 수 있는 자료형
    • select에서는 생략되는 경우도 있다.
  • where 절에 parameter를 만들 때는 #{컬럼이름} 의 형태로 작성

3) insert, delete, update

<insert id="구별할이름" parameterType="매개변수 자료형">
    insert, update, delete 구문
</insert>

4) Spring Configuration 파일에 설정 파일 등록

<bean class="org.mybatis.spring.SqlSessionFatoryBean" id="sqlSessionFatory">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="환경설정파일경로"/>
    <property name="mapperLocation" value="sql 파일 경로"/>
</bean>

<bean class="org.mybatis.spring.sqlSessionTemplate" id="sqlSession">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

5) Dao 클래스에 sqlSession을 주입받아서 sql 메소드 호출

List<resultType> selectList("SQL id", 매개변수);
resultType selectOne("SQL id", 매개변수);
int insert("SQL id", 매개변수);     //insert 대신에 update, delete 사용해도 결과는 같음

실습

  • mapper 파일들을 저장할 mappers 디렉토리를 생성
  • mappers 디렉토리에 sql을 작성할 mapper 파일을 만들고 sql을 작성

  • good.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="good">
    <!-- goods 테이블의 모든 데이터를 읽어오는 SQL  -->
    <!-- resultType은 select 절의 컬럼들을 모두 저장할 수 있는 자료형  -->
    <!--  컬럼이 여러개 일때는 java.util.Map 아니면 DTO 클래스  -->
    <!-- select 에서 parameterType은 where 절에 대입할 데이터의 자료형  -->
    <select id="goodlist" resultType="Goods">
        select code, name, manufacture, price 
        from goods 
    </select>

    <!-- code를 가지고 하나의 데이터를 찾아오는 SQL -->
    <select id="gooddetail" resultType="Goods" parameterType="java.lang.Integer" >
        select code, name, manufacture, price 
        from goods 
        where code = #{code}  <!--  코드를 대입받아서 위에 4개를 찾아온다.  -->
    </select>

    <!--  goods테이블에 데이터를 삽입하는 SQL -->
    <insert id="goodinsert" parameterType="Goods">
        insert into goods(code, name, manufacture, price)
        values(#{code}, #{name}, #{manufacture}, #{price})
    </insert>

    <!-- goods테이블의 데이터를 수정하는  SQL -->
    <update id="goodupdate" parameterType="Goods">
        update goods
        set name=#{name}, manufacture=#{manufacture}, price=#{price}
        where code=#{code}
    </update>

    <!-- goods 테이블에서 ode를 이용해서 데이터를 삭제하는 SQL -->
    <delete id="gooddelete" parameterType="java.lang.Integer">
        delete goods
        where code=#{code}
    </delete>
</mapper>
  • Spring Bean Configuration 파일에 MyBatis를 사용할 수 있는 Bean 객체를 설정

  • 전체 데이터를 가져오기

package sqlmapper;

import org.apache.ibatis.session.SqlSession;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {

    public static void main(String[] args) {

        GenericXmlApplicationContext context = 
      new GenericXmlApplicationContext(
      "classpath:Mybatis.xml");

        // 데이터베이스 연결 정보 가져오기
        SqlSession sqlSession = context.getBean("sqlSession", SqlSession.class);

        // 전체 데이터를 가져오는 SQL을 호출
        List<Goods> list = sqlSession.selectList("good.goodlist");

        for (Goods goods : list) {
            System.out.println(goods);
        }
        }
}
  • 데이터 한개만 조회
package sqlmapper;

import org.apache.ibatis.session.SqlSession;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {

    public static void main(String[] args) {

        GenericXmlApplicationContext context = 
      new GenericXmlApplicationContext(
      "classpath:Mybatis.xml");

        SqlSession sqlSession = context.getBean("sqlSession", SqlSession.class);

        // 데이터 한개만 조회 
        // code를 가지고 데이터를 찾아오는 SQL 을 호출
        // code는 기본키 입니다. 
        // code를 데이터를 조회하면 데이터느 없거나 1개만 조회됩니다.
        Goods goods = sqlSession.selectOne("good.gooddetail", 1);
        System.err.println(goods);
        goods = sqlSession.selectOne("good.gooddetail", 4);
        System.err.println(goods);
        context.close();
    }
}
  • 데이터 삽입
package sqlmapper;

import org.apache.ibatis.session.SqlSession;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {

    public static void main(String[] args) {

        GenericXmlApplicationContext context = 
      new GenericXmlApplicationContext(
      "classpath:Mybatis.xml");

        SqlSession sqlSession = context.getBean("sqlSession", SqlSession.class);

        // 데이터 삽입 
        // 데이터를 삽입하는 SQL을 호출 
        // good.goodinsert 파라미터 타입은 Goods
        Goods goods = new Goods();
        goods.setCode(4);
        goods.setName("오징어");
        goods.setManufacture("속초");
        goods.setPrice(3000);
        int result = sqlSession.insert("good.goodinsert", goods);
        // insert는 1이상이 리턴되면 삽입 성공
        if(result>0) {
            System.err.println("삽입성공");
        }else {
            System.err.println("삽입실패");
        }
        context.close();
    }
}
  • 데이터 수정
package sqlmapper;

import org.apache.ibatis.session.SqlSession;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {

    public static void main(String[] args) {

        GenericXmlApplicationContext context = 
      new GenericXmlApplicationContext(
      "classpath:Mybatis.xml");

        SqlSession sqlSession = context.getBean("sqlSession", SqlSession.class);

        // 데이터 수정 
        Goods goods = new Goods();
        goods.setCode(4);
        goods.setName("문어");
        goods.setManufacture("주문진");
        goods.setPrice(5000);
        int result = sqlSession.update("good.goodupdate", goods);
        // update는 1이상 리턴되면 수정된 데이터가 있음
        // 0이 리턴되면 조건에 맞는 데이터가 없어서 수정하지 않음
        // 문제가 생기면 예외 발생 
        if(result>0) {
            System.err.println("수정 성공");
        }else {
            System.err.println("수정할 데이터가 없음");
        }
    context.close();
    }
}
  • 데이터 삭제
package sqlmapper;

import org.apache.ibatis.session.SqlSession;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {

    public static void main(String[] args) {

        GenericXmlApplicationContext context = 
      new GenericXmlApplicationContext(
      "classpath:Mybatis.xml");

        SqlSession sqlSession = context.getBean("sqlSession", SqlSession.class);

        // 데이터 삭제 
        int result = sqlSession.delete("good.gooddelete", 3);
        // delete는 1이상이 리턴되면 삭제된 데이터가 있음
        // 0이 리턴되면 조건에 맞는 데이터가 없어서 수정하지 않음
        // 문제가 생기면 예외 발생  
        if(result>0) {
            System.err.println("삭제성공");
        }else {
            System.err.println("삭제할 데이터가 없음");
        }
        context.close();
    }
}

MyBatis의 장점

  • sql과 java 코드가 분리 되기 때문에 유지보수가 용이
  • 처음 한번만 설정이 잘되면 이후부터는 쉽게 추가가 가능

MyBaits 사용 시 주의할 점

  • DTO 클래스와 매핑을 시킬 때는 컬럼이름과 변수명이 같아야 쉽게 매핑이 됩니다.
  • Map 을 이용하는 경우에는 오라클의 경우는 컬럼이름이 대문자로 리턴되는데 나머지 데이터베이스는 소문자로 리턴
  • 오라클의 number 자료형은 Map에 매핑하는 경우 BigDecimal로 매핑되기 때문에 정수나 실수로 사용하고자 할 때는 한번의 변환 과정이 더 필요하다.
  • Map을 사용하게 되면 번거롭기 때문에 아직까지는 DTO 클래스를 만들어서 작업을 하는 경우가 많다.

results matching ""

    No results matching ""