반응형
Mybatis
: 데이터베이스를 쉽게 다룰 수 있도록 도와주는 오픈 소스 ORM(Object-Relational Mapping) 프레임워크
DB를 쉽게 다룰 수 있으며 동적 쿼리 작성이 가능하다.
=> preparedstatement처럼 쿼리문을 복잡하게 입력하지 않고 실제 쿼리문과 유사하게 작성 가능
.properties 파일에 기입했던 정보들 기입
<?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="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/member.xml"/>
</mappers>
</configuration>
- 사용할 수 있는 기본적인 태그들
<select> ~~~ </select>
<insert> ~~~ </insert>
<update> ~~~ </update>
<delete> ~~~ </delete>
- 위 태그에서 사용되는 주요 속성들
1) id : 해당 태그를 호출할 때 namespace값과 연결하여 사용하는 id값
2) parameterType : 파라미터 객체의 타입정보를 지정한다.
(보통 VO클래스명, 자바의 데이터타입 등이 사용된다. ALias명 사용 가능함.)
3) resultType : select문을 실행한 결과값을 담을 객체타입을 지정한다.
(보통 VO클래스명, 자바의 데이터타입 등이 사용된다. ALias명 사용 가능함.)
4) resultMap : 결과 레코드 컬럼명과 VO객체의 속성명이 다를 경우에 적절한 매핑을 위해 사용한다.
- insert
<?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="memberTest">
<insert id="insertMember" parameterType="kr.or.ddit.member.vo.MemberVO">
insert into mymember
(mem_id, mem_name, mem_tel, mem_addr)
values (#{memId}, #{memName}, #{memTel}, #{memAddr})
</insert>
</mapper>
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import org.apache.ibatis.exceptions.PersistenceException;
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 kr.or.ddit.member.vo.MemberVO;
public class MybatisTest {
public static void main(String[] args) {
// 1. myBatis의 환경설정 파일을 읽어와 실행시킨다.
SqlSessionFactory sqlSessionFactory = null;
try {
// 1-1. xml 설정문서 읽어오기
Charset charset = Charset.forName("UTF-8"); // 설정파일의 한글처리를 위해서...
Resources.setCharset(charset);
// 반드시 설정 파일을 넣어야 함. xml형식 고정
Reader rd = Resources.getResourceAsReader("config/mybatis-config.xml");
// 1-2. 위에서 생성한 Reader객체를 사용하여 SqlSessionFactory 객체 생성한다.
sqlSessionFactory = new SqlSessionFactoryBuilder().build(rd);
rd.close(); // 사용한 스트림 객체 닫아주기
} catch (IOException ex) {
ex.printStackTrace();
}
/////////////////////////////////////////////////////////////////////
// 2. 실행한 SQL문이 있는 쿼리문을 지정하여 원하는 작업을 수행한다.
// 2-1. insert작업 연습
System.out.println("insert 작업 시작...");
// 1) 저장할 데이터를 VO에 담는다.
MemberVO mv = new MemberVO();
mv.setMemId("d001");
mv.setMemName("강감찬");
mv.setMemTel("111-111");
mv.setMemAddr("경남 진주시");
// SqlSession객체를 이용하여 해당 쿼리문을 수행시킨다.
// ex) SqlSession객체.insert("namespace값.id값", 파라미터객체);
SqlSession sqlSession = sqlSessionFactory.openSession(false); // 오토커밋 여부 지정 >> false 이기에 따로 커밋 처리 해줘야함.
try {
int cnt = sqlSession.insert("memberTest.insertMember", mv);
if(cnt > 0) {
System.out.println("insert 작업 성공!");
sqlSession.commit(); // 커밋... / 커밋 하지 않을 때 close 할 시 롤백이 진행됨.
} else {
System.out.println("insert 작업 실패!!!");
}
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
sqlSession.close();
}
}
}
- update
<?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="memberTest">
<update id="updateMember" parameterType="kr.or.ddit.member.vo.MemberVO">
update mymember
set mem_name = #{memName},
mem_tel = #{memTel},
mem_addr = #{memAddr}
where mem_id = #{memId}
</update>
</mapper>
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.time.Period;
import java.util.List;
import org.apache.ibatis.exceptions.PersistenceException;
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 kr.or.ddit.member.vo.MemberVO;
public class MybatisTest {
public static void main(String[] args) {
// 1. myBatis의 환경설정 파일을 읽어와 실행시킨다.
SqlSessionFactory sqlSessionFactory = null;
try {
// 1-1. xml 설정문서 읽어오기
Charset charset = Charset.forName("UTF-8"); // 설정파일의 한글처리를 위해서...
Resources.setCharset(charset);
// 반드시 설정 파일을 넣어야 함. xml형식 고정
Reader rd = Resources.getResourceAsReader("config/mybatis-config.xml");
// 1-2. 위에서 생성한 Reader객체를 사용하여 SqlSessionFactory 객체 생성한다.
sqlSessionFactory = new SqlSessionFactoryBuilder().build(rd);
rd.close(); // 사용한 스트림 객체 닫아주기
} catch (IOException ex) {
ex.printStackTrace();
}
/////////////////////////////////////////////////////////////////////
// 2. 실행한 SQL문이 있는 쿼리문을 지정하여 원하는 작업을 수행한다.
// 2-2. update 연습
System.out.println("update작업 시작...");
MemberVO mv2 = new MemberVO();
mv2.setMemId("d001");
mv2.setMemName("박채연");
mv2.setMemTel("555-555");
mv2.setMemAddr("부산시");
sqlSession = sqlSessionFactory.openSession();
try {
// update()의 반환값도 성공한 레코드 수이다.
int cnt = sqlSession.update("memberTest.updateMember", mv2);
if(cnt > 0) {
System.out.println("update작업 성공");
} else {
System.out.println("update작업 실패!!!");
}
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
sqlSession.close();
}
}
}
- delete
넘어오는 게 하나일 경우 어떤 글자를 쓰든 신경쓰지 않고 집어 넣음
<?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="memberTest">
<delete id="deleteMember" parameterType="String">
delete from mymember where mem_id = #{오병준}
</delete>
</mapper>
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.time.Period;
import java.util.List;
import org.apache.ibatis.exceptions.PersistenceException;
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 kr.or.ddit.member.vo.MemberVO;
public class MybatisTest {
public static void main(String[] args) {
// 1. myBatis의 환경설정 파일을 읽어와 실행시킨다.
SqlSessionFactory sqlSessionFactory = null;
try {
// 1-1. xml 설정문서 읽어오기
Charset charset = Charset.forName("UTF-8"); // 설정파일의 한글처리를 위해서...
Resources.setCharset(charset);
// 반드시 설정 파일을 넣어야 함. xml형식 고정
Reader rd = Resources.getResourceAsReader("config/mybatis-config.xml");
// 1-2. 위에서 생성한 Reader객체를 사용하여 SqlSessionFactory 객체 생성한다.
sqlSessionFactory = new SqlSessionFactoryBuilder().build(rd);
rd.close(); // 사용한 스트림 객체 닫아주기
} catch (IOException ex) {
ex.printStackTrace();
}
/////////////////////////////////////////////////////////////////////
// 2. 실행한 SQL문이 있는 쿼리문을 지정하여 원하는 작업을 수행한다.
// 2-3. delete 연습
System.out.println("delete 작업 시작...");
sqlSession = sqlSessionFactory.openSession();
try {
int cnt = sqlSession.delete("memberTest.deleteMember", "d001");
if(cnt > 0) {
System.out.println("삭제 작업 성공!");
sqlSession.commit();
} else {
System.out.println("삭제 작업 실패!!!");
sqlSession.rollback();
}
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
sqlSession.close();
}
}
}
- selectList
select의 경우 실행한 결과값을 담을 객체타입 지정이 필수다.
<?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="memberTest">
<select id="selectAllMember" resultType="kr.or.ddit.member.vo.MemberVO">
select mem_id as memId,
mem_name as memName,
mem_tel as memTel,
mem_addr as memAddr
from mymember
</select>
</mapper>
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.time.Period;
import java.util.List;
import org.apache.ibatis.exceptions.PersistenceException;
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 kr.or.ddit.member.vo.MemberVO;
public class MybatisTest {
public static void main(String[] args) {
// 1. myBatis의 환경설정 파일을 읽어와 실행시킨다.
SqlSessionFactory sqlSessionFactory = null;
try {
// 1-1. xml 설정문서 읽어오기
Charset charset = Charset.forName("UTF-8"); // 설정파일의 한글처리를 위해서...
Resources.setCharset(charset);
// 반드시 설정 파일을 넣어야 함. xml형식 고정
Reader rd = Resources.getResourceAsReader("config/mybatis-config.xml");
// 1-2. 위에서 생성한 Reader객체를 사용하여 SqlSessionFactory 객체 생성한다.
sqlSessionFactory = new SqlSessionFactoryBuilder().build(rd);
rd.close(); // 사용한 스트림 객체 닫아주기
} catch (IOException ex) {
ex.printStackTrace();
}
/////////////////////////////////////////////////////////////////////
// 2. 실행한 SQL문이 있는 쿼리문을 지정하여 원하는 작업을 수행한다.
// 2-4. select 연습
// 1) 응답결과가 여러개일 경우
System.out.println("select 연습 시작(결과가 여러개인 경우)...");
// 응답결과가 여러개일 경우에는 selectList를 사용한다.
sqlSession = sqlSessionFactory.openSession(true);
try {
List<MemberVO> memList =
sqlSession.selectList("memberTest.selectAllMember");
for (MemberVO mv3 : memList) {
System.out.println("ID : " + mv3.getMemId());
System.out.println("이름 : " + mv3.getMemName());
System.out.println("전화 : " + mv3.getMemTel());
System.out.println("주소 : " + mv3.getMemAddr());
System.out.println("=========================================");
}
System.out.println("출력 작업 끝...");
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
sqlSession.close();
}
}
}
- selectOne
<?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="memberTest">
<select id="getMember" resultType="kr.or.ddit.member.vo.MemberVO">
select mem_id as memId,
mem_name as memName,
mem_tel as memTel,
mem_addr as memAddr
from mymember
where mem_id = #{memId}
</select>
</mapper>
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.time.Period;
import java.util.List;
import org.apache.ibatis.exceptions.PersistenceException;
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 kr.or.ddit.member.vo.MemberVO;
public class MybatisTest {
public static void main(String[] args) {
// 1. myBatis의 환경설정 파일을 읽어와 실행시킨다.
SqlSessionFactory sqlSessionFactory = null;
try {
// 1-1. xml 설정문서 읽어오기
Charset charset = Charset.forName("UTF-8"); // 설정파일의 한글처리를 위해서...
Resources.setCharset(charset);
// 반드시 설정 파일을 넣어야 함. xml형식 고정
Reader rd = Resources.getResourceAsReader("config/mybatis-config.xml");
// 1-2. 위에서 생성한 Reader객체를 사용하여 SqlSessionFactory 객체 생성한다.
sqlSessionFactory = new SqlSessionFactoryBuilder().build(rd);
rd.close(); // 사용한 스트림 객체 닫아주기
} catch (IOException ex) {
ex.printStackTrace();
}
/////////////////////////////////////////////////////////////////////
// 2. 실행한 SQL문이 있는 쿼리문을 지정하여 원하는 작업을 수행한다.
// 2-4. select 연습
// 1) 응답결과가 여러개일 경우
// 2) 응답결과가 1개일 경우
System.out.println("select 연습(결과값이 1개가 확실한 경우)...");
sqlSession = sqlSessionFactory.openSession(true);
try {
MemberVO mv4 = sqlSession.selectOne("memberTest.getMember", "a001");
System.out.println("ID : " + mv4.getMemId());
System.out.println("이름 : " + mv4.getMemName());
System.out.println("전화 : " + mv4.getMemTel());
System.out.println("주소 : " + mv4.getMemAddr());
System.out.println("=========================================");
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
sqlSession.close();
}
}
}
회원정보 관리 프로그램
=> Dao의 기능을 하는 Mybatis를 이용하여 변경한다.
기존에 있던 프로그램을 응용하여 추가 및 수정한다.
package kr.or.ddit.member.dao;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.session.SqlSession;
import kr.or.ddit.member.vo.MemberVO;
import kr.or.ddit.util.MyBatisUtil;
public class MemberDaoImpl implements IMemberDao{
private static IMemberDao memDao;
private MemberDaoImpl() {
}
public static IMemberDao getInstance() {
if(memDao == null) {
memDao = new MemberDaoImpl();
}
return memDao;
}
@Override
public int insertMember(MemberVO mv) {
SqlSession session = MyBatisUtil.getSqlSession();
int cnt = 0;
try {
cnt = session.insert("member.insertMember", mv);
if(cnt > 0) {
session.commit();
}
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
session.close();
}
return cnt;
}
@Override
public int updateMember(MemberVO mv) {
SqlSession session = MyBatisUtil.getSqlSession();
int cnt = 0;
try {
cnt = session.update("member.updateMember", mv);
if(cnt > 0) {
session.commit();
}
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
session.close();
}
return cnt;
}
@Override
public boolean checkMember(String memId) {
SqlSession session = MyBatisUtil.getSqlSession(true);
boolean isExist = false;
try {
int cnt = session.selectOne("member.checkMember", memId);
if(cnt > 0) {
isExist = true;
}
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
session.close();
}
return isExist;
}
@Override
public int deleteMember(String memId) {
SqlSession session = MyBatisUtil.getSqlSession();
int cnt = 0;
try {
cnt = session.delete("member.deleteMember", memId);
if(cnt > 0) {
session.commit();
}
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
session.close();
}
return cnt;
}
@Override
public List<MemberVO> getAllMember() {
SqlSession session = MyBatisUtil.getSqlSession(true);
List<MemberVO> memList = new ArrayList<MemberVO>();
try {
memList = session.selectList("member.selectAllMember");
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
session.close();
}
return memList;
}
@Override
public List<MemberVO> searchMember(MemberVO mv) {
SqlSession session = MyBatisUtil.getSqlSession(true);
List<MemberVO> memList = new ArrayList<MemberVO>();
try {
memList = session.selectList("member.searchMember", mv);
} catch (PersistenceException ex) {
ex.printStackTrace();
} finally {
session.close();
}
return memList;
}
}
package kr.or.ddit.util;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 1-1. xml 설정문서 읽어오기
Charset charset = Charset.forName("UTF-8"); // 설정파일의 한글처리를 위해서...
Resources.setCharset(charset);
// 반드시 설정 파일을 넣어야 함. xml형식 고정
Reader rd = Resources.getResourceAsReader("config/mybatis-config.xml");
// 1-2. 위에서 생성한 Reader객체를 사용하여 SqlSessionFactory 객체 생성한다.
sqlSessionFactory = new SqlSessionFactoryBuilder().build(rd);
rd.close(); // 사용한 스트림 객체 닫아주기
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* SqlSesson객체를 제공하는 메서드
* @return SqlSession객체
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
/**
* SqlSession객체를 제공하는 메서드
* @param autoCommit 오토커밋 여부
* @return SqlSession객체
*/
public static SqlSession getSqlSession(boolean autoCommit) {
return sqlSessionFactory.openSession(autoCommit);
}
}
member.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="member">
<!--
이 영역에 sql문에 맞는 태그를 사용하여 SQL문을 기술한다.
사용할 수 있는 기본적인 태그들
<select> ~~~ </select>
<insert> ~~~ </insert>
<update> ~~~ </update>
<delete> ~~~ </delete>
위 태그에서 사용되는 주요 속성들
1) id : 해당 태그를 호출할 때 namespace값과 연결하여 사용하는 id값
2) parameterType : 파라미터 객체의 타입정보를 지정한다.
(보통 VO클래스명, 자바의 데이터타입 등이 사용된다. ALias명 사용 가능함.)
3) resultType : select문을 실행한 결과값을 담을 객체타입을 지정한다.
(보통 VO클래스명, 자바의 데이터타입 등이 사용된다. ALias명 사용 가능함.)
4) resultMap : 결과 레코드 컬럼명과 VO객체의 속성명이 다를 경우에 적절한 매핑을 위해 사용한다.
-->
<insert id="insertMember" parameterType="kr.or.ddit.member.vo.MemberVO">
insert into mymember
(mem_id, mem_name, mem_tel, mem_addr)
values (#{memId}, #{memName}, #{memTel}, #{memAddr})
</insert>
<update id="updateMember" parameterType="kr.or.ddit.member.vo.MemberVO">
update mymember
set mem_name = #{memName},
mem_tel = #{memTel},
mem_addr = #{memAddr}
where mem_id = #{memId}
</update>
<delete id="deleteMember" parameterType="String">
delete from mymember where mem_id = #{오병준}
</delete>
<select id="selectAllMember" resultType="kr.or.ddit.member.vo.MemberVO">
select mem_id as memId,
mem_name as memName,
mem_tel as memTel,
mem_addr as memAddr
from mymember
</select>
<select id="getMember" resultType="kr.or.ddit.member.vo.MemberVO">
select mem_id as memId,
mem_name as memName,
mem_tel as memTel,
mem_addr as memAddr
from mymember
where mem_id = #{memId}
</select>
<select id="checkMember" resultType="int">
select count(*) as cnt
from mymember
where mem_id = #{memId}
</select>
<select id="searchMember">
select * from mymember where 1=1
<if test='memId != null and memId != ""'>
and mem_id = #{memId}
</if>
<if test='memName != null and !memName.equals("")'>
and mem_name = #{memName}
</if>
<if test='memTel != null and !memTel.equals("")'>
and mem_tel = #{memTel}
</if>
<if test='memAddr != null and !memAddr.equals("")'>
and mem_addr like '%' || #{memAddr} || '%'
</if>
</select>
</mapper>
package kr.or.ddit.member.service;
import java.util.List;
import kr.or.ddit.member.dao.IMemberDao;
import kr.or.ddit.member.dao.MemberDaoImpl;
import kr.or.ddit.member.dao.MemberDaoImplForJDBC;
import kr.or.ddit.member.vo.MemberVO;
public class MemberServiceImpl implements IMemberService{
private static IMemberService memService;
private IMemberDao memDao;
public static IMemberService getInstance() {
if(memService == null) {
memService = new MemberServiceImpl();
}
return memService;
}
private MemberServiceImpl() {
memDao = MemberDaoImpl.getInstance();
}
@Override
public int registMember(MemberVO mv) {
int cnt = memDao.insertMember(mv);
return cnt;
}
@Override
public int modifyMember(MemberVO mv) {
int cnt = memDao.updateMember(mv);
return cnt;
}
@Override
public boolean checkMember(String memId) {
return memDao.checkMember(memId);
}
@Override
public int removeMember(String memId) {
int cnt = memDao.deleteMember(memId);
return cnt;
}
@Override
public List<MemberVO> displayMember() {
return memDao.getAllMember();
}
@Override
public List<MemberVO> searchMember(MemberVO mv) {
return memDao.searchMember(mv);
}
}
반응형
'자바' 카테고리의 다른 글
[Java 고급] 21장 W3C DOM, 유스케이스 다이어그램 (0) | 2024.02.13 |
---|---|
[Java 고급] 20장 로깅 (0) | 2024.02.08 |
[Java 고급] 18장 Singleton 패턴 (0) | 2024.02.07 |
[Java 고급] 17장 MVC 패턴 (0) | 2024.02.06 |
[Java 고급] 16장 JDBC (0) | 2024.02.02 |