테이블 생성
create table mymember(id varchar2(50) primary key, name varchar2(50)
,phone varchar2(20), email varchar2(100));
테이블의 행을 표현할 수 있는 클래스, DTO 클래스 생성
package xyz.itwill.dto;
//create table mymember(id varchar2(50) primary key, name varchar2(50),phone varchar2(20), email varchar2(100));
public class MyMember {
private String id;
private String name;
private String phone;
private String email;
public MyMember() {
// TODO Auto-generated constructor stub
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
[mybatis-config.xml] 에서 매퍼 등록
<mappers>
<mapper resource="xyz/itwill/mapper/MyMemberXMLMapper.xml"/>
</mappers>
[MyMemberXMLMapper.xml] 생성
insert : INSERT 명령을 등록하기 위한 엘리먼트
- id 속성 : SQL 명령이 등록된 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정한다.
- parameterType 속성 : SQL 명령 작성에 필요한 값을 제공하기 위한 Java 객체의 자료형을 속성값으로 설정한다.
→ Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용이 가능하다.
→ SQL 명령 작성에 필요한 값이 없는 경우 parameterType 속성을 생략한다.
DML 명령(INSERT, UPDATE, DELETE) 관련 엘리먼트는 등록된 SQL 명령을 DBMS 서버에 전달하여 실행한 후 조작행의 갯수(int)를 무조건 정수값으로 매핑하여 제공하므로 resultType 속성을 생략한다.
[mybatis-config.xml] 에서 typeAlias 설정
<typeAliases>
<typeAlias type="xyz.itwill.dto.Mymember" alias="MyMember"/>
</typeAliases>
parameterType 속성값으로 전달된 값을 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 표현하여 전달값을 제공받아 사용한다.
parameterType 속성값으로 전달된 값이 Java 객체(DTO)인 경우 #{필드명} 형식으로 객체 필드값을 제공받아 사용하면 된다. - Getter 메소드가 자동 호출됨
참고) ibatis 프레임워크에서는 전달값을 #변수명|필드명|맵키# 형식으로 표현한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MyMemberXMLMapper">
<!-- Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 -->
<insert id="insertMyMember" parameterType="MyMember">
insert into mymember values(#{id}, #{name}, #{phone}, #{email})
</insert>
</mapper>
update : UPDATE 명령을 등록하기 위한 엘리먼트
<update id="updateMember" parameterType="MyMember">
update mymember set name=#{name}, phone=#{phone}, email=#{email} where id=#{id}
</update>
delete : DELETE 명령을 등록하기 위한 엘리먼트
parameterType 속성값으로 값 하나만 전달받은 경우 #{변수명} 형식으로 표현하여 전달값을 제공받아 사용한다. - 변수명은 어떤 이름을 표현하여 사용하든지 상관 없다.
<delete id="deleteMember" parameterType="string">
delete from mymember where id=#{id}
<!-- delete from mymember where id=#{xx} => 변수명 상관 X -->
</delete>
select : SELECT 명령을 등록하기 위한 엘리먼트
→ resultType 속성 또는 resultMap 속성을 반드시 설정해야만 매핑 정보를 제공받아 사용할 수 있다.
- resultType 속성 : 검색행을 Java 객체로 제공하기 위한 Java 자료형을 속성값으로 설정한다.
→ Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용이 가능하다.
resultType 속성값으로 클래스를 설정한 경우 속성값으로 설정된 클래스의 객체를 생성하여 검색행의 컬럼값을 컬럼과 같은 이름의 객체 필드에 저장하여 제공한다. - 자동매핑
<select id="selectMember" parameterType="string" resultType="MyMember">
select id, name, phone, email from mymember where id=#{id}
</select>
<!-- SELECT 명령으로 다수행이 검색되어도 resultType 속성에는 하나의 검색행을 객체로 매핑하기
위한 Java 자료형을 속성값으로 설정해주면 된다. -->
<select id="selectMemberList" resultType="MyMember">
select * from mymember order by id
</select>
전체 코드
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MyMemberXMLMapper">
<!-- Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 -->
<insert id="insertMyMember" parameterType="MyMember">
insert into mymember values(#{id}, #{name}, #{phone}, #{email})
</insert>
<update id="updateMember" parameterType="MyMember">
update mymember set name=#{name}, phone=#{phone}, email=#{email} where id=#{id}
</update>
<delete id="deleteMember" parameterType="string">
delete from mymember where id=#{id}
</delete>
<select id="selectMember" parameterType="string" resultType="MyMember">
select id, name, phone, email from mymember where id=#{id}
</select>
<!-- SELECT 명령으로 다수행이 검색되어도 resultType 속성에는 하나의 검색행을 객체로 매핑하기
위한 Java 자료형을 속성값으로 설정해주면 된다. -->
<select id="selectMemberList" resultType="MyMember">
select * from mymember order by id
</select>
</mapper>
DAO 선언
[MyMemberXMLDAO.java]
회원정보를 전달받아 MYMEMBER 테이블의 회원정보로 삽입하고 삽입행의 갯수를 반환하는 메소드 선언
SqlSession.insert(String elementId[, Object parameterValue]) : 매퍼에 등록된 insert 엘리먼트의 SQL 명령(INSERT)을 제공받아 DBMS 서버에 전달하여 실행하고 삽입행의 갯수를 제공받아 반환하는 메소드
→ elementId : SQL 명령이 등록된 매퍼와 엘리먼트의 식별자를 문자열로 표현하여 전달
→ parameterValue : SQL 명령 작성에 필요한 값(객체)를 전달 - parameterType 속성값으로 전달
→ SQL 명령 작성에 필요한 값(객체)이 없는 경우 parameterValue 매개변수에 값 미전달
mybatis 프레임워크는 기본적으로 AutoCommit 기능을 비활성화 처리하고 SQL 명령을 DBMS 서버에 전달하여 실행한다.
따라서 DML 명령을 전달하여 실행한 경우 반드시 커밋 또는 롤백 처리를 해주어야 한다.
sqlSession.commit() : 트랜잭션 적용 명령(COMMIT)을 DBMS 서버에 전달하여 실행한다. (커밋 처리)
sqlSession.rollback() : 트랜잭션 취소 명령(ROLLBACK)을 DBMS 서버에 전달하여 실행한다. (롤백 처리)
public int insertMember(MyMember member) {
SqlSession sqlSession=getSqlSessionFactory().openSession();
try {
//SQL 명령(INSERT)를 제고압ㄷ아 DBMS 서버에 전달하여 실행하고 삽입행의 갯수를 반환
int rows=sqlSession.insert("MyMemberXMLMapper.insertMember", member);
//DML 명령을 전달하여 실행한 경우 반드시 커밋 또는 롤백 처리
if(rows > 0) {
sqlSession.commit();//커밋처리
} else {
sqlSession.rollback();//롤백처리
}
return rows;
} finally {
sqlSession.close();
}
}
회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
SqlSessionFactory.openSession(boolean autoCommit) : SqlSession 객체를 생성하여 반환하는 메소드
→ false : AutoCommit 기능 비활성화(기본값), true : AutoCommit 기능 활성화
SqlSession.update(String elementId[, Object parameterValue]) : 매퍼에 등록된 update엘리먼트의 SQL 명령(UPDATE)을 제공받아 DBMS 서버에 전달하여 실행하고 변경행의 갯수를 제공받아 반환하는 메소드
public int updateMember(MyMember member) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.update("MyMemberXMLMapper.updateMember", member);
} finally {
sqlSession.close();
}
}
아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
SqlSession.delete(String elementId[, Object parameterValue]) : 매퍼에 등록된 delete엘리먼트의 SQL 명령(DELETE)을 제공받아 DBMS 서버에 전달하여 실행하고 삭제행의 갯수를 제공받아 반환하는 메소드
public int deleteMember(String id) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.update("MyMemberXMLMapper.deleteMember", id);
} finally {
sqlSession.close();
}
}
아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
SqlSession.selectOne(String elementId[, Object parameterValue]) : 매퍼에 등록된 select 엘리먼트의 SQL 명령(SELECT)을 제공받아 DBMS 서버에 전달하여 실행하고 검색결과가 저장된 객체(값)를 제공받아 반환하는 메소드
→ 하나의 행만 검색하는 SELECT 명령을 DBMS 서버에 전달하여 실행할 경우 호출하는 메소드
public MyMember selectMember(String id) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.selectOne("MyMemberXMLMapper.selectMember", id);
} finally {
sqlSession.close();
}
}
MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
SqlSession.selectOne(String elementId[, Object parameterValue]) : 매퍼에 등록된 select 엘리먼트의 SQL 명령(SELECT)을 제공받아 DBMS 서버에 전달하여 실행하고 검색결과가 저장된 List 객체를 제공받아 반환하는 메소드
→ 여러개의 행을 검색하는 SELECT 명령을 DBMS 서버에 전달하여 실행할 경우 호출하는 메소드
public List<MyMember> selectMemberList() {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.selectList("MyMemberXMLMapper.selectMemberList");
} finally {
sqlSession.close();
}
}
전체
package xyz.itwill.dao;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 xyz.itwill.dto.MyMember;
public class MyMemberXMLDAO {
private static MyMemberXMLDAO _dao;
public MyMemberXMLDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new MyMemberXMLDAO();
}
public static MyMemberXMLDAO getDAO() {
return _dao;
}
//SqlSessionFactory 객체를 생성하여 반환하는 메소드
private SqlSessionFactory getSqlSessionFactory() {
String resource="mybatis-config.xml";
InputStream inputStream=null;
try {
inputStream=Resources.getResourceAsStream(resource);
} catch (IOException e) {//mybatis 환경설정파일이 없는 경우 예외 발생
throw new IllegalArgumentException();
}
return new SqlSessionFactoryBuilder().build(inputStream);
}
//회원정보를 전달받아 MYMEMBER 테이블의 회원정보로 삽입하고 삽입행의 갯수를 반환하는 메소드
public int insertMember(MyMember member) {
SqlSession sqlSession=getSqlSessionFactory().openSession();
try {
//SQL 명령(INSERT)를 제공받아 DBMS 서버에 전달하여 실행하고 삽입행의 갯수를 반환
int rows=sqlSession.insert("MyMemberXMLMapper.insertMember", member);
//DML 명령을 전달하여 실행한 경우 반드시 커밋 또는 롤백 처리
if(rows > 0) {
sqlSession.commit();//커밋처리
} else {
sqlSession.rollback();//롤백처리
}
return rows;
} finally {
sqlSession.close();
}
}
//회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
public int updateMember(MyMember member) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.update("MyMemberXMLMapper.updateMember", member);
} finally {
sqlSession.close();
}
}
//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
public int deleteMember(String id) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.update("MyMemberXMLMapper.deleteMember", id);
} finally {
sqlSession.close();
}
}
//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
public MyMember selectMember(String id) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.selectOne("MyMemberXMLMapper.selectMember", id);
} finally {
sqlSession.close();
}
}
//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
public List<MyMember> selectMemberList() {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.selectList("MyMemberXMLMapper.selectMemberList");
} finally {
sqlSession.close();
}
}
}
jsp 만들어서 확인
이번엔 인터페이스 기반의 매퍼 파일을 생성해보자
먼저 [mybatis-config.xml] 에서 매퍼파일을 등록한다
class 속성 : Interface 기반의 매퍼 파일의 경로를 속성값으로 설정한다.
Interface 기반의 매퍼 파일의 경로는 Java 자료형(인터페이스)을 기반으로 표현하여 작성한다.
<mappers>
<mapper class="xyz.itwill.mapper.MyMemberInterfaceMapper"/>
</mappers>
MyMemberInterfaceMapper 인터페이스를 선언해보자
mybatis 프레임워크에서는 인터페이스를 이용하여 매퍼 파일을 작성할 수 있다.
추상메소드에 mybatis 어노테이션(Annotation)을 사용하여 SQL 명령을 작성하여 등록할 수 있다.
@Insert : 추상메소드에 INSERT 명령을 등록하기 위한 어노테이션
- vlaue 속성 : 추상메소드에 등록될 SQL 명령을 속성값으로 설정한다.
→ value 속성 외에 다른 속성이 없는 경우 속성값만 설정이 가능하다.
@Insert(value="insert into mymember values(#{id}, #{name}, #{phone}, #{email})")
//추상메소드의 매개변수에서 SQL 명령 작성에 필요한 객체(값)을 전달받기 위해 선언하며
//추상메소드의 반환형은 실행결과를 객체(값)로 제공받기 위한 Java 자료형을 선언해준다
int insertMember(MyMember member);
@update : 추상메소드에 UPDATE 명령을 등록하기 위한 어노테이션
@Update("update mymember set name=#{name}, phone=#{phone}, email=#{email} where id=#{id}")
int updateMember(MyMember member);
@Delete : 추상메소드에 DELETE 명령을 등록하기 위한 어노테이션
@Delete("delete from mymember where id=#{id}")
int deleteMember(String id);
@Select : 추상메소드에 SELECT 명령을 등록하기 위한 어노테이션
@Select("select id, name, phone, email from mymember where id=#{id}")
int selectMember(String id);
@Select("select id, name, phone, email * from mymember order by id}")
List<MyMember> selectMemberList();
전체 소스코드
package xyz.itwill.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import xyz.itwill.dto.MyMember;
//mybatis 프레임워크에서는 인터페이스를 이용하여 매퍼 파일 작성이 가능하다.
// => 추상메소드에 mybatis 어노테이션(Annotation)을 사용하여 SQL 명령을 작성하여 등록
public interface MyMemberInterfaceMapper {
@Insert(value="insert into mymember values(#{id}, #{name}, #{phone}, #{email})")
//추상메소드의 매개변수에서 SQL 명령 작성에 필요한 객체(값)을 전달받기 위해 선언하며
//추상메소드의 반환형은 실행결과를 객체(값)로 제공받기 위한 Java 자료형을 선언해준다
int insertMember(MyMember member);
@Update("update mymember set name=#{name}, phone=#{phone}, email=#{email} where id=#{id}")
int updateMember(MyMember member);
@Delete("delete from mymember where id=#{id}")
int deleteMember(String id);
@Select("select id, name, phone, email from mymember where id=#{id}")
int selectMember(String id);
@Select("select id, name, phone, email * from mymember order by id}")
List<MyMember> selectMemberList();
}
이제 MyMemberInterfaceDAO 에서 메소드를 선언해준다.
SqlSession.getMapper(Class<T> clazz) : 매개변수의 메모리에 저장된 인터페이스(Class 객체 - Clazz)를 전달받아 Mapper 객체로 생성하여 반환하는 메소드
→ 매개변수에 [XXX.class] 형식으로 인터페이스를 Class 객체로 직접 표현하여 전달
Mapper 객체 : 인터페이스 기반의 매퍼 파일을 제공받아 Mapper 객체로 생성되며 추상메소드를 호출하여 추상메소드에 등록된 SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑하여 반환하는 기능을 제공하는 객체
package xyz.itwill.dao;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 xyz.itwill.dto.MyMember;
import xyz.itwill.mapper.MyMemberInterfaceMapper;
public class MyMemberInterfaceDAO {
private static MyMemberInterfaceDAO _dao;
private MyMemberInterfaceDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new MyMemberInterfaceDAO();
}
public static MyMemberInterfaceDAO getDAO() {
return _dao;
}
//SqlSessionFactory 객체를 생성하여 반환하는 메소드
private SqlSessionFactory getSqlSessionFactory() {
String resource="mybatis-config.xml";
InputStream inputStream=null;
try {
inputStream=Resources.getResourceAsStream(resource);
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
return new SqlSessionFactoryBuilder().build(inputStream);
}
//회원정보를 전달받아 MYMEMBER 테이블의 회원정보로 삽입하고 삽입행의 갯수를 반환하는 메소드
public int insertMember(MyMember member) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyMemberInterfaceMapper.class).insertMember(member);
} finally {
sqlSession.close();
}
}
//회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
public int updateMember(MyMember member) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyMemberInterfaceMapper.class).updateMember(member);
} finally {
sqlSession.close();
}
}
//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
public int deleteMember(String id) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyMemberInterfaceMapper.class).deleteMember(id);
} finally {
sqlSession.close();
}
}
//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
public MyMember selectMember(String id) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyMemberInterfaceMapper.class).selectMember(id);
} finally {
sqlSession.close();
}
}
//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
public List<MyMember> selectMemberList() {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyMemberInterfaceMapper.class).selectMemberList();
} finally {
sqlSession.close();
}
}
}
jsp 문서로 잘 동작되는지 확인
'학원 > 복기' 카테고리의 다른 글
[MyBatis] 자동매핑&수동매핑 / resultMap (0) | 2023.07.19 |
---|---|
[MyBatis] 매퍼 바인딩 / package 엘리먼트 (0) | 2023.07.19 |
[MyBatis] MyBatis란? / 예제 (0) | 2023.07.18 |
[MVC] 필터(Filter) (0) | 2023.07.16 |
[MVC] Functions 태그 라이브러리 (0) | 2023.07.16 |