728x90
반응형
[ 구현 순서 ]
- java 프로젝트 생성
- configure > maven project 설정
- pom.xml에 MyBatis Framework 추가 ( ⇒ mybatis 환경설정 완료)
- src에 mybatis.config directory 생성
- SqlSessionConfig에
1) 사용할 클래스 정의 및 별칭 부여
2) JDBC 환경설정 (driver, url, userid, password)
3) <mapper> 태그에 SQL 정의한 Mapper xml 파일 경로 지정 - SQL Mapper xml 파일 생성 (member.xml)
- factory directory에 SqlSessionFactoryManager 생성 (메모리 로딩의 역할을 하는 factory class)
- MemberVO 생성
- MemberDAO 생성
- member.xml에 SQL문 정의
- TestMemberDAO 생성하여 실행
[ MyBatis 사용 환경 설정 ]
> pom.xml에 MyBatis framework 추가
<dependencies>
<!-- MyBatis Framework -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
> src에 MyBatis-Config 디렉토리 추가
/SqlSessionConfig.xml
1. MyBatis DataSource에 대한 설정 및 SQL 정의 xml 에 대한 매핑
2. Spring 연동 시, spring과 연동시에는 spring 설정에서 DataSource(dbcp) 를 정의한다.
<?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">
<!-- MyBatis DataSource에 대한 설정 및 SQL 정의 xml 에 대한 매핑
spring과 연동시에는 spring 설정에서 DataSource(dbcp) 를 정의한다.
-->
<configuration>
<!-- 사용할 클래스에 대한 별칭을 명시한다. -->
<typeAliases>
<typeAlias type="org.kosta.model.MemberVO" alias="mvo"/>
</typeAliases>
<!-- JDBC의 환경설정 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<!-- SQL 정의한 Mapper(xml) 파일 -->
<mappers>
<mapper resource="mybatis/config/member.xml"/>
</mappers>
</configuration>
[ 적용 ]
1. SQL SELECT (List 반환, map으로 반환, map으로 찾기, string으로 찾기)
2. SQL INSERT - vo형태로 insert 해보기, map형태로 insert 해보기
3. include를 통해 있던 sql문에 조건 추가하기
4. SQL UPDATE
> resultType="" : 한 행에 대한 데이터타입
> parameterType="" : 매개변수 타입
- 매개변수가 하나일 때는 ${value} 로 표현
- 다수 정보일 경우 ${instance 변수명}으로 표현
- map일 경우에는 ${[map의 key]}로 표현
/member.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Sql Mapper -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- name space : 필수! -->
<mapper namespace="member">
<!-- resultType="" : 한 행에 대한 데이터타입
parameterType="" : 매개변수 타입
매개변수가 하나일 때는 ${value} 로 표현
다수 정보일 경우 ${instance 변수명}으로 표현
* map일 때는 map의 key를 넣어준다.
-->
<!-- 재사용을 위한 SQL 문 -->
<sql id="selectMember">
<!-- SQL 정의 -->
SELECT id, password, name, address
FROM spring_member
</sql>
<select id="getAllMemberList" resultType="mvo">
<!-- 위에있는 sql문 include 하기 -->
<include refid="selectMember"></include>
</select>
<insert id="insertMember" parameterType="mvo">
INSERT INTO spring_member(id, password, name, address)
VALUES (#{id}, #{password}, #{name}, #{address})
</insert>
<select id="findMemberById" parameterType="string" resultType="mvo">
<include refid="selectMember"></include>
<!-- selectMember에 where 조건을 추가하여 주면 된다 -->
WHERE id=#{value}
</select>
<select id="getTotalCount" resultType="int">
SELECT COUNT(*)
FROM spring_member
</select>
<insert id="insertMemberByMap" parameterType="map">
INSERT INTO spring_member(id, password, name, address)
VALUES (#{ID}, #{PASS}, #{NAME}, #{ADDR})
</insert>
<!-- param은 하나일 경우 명시해주지 않아도 된다 -->
<select id="findMemberMapById" resultType="map">
<include refid="selectMember"></include>
WHERE id=#{value}
</select>
<!-- list로 반환받지만, 한 행의 data type이 조건이므로, string으로 지정한다 -->
<select id="getAddressKind" resultType="string">
SELECT DISTINCT address
FROM spring_member
</select>
<select id="findMemberListByAddress" parameterType="string" resultType="mvo">
<include refid="selectMember"></include>
WHERE address=#{value}
</select>
<select id="findMemberListByNameAndAddress" parameterType="mvo" resultType="mvo">
<include refid="selectMember"></include>
WHERE name=#{name} AND address=#{address}
</select>
<update id="updateMember" parameterType="mvo">
UPDATE spring_member
SET password=#{password}, name=#{name}, address=#{address}
WHERE id=#{id}
</update>
</mapper>
SQL
CREATE TABLE spring_member(
id VARCHAR2(100) PRIMARY KEY,
password VARCHAR2(100) NOT NULL,
name VARCHAR2(100) NOT NULL,
address VARCHAR2(100)
)
/model
/MemberVO.java
package org.kosta.model;
public class MemberVO {
private String id;
private String password;
private String name;
private String address;
//기본 생성자가 반드시 있어야 한다!
public MemberVO() {
super();
}
public MemberVO(String id, String password, String name, String address) {
super();
this.id = id;
this.password = password;
this.name = name;
this.address = address;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
}
}
* INSERT 시, 다수 정보 (id, password, name, address)가 전달되어야 할 때는,
VO(DTO)와 같은 MAP 형태로 전달해준다.
/MemberDAO.java
package org.kosta.model;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import factory.SqlSessionFactoryManager;
/*싱글톤 패턴 : 시스템 상에서 단 하나의 객체를 만들어서 사용하는 패턴
- 객체 생성 없이, 클래스 로딩만으로도 사용 가능하다
- 외부에서 객체 직접 생성 불가능 : public static으로 공유
*/
public class MemberDAO {
private static MemberDAO instance = new MemberDAO();
private SqlSessionFactory factory;
private MemberDAO () {
//factory : 설정파일에서 가져온다.
factory = SqlSessionFactoryManager.getInstance().getFactory();
}
public static MemberDAO getInstance() {
return instance;
}
/**
* getAllMemberList : 모든 멤버 리스트 반환
* @return List<MemberVO>
*/
public List<MemberVO> getAllMemberList(){
List<MemberVO> list = null;
SqlSession session = null;
try {
session = factory.openSession();
//session.selectList("[namespace.id]");
list = session.selectList("member.getAllMemberList");
} finally {
session.close();
}
return list;
}
/**
* insertMember : Member 추가하기
* @param MemberVO
*/
public void insertMember(MemberVO vo) {
SqlSession session = null;
try {
session = factory.openSession();
//session.isert("[namespace.id]", [parameter]);
session.insert("member.insertMember", vo);
//MyBatis는 기본 커밋모드가 수동이므로,
//commit()을 실행할때만 실제 DB에 반영된다.
// - commit()을 해주는 이유는, DB에 영향을 주기 때문에!
session.commit();
} finally {
session.close();
}
}
/**
* findMemberById : id로 멤버 정보 찾기
* @param id
* @return MemberVO
*/
public MemberVO findMemberById(String id) {
MemberVO vo = null;
SqlSession session = null;
try {
session = factory.openSession();
vo = session.selectOne("member.findMemberById", id);
} finally {
session.close();
}
return vo;
}
/**
* getTotalCount : 전체 멤버 수 반환
* @return int count
*/
public int getTotalCount() {
int count = 0;
SqlSession session = null;
try {
session = factory.openSession();
count = session.selectOne("member.getTotalCount");
} finally {
session.close();
}
return count;
}
/**
* insertMemberByMap : map 형태로 회원 추가하기
* @param map
*/
public void insertMemberByMap(Map<String, String> map) {
SqlSession session = null;
try {
session = factory.openSession(true); //auto commit !
session.insert("member.insertMemberByMap", map);
//session.commit(); //session 할당 시, auto commit으로하여, 커밋처리 별도로 필요 X
} finally {
session.close();
}
}
/**
* findMemberMapById : id로 회원정보 찾기(map형태로 반환)
* @param id
* @return Map<String, String>
*/
public Map<String, String> findMemberMapById(String id) {
Map<String, String> map = null;
SqlSession session = null;
try {
session = factory.openSession();
map = session.selectOne("member.findMemberMapById", id);
} finally {
session.close();
}
return map;
}
/**
* getAddressKind : 테이블의 회원 주소목록을 반환
* @return List<String>
*/
public List<String> getAddressKind() {
List<String> list = null;
SqlSession session = null;
try {
session = factory.openSession();
list = session.selectList("member.getAddressKind");
} finally {
session.close();
}
return list;
}
/**
* findMemberListByAddress : 주소로 회원 정보 검색
* @param address
* @return List<MemberVO>
*/
public List<MemberVO> findMemberListByAddress(String address) {
List<MemberVO> list = null;
SqlSession session = null;
try {
session = factory.openSession();
list = session.selectList("member.findMemberListByAddress", address);
} finally {
session.close();
}
return list;
}
/**
* findMemberListByNameAndAddress : 이름과 주소로 회원 정보 검색
* @param mvo
* @return List<MemberVO>
*/
public List<MemberVO> findMemberListByNameAndAddress(MemberVO mvo) {
List<MemberVO> list = null;
SqlSession session = null;
try {
session = factory.openSession();
list = session.selectList("member.findMemberListByNameAndAddress", mvo);
} finally {
session.close();
}
return list;
}
public void updateMember(MemberVO paramVO) {
SqlSession session = null;
try {
session = factory.openSession();
session.update("member.updateMember", paramVO);
session.commit();
} finally {
session.close();
}
}
}
/test
/TestMyBatis.java
package test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.kosta.model.MemberDAO;
import org.kosta.model.MemberVO;
public class TestMemberDAO {
public static void main(String[] args) {
MemberDAO dao = MemberDAO.getInstance();
MemberVO paramVO = new MemberVO("치카치카", "d", "베네딕트", "런던");
// 1. INSERT 시,
// 다수 정보 (id, password, name, address)가 전달되어야 할 때는,
// VO(DTO) 또는 MAP 형태로 전달해준다.
//insertMember(MemberVO) 실행
dao.insertMember(paramVO);
//2. 전체 회원 명단 반환받기
System.out.println("** 전체 회원 명단 **");
List<MemberVO> list = dao.getAllMemberList();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//3. id로 회원 검색 (MemberVO 반환)
// : 없으면 null, 있으면 MemberVO 반환
System.out.println("** id로 회원 정보 검색 **");
System.out.println(dao.findMemberById("cat"));
//4. 총 멤버 수 반환(int 형으로 반환)
System.out.println("** 총 멤버 수 반환 **");
System.out.println("회원 수: " + dao.getTotalCount());
//5. 회원정보 INSERT 시에 Map으로 전달
System.out.println("** 멤버 추가 후 확인 **"); Map<String, String> map = new
HashMap<String, String>();
map.put("ID", "cutedonguk");
map.put("PASS", "aa");
map.put("NAME", "이동욱");
map.put("ADDR", "경기도 광주");
dao.insertMemberByMap(map); System.out.println(dao.findMemberById("Enola"));
//6. 회원 정보 조회 시, map으로 반환
System.out.println("** id로 회원 정보 검색 (map으로 반환)**");
System.out.println(dao.findMemberMapById("Enola"));
//7. 회원 테이블의 주소 종류를 반환
System.out.println("** 회원 테이블의 주소 종류를 반환 **");
List<String> list2 = dao.getAddressKind();
for(String addr:list2)
System.out.println(addr);
//8. 주소로 회원 검색 (반환형 : List<MemberVO>)
String address="런던";
List<MemberVO> list3 = dao.findMemberListByAddress(address);
for(MemberVO vo:list3)
System.out.println(vo);
//9. 이름과 주소로 회원리스트 검색
String name="배두나";
String address2 = "서울";
MemberVO memberVO = new MemberVO();
memberVO.setName(name);
memberVO.setAddress(address2);
//MemberVO 객체를 전달해서 검색
List<MemberVO> list4 = dao.findMemberListByNameAndAddress(memberVO);
for(MemberVO vo:list4)
System.out.println(vo);
//10. 회원정보 수정
MemberVO paramVO2 = new MemberVO("json", "c", "초록이", "프라하");
dao.updateMember(paramVO2);
System.out.println(dao.findMemberById("json"));
}
}
[ 결과 ]
728x90
반응형
'Java Web Programming > 6. Spring | MyBatis' 카테고리의 다른 글
[Spring/MyBatis] Spring + MyBatis 적용 연습 2 ! (+CDATA, GROUP BY, LIKE, INSERT, Sequence 시퀀스) (0) | 2020.11.02 |
---|---|
[MyBatis/Spring] 스프링에 마이바티스 적용해보기 (0) | 2020.10.30 |
[MyBatis] MyBatis 마이바티스 개념과 적용! (2) | 2020.10.29 |
[Spring] 스프링 AOP의 Around Advice를 통한 성능 확인 (+Log4j, StopWatch 라이브러리) (0) | 2020.10.29 |
[Spring] 스프링 스탑워치(StopWatch) 라이브러리 사용법 (0) | 2020.10.29 |