데이터의 입력, 조회, 수정, 삭제(CRUD)를 보다 편하게 하기 위해 xml로 구조화하여 Mapper 설정 파일을 통해서 JDBC를 구현한 영속성 프레임 워크
xml 파일 생성시 config 파일인지 mapper 파일인지 명시하는 설정
Preferences
> XML
> XML Catalog
> User Specified Entries
> Add...
config.dtd
Location : http://mybatis.org/dtd/mybatis-3-config.dtd
Key : //mybatis.org//DTD Config 3.0//EN
mapper.dtd
Location : http://mybatis.org/dtd/mybatis-3-mapper.dtd
Key : //mybatis.org/DTD Mapper 3.0//EN
Apply and Close
Create XML file from a DTD file
> select XML Catalog entry
> 1번에서 설정한 Key, URI 선택typeAliases
: 매칭할 mapper의 sql태그의 parmeter Type 별칭 설정type
(parmeter Type)을 alias
로 설정environments
: DB 연결 설정mappers
: mapper.xml 파일 연결resourse
로 연결<?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>
<!--mapper에서 매칭할 parmeter Type 별칭 설정-->
<typeAliases>
<typeAlias type="kr.or.iei.student.model.vo.Student" alias="student"/>
</typeAliases>
<environments default="development">
<!-- environment id를 구분하여 연결할 DB를 여려개 구성할 수 도 있음 -->
<environment id="development">
<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="mybatis"/>
<property name="password" value="mybatis"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="/student/student-mapper.xml"/>
</mappers>
</configuration>
mabatis-mapper.xml
mapper 태그의 namespace
속성 설정
sql문을 담은 태그 설정
id
속성 설정
parameterType
속성 설정
가져오는 파라미터값 설정: ${ } 형태와 #{ } 형태를 이용
${ }
: 데이터에 따른 ‘ ‘ (문자열) 처리를 해주지 않는다 - Statement방식#{ }
: 자동으로 데이터 타입 처리 - PreparedStatement (위치홀더 방식)추후 DAO에서 (namespace.id
, [parameterType]
) 를 이용하여 연결함
<?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="mybatis">
<insert id="studentInsert">
INSERT INTO STUDENT VALUES(student_seq.nextval, '김말똥','01022223333','mal@naver.com','서울시 양천구',default)
</insert>
<insert id="studentInsertValue" parameterType="student">
INSERT INTO STUDENT VALUES(student_seq.nextval, #{studentName},#{studentTel},#{studentEmail},#{studentAddr},default)
</insert>
</mapper>
getSqlSession 메소드 생성
팩토리 패턴 이용하여 객체 생성
1) InputStream 객체 생성 : config.xml 파일의 위치인 resource를 통하여 생성
InputStream is = Resources.getResourceAsStream(resource);
2) SqlSessionFactoryBuilder 객체 생성
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
3) SqlSesionnFactory 객체 생성 : SqlSessionFactoryBuilder 객체, InputStream 객체 이용
SqlSessionFactory factory = builder.build(is);
4) SqlSession 객체 생성 후 리턴
SqlSession session= factory.openSession(false);
// mybatis 에서는 DB에 연동하는 Connection객체를 SqlSession이라 부른다.
private SqlSession getSqlSession() {
// getSqlSession의 역할
// XML 파일을 연결하여 XML 파일 정보를 바탕으로 DB와 연결하고, 해당 Connection(SqlSession)을 리턴하는 역할
SqlSession session = null;
String resource = "/mybatis-config.xml";
try {
InputStream is = Resources.getResourceAsStream(resource);
// SqlSession을 생성하려면 Mybatis에서는 팩토리 패턴이라는 것을 사용해서 객체를 만듭니다.
// 팩토리 패턴이라는 것은 바로 생성하는게 아니라 특정 객체를 셍성하기 위한 팩토리를 먼저 만들고,
// 그 뒤에 해당 특정 객체를 생성하는 방법
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
session = factory.openSession(false);
// openSession 이라는메소드는 세션을 가져오는 메소드
// 세션을 생성하고 가져올때,
// 인자 값 true 혹은 빈 인자값 : AutoCommit이 활성화된 상태
// 인자 값 false: AutoCommit을 비활성화된 상태
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return session;
}
<h1>Mybatis 테스트</h1>
<a href="/student/mybatis1.do">1. 학생 정보 추가하기 (입력 NO)</a><br>
<hr>
<h3>2. 입력한 학생정보를 DB에 저장하는 로직 처리하기</h3>
<form action="/student/mybatis2.do" method="post">
이름 : <input type="text" name="studentName"/><br>
전화번호 : <input type="text" name = "studentTel"><br>
이메일 : <input type="text" name = "studentEmail"><br>
주소 : <input type="text" name = "studentAddr"><br>
<input type="submit" value="전송"><br>
</form>
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 현재 예제 코드는 Mybatis에 대한 동작원리 및 개념을 이해하기 위한 실습
// insert라 하더라도 입력 받은 것은 없다(기본 정적 데이터 저장 처리)
StudentService sService = new StudentService();
int result = sService.insertStudent();
if (result > 0) {
System.out.println("insert 로직 처리 성공");
} else {
System.out.println("insert 로직 처리 실패");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String studentName = request.getParameter("studentName");
String studentTel = request.getParameter("studentTel");
String studentEmail = request.getParameter("studentEmail");
String studentAddr = request.getParameter("studentAddr");
Student s = new Student();
s.setStudentName(studentName);
s.setStudentTel(studentTel);
s.setStudentEmail(studentEmail);
s.setStudentAddr(studentAddr);
StudentService sService = new StudentService();
int result = sService.insertStudent(s);
if (result > 0) {
System.out.println("입력받아서 처리한 결과 : 성공");
} else {
System.out.println("입력받아서 처리한 결과 : 실패");
}
}
package kr.or.iei.student.model.service;
import java.io.IOException;
import java.io.InputStream;
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.iei.student.model.dao.StudentDAO;
import kr.or.iei.student.model.vo.Student;
public class StudentService {
private StudentDAO sDAO = new StudentDAO();
// mybatis 에서는 DB에 연동하는 Connection객체를 SqlSession이라 부른다.
private SqlSession getSqlSession() {
// getSqlSession의 역할
// XML 파일을 연결하여 XML 파일 정보를 바탕으로 DB와 연결하고, 해당 Connection(SqlSession)을 리턴하는 역할
SqlSession session = null;
String resource = "/mybatis-config.xml";
try {
InputStream is = Resources.getResourceAsStream(resource);
// SqlSession을 생성하려면 Mybatis에서는 팩토리 패턴이라는 것을 사용해서 객체를 만듭니다.
// 팩토리 패턴이라는 것은 바로 생성하는게 아니라 특정 객체를 셍성하기 위한 팩토리를 먼저 만들고,
// 그 뒤에 해당 특정 객체를 생성하는 방법
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
session = factory.openSession(false);
// openSession 이라는메소드는 세션을 가져오는 메소드
// 세션을 생성하고 가져올때,
// 인자 값 true 혹은 빈 인자값 : AutoCommit이 활성화된 상태
// 인자 값 false: AutoCommit을 비활성화된 상태
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return session;
}
public int insertStudent() {
// getSqlSession 메소드를 호출하여 DB와 연동된 SqlSession값을 가져와함
SqlSession session = getSqlSession();
int result = sDAO.insetStudent(session);
if (result > 0) {
session.commit();
} else {
session.rollback();
}
session.close();
return result;
}
public int insertStudent(Student s) {
SqlSession session = getSqlSession();
int result = sDAO.insetStudent(session, s);
if (result > 0)
session.commit();
else
session.rollback();
session.close();
return result;
}
}
package kr.or.iei.student.model.dao;
import org.apache.ibatis.session.SqlSession;
import kr.or.iei.student.model.vo.Student;
public class StudentDAO {
public int insetStudent(SqlSession session) {
// int result = session.insert("mybatis.studentInsert");
// return result;
// student-mapper.xml의 mapper 태그 namespace 값과 해당 insert태그 id 값으로 연결
return session.insert("mybatis.studentInsert");
}
public int insetStudent(SqlSession session, Student s) {
return session.insert("mybatis.studentInsertValue", s);
}
}
package kr.or.iei.student.model.vo;
import java.sql.Date;
public class Student {
private int studentNo;
private String studentName;
private String studentTel;
private String studentEmail;
private String studentAddr;
private Date regDate;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int studentNo, String studentName, String studentTel, String studentEmail, String studentAddr,
Date regDate) {
super();
this.studentNo = studentNo;
this.studentName = studentName;
this.studentTel = studentTel;
this.studentEmail = studentEmail;
this.studentAddr = studentAddr;
this.regDate = regDate;
}
public int getStudentNo() {
return studentNo;
}
public void setStudentNo(int studentNo) {
this.studentNo = studentNo;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentTel() {
return studentTel;
}
public void setStudentTel(String studentTel) {
this.studentTel = studentTel;
}
public String getStudentEmail() {
return studentEmail;
}
public void setStudentEmail(String studentEmail) {
this.studentEmail = studentEmail;
}
public String getStudentAddr() {
return studentAddr;
}
public void setStudentAddr(String studentAddr) {
this.studentAddr = studentAddr;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
}