반응형
1) [DTO] MyMember.java
package xyz.itwill.dto;
//create table mymember(id varchar2(20) primary key, name varchar2(50), phone varchar2(20), email varchar2(100));
/*
이름 널? 유형
----- -------- -------------
ID NOT NULL VARCHAR2(20)
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;}
}
2) [Mapper] MyMemberXMLMapper.xml
- 가장 기본적으로 사용하는 CRUD SQL 명령을 XML문서에 등록함
https://mybatis.org/dtd/mybatis-3-mapper.dtd>">
<mapper namespace="MyMemberXMLMapper">
INSERT
<!-- insert : INSERT 명령을 등록하기 위한 엘리먼트 -->
<!-- id속성 : SQL 명령이 등록된 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- parameterType속성 : SQL 명령에 필요한 값을 제공받기 위한 객체(값)의 Java 자료형을 속성값으로 설정 -->
<!-- => Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 가능 -->
<!-- => 주의) 딱 하나의 값만 전달가능, 만약 2개 이상의 값 전달이 필요하면 반드시 객체로 전달 -->
<!-- => SQL 명령에 필요한 값이 없는 경우 parameterType 속성 생략 가능 -->
<!-- DML 명령 (INSERT,UPDATE,DELETE) 관련 엘리먼트는 등록된 SQL 명령 실행 후 조작행의
갯수를 무조건 정수값(int)으로 매핑하여 제공하므로 resultType 속성 생략 : resultType은 select 태그만 사용 -->
<!-- <insert id="insertMember" parameterType="xyz.itwill.dto.MyMember"> -->
<insert id="insertMember" parameterType="MyMember">
<!-- parameterType 속성으로 전달받은 값은 SQL 명령에서 #{변수명|필드명|맵키} -->
<!-- [값 -> 변수명(우리 마음대로 이름 정의)] , [객체 -> 필드명] , [맵객체 -> 맵키] -->
<!-- => parameterType 속성으로 전달받은 값이 Java 객체인 경우 #{필드명} 형식으로
필드값을 제공받아 사용 - Getter 메소드 자동 호출됨-->
<!-- => ibatis 프레임워크에서는 #변수명|필드명|맵키# 형식으로 표현하여 사용 -->
insert into mymember values (#{id},#{name},#{phone},#{email})
</insert>
UPDATE
<!-- update : UPDATE 명령을 등록하기 위한 엘리먼트 -->
<!-- resultType은 select 태그만 사용 -->
<update id="updateMember" parameterType="MyMember">
update mymember set name=#{name}, phone=#{phone}, email=#{email} where id=#{id}
</update>
DELETE
<!-- delete : DELETE 명령을 등록하기 위한 엘리먼트 -->
<!-- resultType은 select 태그만 사용 -->
<delete id="deleteMember" parameterType="string"> <!-- String클래스에 대한 typeAlias 엘리먼트의 속성값 : string -->
<!-- parameterType속성으로 하나의 값만 전달된 경우 #{변수명} 형식으로 전달값을 제공받음 -->
<!-- => 변수명은 특별한 형식없이 사용 가능 -->
delete from mymember where id=#{id}
</delete>
SELECT
<!-- select : SELECT 명령을 등록하기 위한 엘리먼트 -->
<!-- => 반드시 resultType 속성(resultMap 속성)을 설정하여 매핑정보를 제공받아 사용 -->
<!-- resultType속성 : 검색결과를 제공하기 위한 객체(값)의 Java 자료형을 속성값으로 설정 -->
<!-- => Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 가능 -->
<!-- resultType 속성값으로 Java 클래스를 설정한 경우 Java 객체를 생성하여 검색행의
컬럼값을 같은 이름의 필드에 자동 저장하여 제공 - 자동 매핑 -->
<!-- 즉, resultType은 자동매핑할 때 사용한다!! -->
<!-- 문자열을 매개변수로 전달받아 그 결과를 MyMember로 만들어주세요!! -->
<select id="selectMember" parameterType="string" resultType="MyMember">
select * from mymember where id=#{id}
</select>
SELECT
<!-- SELECT 명령에 의해 여러개의 행이 검색되도 resultType 속성에는 "하나"의 검색행에 대한
Java 자료형을 속성값으로 설정 -->
<!-- => List로 만드는 것은 DAO클래스의 SqlSession이 해줄 것임 -->
<select id="selectMemberList" resultType="MyMember">
select * from mymember order by id
</select>
</mapper>
3) [DAO] MyMemberXMLDAO.java
- 실제적으로 일을 하는 DAO클래스
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;
private MyMemberXMLDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao = new MyMemberXMLDAO();
}
public static MyMemberXMLDAO getDAO() {
return _dao;
}
SqlSessionFactory를 반환하는 메소드
//SqlSessionFactory를 반환하는 메소드
private SqlSessionFactory getSessionFactory() {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
throw new IllegalArgumentException();
}
return new SqlSessionFactoryBuilder().build(inputStream);
}
insertMember
//회원정보를 전달받아 MyMember 테이블에 삽입하고 삽입행의 갯수를 반환하는 메소드
public int insertMember(MyMember member) {
SqlSession sqlSession = getSessionFactory().openSession();
try {
//SqlSession.insert(String elementId,Object parameterValue) : 매퍼에 등록된
//insert 엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 삽입행의 갯수를 반한하는 메소드
// => elementId : SQL 명령이 등록된 매퍼와 엘리먼트의 식별자를 매개변수에 전달
// => parameterValue : SQL 명령에 필요한 객체(값)를 매개변수에 전달 - parameterType 속성값으로 사용 가능
// => 엘리먼트에 전달할 값이 없는 경우 - parameterValue매개변수에 값 전달 생략 가능
int rows=sqlSession.insert("MyMemberXMLMapper.insertMember",member);
//=>🔥 원칙적으로는 AutoCommit 기능 비활성화 후
//프로그램을 작성하는 것이 맞으나, 예외처리를 통해 롤백처리하는 것은 프로그램 만들기 귀찮기 때문에
//여기서는 AutoCommit 기능 활성화 하고 사용할 것임
//=> JSP1에서는 jsp문서에도 try~catch 구문도 작성해야하므로 일단 활성화하고 작성을 패스함 (프로그래머가 직접 롤백처리)
//AutoCommit 기능 활성화 : 프로그램 실행 시 예외가 발생해도
//전으로 되돌릴 수 없음 (명령 작성하자마자 바로 commit처리됨)
//AutoCommit 기능 비활성화 : 예외 발생 전으로 되돌릴 수 있으나,
//데이타가 성공적으로 변경될 시 반드시 명시적으로 commit처리 해줘야함
//=> mybatis-config.xml 문서에 작성되어있음
//=> Spring에서는 AutoCommit 비활성화 이용할 것임. 트랜잭션 매니저가 있으므로 간단히 트랜잭션 관리 가능함 (트랜잭션 매니저가 롤백처리)
//mybatis 프레임워크는 기본적으로 AutoCommit 기능을 비활성화 처리하고 SQL 명령을 전달하여 실행
// => DML 명령을 전달하여 실행한 경우 반드시 트랜잭션 관련 메소드를 호출하여 커밋 또는 롤백 처리 필요
if(rows>0) {
//SqlSession.commit() : 트랜잭션 적용 명령(COMMIT)을 전달하여 실행하는 메소드 - 커밋 처리
sqlSession.commit();
} else {
//SqlSession.rollback() : 트랜잭션 취소 명령(ROLLBACK)을 전달하여 실행하는 메소드 - 롤백 처리
sqlSession.rollback();
}
return rows;
} finally {
sqlSession.close();
}
}
updateMember
//회원정보를 전달받아 MyMember 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
public int updateMember(MyMember member) {
//SqlSessionFactory.openSession(boolean autoCommit) : SqlSession 객체를 생성하여 반환하는 메소드
// => [false] : AutoCommit 기능 비활성화(기본값), [true] : AutoCommit 기능 활성화
SqlSession sqlSession = getSessionFactory().openSession(true);
try {
//SqlSession.update(String elementId,Object parameterValue) : 매퍼에 등록된
//update 엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 변경행의 갯수를 반한하는 메소드
return sqlSession.update("MyMemberXMLMapper.updateMember",member);
} finally {
sqlSession.close();
}
}
deleteMember
//아이디를 전달받아 MyMember 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
public int deleteMember(String id) {
SqlSession sqlSession = getSessionFactory().openSession(true);
try {
//SqlSession.delete(String elementId,Object parameterValue) : 매퍼에 등록된
//delete 엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 삭제행의 갯수를 반한하는 메소드
return sqlSession.delete("MyMemberXMLMapper.deleteMember",id);
} finally {
sqlSession.close();
}
}
selectMember
//아이디를 전달받아 MyMember 테이블에 저장된 회원정보를 검색하여 반환하는 메소드
public MyMember selectMember(String id) {
//select명령은 트랜잭션을 사용하지 않지만, 일단은 AutoCommit기능 활성화해서 이용..!
SqlSession sqlSession = getSessionFactory().openSession(true);
try {
//SqlSession.selectOne(String elementId,Object parameterValue) : 매퍼에 등록된
//select 엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 검색결과를 하나의
//Java 객체(값)으로 매핑하여 반환하는 메소드
//=> 하나의 행만 검색하는 SELECT 명령을 전달하여 실행할 경우 호출하는 메소드
//=> 만약 다수행의 행검색에 selectOne()메소드를 사용해도 첫번째 행만 검색해줌
return sqlSession.selectOne("MyMemberXMLMapper.selectMember",id);
} finally {
sqlSession.close();
}
}
selectMemberList
//MyMember 테이블에 저장된 모든 회원정보를 검색하여 반환하는 메소드
public List<MyMember> selectMemberList() {
SqlSession sqlSession = getSessionFactory().openSession(true);
try {
//SqlSession.selectList(String elementId,Object parameterValue) : 매퍼에 등록된
//select 엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 검색결과를 요소로 생성되도록
//매핑하고 List 객체에 추가하여 매핑하여 반환하는 메소드
//=> 여러 개의 행을 검색하는 SELECT 명령을 전달하여 실행할 경우 호출하는 메소드
return sqlSession.selectList("MyMemberXMLMapper.selectMemberList");
} finally {
sqlSession.close();
}
}
}
반응형
'framework > mybatis' 카테고리의 다른 글
[mybatis] 6. XML + 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.21 |
---|---|
[mybatis] 5. 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.20 |
[mybatis] 3. XML기반의 매퍼파일 (Student 출력 프로그램) (0) | 2024.07.20 |
[mybatis] 2. MYBATIS 환경설정 (0) | 2024.07.19 |
[mybatis] 1. MYBATIS 개념 (0) | 2024.07.19 |