상세 컨텐츠

본문 제목

Mybatis 객체 형식으로 insert, select 하기

프레임워크/Mybatis

by 최승호 2022. 5. 9. 10:22

본문

Member 라는 클래스를 선언하고 Member 객체를 생성한 후 그 정보를 DB 테이블에 insert하고 select 해본다.

 

Member 클래스

public class Member {
    private String id;
    private String password;
    private String name;

    public Member(String id, String password, String name) {
        this.id = id;
        this.password = password;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id='" + id + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

 

Member 클래스의 필드명(id, password, name)를 DB 테이블의 컬럼명과 동일하게 선언한다. 

 

memberMapper.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="MemberMapper">
    <!-- Member 정보 insert -->
    <insert id="insertMember" parameterType="Member">
        insert into tb_member (
            id,
            password,
            name
        )
        values (
            #{id},
            #{password},
            #{name}
        )
    </insert>
    
    <!-- Member 정보 select -->
    <select id="selectMemberById" parameterType="string" resultType="Member">
        select
            id,
            password,
            name
        from tb_member
        where id = #{id}
    </select>
</mapper>

 

매퍼파일에서 #{id}, #{password}, #{name} 등은 변수로 사용되며 #{} 기호 안에 들어가는 이름은 Member 클래스에 선언한 필드의 이름과 같아야 한다. 

 

MemberMapper 인터페이스

public interface MemberMapper {
    public int insertMember(Member member);
    public Member selectMemberById(String id);
}

 

MemberMapper 인터페이스에서 선언한 추상 메소드의 이름, 리턴타입, 매개변수 등은 memberMapper.xml 매퍼파일에서 지정한 id, resultType, parameterType과 매칭된다.

매칭 MemberMapper 인터페이스 memberMapper.xml 매퍼파일
메소드명 <-> id selectMemberById selectMemberById
리턴타입 <-> resultType Member Member 혹은 지정한 alias
매개변수 <-> parameterType (String id) String 혹은 string

 

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>
    <properties resource="db.properties" />

    <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>

    <mappers>
        <mapper resource="memberMapper.xml" />
    </mappers>
</configuration>

 

mybatis-config.xml 설정파일 내에 <mappers> 태그와 <mapper> 태그를 사용하여 사용하려는 매퍼 파일의 경로를 지정해 준다.

 

MemberDAO 클래스

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

public class MemberDAO {
    private SqlSessionFactory factory = MybatisConfig.getSqlSessionFactory();

    public void insertMember(Member member) {
        try (SqlSession session = factory.openSession()) {
            MemberMapper mapper = session.getMapper(MemberMapper.class);
            mapper.insertMember(member);
            
            // insert한 내용을 커밋하여 영구 저장한다.
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Member selectMemberById(String id) {
        Member member = null;
        try (SqlSession session = factory.openSession()) {
            MemberMapper mapper = session.getMapper(MemberMapper.class);
            member = mapper.selectMemberById(id);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return member;
    }

    public static void main(String[] args) {
        MemberDAO dao = new MemberDAO();
        Member member = new Member("hong", "1234", "홍길동");
        // DB에 Member 객체 정보 insert 하기
        dao.insertMember(member);

        // hong 이라는 아이디를 가진 Member 정보 select 하기
        Member searchedMember = dao.selectMemberById("hong");
        System.out.println(searchedMember);
    }
}

※ 주의 : insert 후 session.commit() 을 하지 않으면 SqlSession이 close() 되면서 롤백이 된다. 따라서 insert, update, delete 명령 후에는 항상 commit() 을 실행하여 변경된 트렌젝션을 영구반영 해야한다.

 

 

 

실행결과

 

DB 테이블에 저장되었고 selectMemberById() 결과도 출력되었다.

관련글 더보기

댓글 영역