객체 지향 언어인 자바의 관계형 데이터베이스(RDBMS) 프로그래밍을
좀 더 쉽게 할 수 있도록 도와주는 개발 프레임 워크
JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화 하고,
일반 SQL 쿼리, 저장 프로시저 및 고급 매핑을 지원한다.
MyBatis에서는 프로그램에 있는 SQL 쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 강점을 가진다.
MyBatis 는 기존 JDBC방식과 달리 SQL문은 XML 파일에 작성함으로써 코드가 줄어들고 SQL문만 따로 관리하기 때문에
수정이 편해진다.
select
성공 : select문에 해당하는 결과
실패 : error
insert
성공 : 1 (여러건이여도 1)
실패 : error
update
성공 : update 된 행의 개수 반환 (없다면 0)
실패 : error
delete
- 성공 : delete된 행의 개수 반환 (없다면 0)
- 실패 : error
파란부분은 MyBatis가 제공
보라색 부분만 개발자의 역할
서버가 올라갈 때 한 번만 실행 됨
1) SqlSession Factory 빌드
2) 정보 설정 파일
3) 설정한 정보를 읽어와서 SqlSession Factory 객체 생성
요청이 들어올 때마다 실행 됨
4) 사용자가 어플리케이션에 요청 보내면,
5, 6) 1번 호출하여 생성해 놓은 SqlSession Factory 객체 호출
7) 어플리케이션에 세션 값 보내줌
8, 9) 인터페이스가 있다면 8번을 거치고, 인터페이스가 없다면
10) 어플리케이션에서 바로 10으로 가서 실행
설정 파일 생성 config.xml
MyBatis 공식 PDF 파일에서
이 부분 복붙하기
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>
DB 접속정보 부분을 DB Pool을 설정했던 context.xml 과 동일하게 수정하기!
context.xml
<Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource" driverClassName = "oracle.jdbc.driver.OracleDriver" url= "jdbc:oracle:thin:@localhost:1521:xe" username= "jsp" password="jsp" maxActive="20" maxIdle= "20" maxWait= "-1" />
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <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:@localhost:1521:xe"/> <property name="username" value="jsp"/> <property name="password" value="jsp"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/koit/web/sql/user.xml"/> </mappers> </configuration>
- xml 파일의 경로 가져오기
- properties 클릭
- 빨간 부분만 복붙하면 알아서 경로로 출력!
package com.koit.web.mybatis; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class SqlMapConfig { private static SqlSessionFactory factory; // 클래스 초기화 블럭 (클래스가 처음 로딩될 때 한번만 수행된다.) // 클래스가 로딩될 때 SqlSessionFactory 객체 생성 static { try { //설정 파일의 경로 입력 String resource = "./com/koit/web/mybatis/config.xml"; // 설정 파일의 경로 읽어오기 Reader reader = Resources.getResourceAsReader(resource); // 리더로 읽어온 객체를 빌드 factory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); } } // 클래스가 로딩될 때 만들어진 SqlFactory 객체를 리턴받는 메서드 public static SqlSessionFactory getFatory() { return factory; } }
<?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="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper>
외부에서 sql문이 있는 이 찾기 위한 방법은 namespace 값이다.
UserDAO 파일의 sql문 분리하기
쿼리문에서 파라미터 값 받을 때, #{파라미터} 로 표시
파라미터의 타입 String 은 string으로 사용해야함.
resulType 은 쿼리문이 반환하는 count 수이므로 _int
UserDAO sql문 xml파일로 분리할 때,
xml 파일의 "namespace.id값"
으로 쿼리문의 위치를 찾는다.
![]
<?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="User"> <select id="checkId" parameterType="string" resultType="_int"> SELECT COUNT(*) FROM TBL_USER tu WHERE USERID = #{userid} </select> <insert id="join" parameterType="com.koit.web.beans.UserBean" > INSERT INTO TBL_USER values (#{userid}, #{userpw}, #{username}, #{usergender}, #{userphone}) </insert> <select id="login" parameterType="hashmap" resultType="com.koit.web.beans.UserBean"> SELECT * FROM TBL_USER tu WHERE USERID = #{userid} AND USERPW = #{userpw} </select> </mapper>
package com.koit.web.dao; import java.sql.SQLException; import java.util.HashMap; import javax.naming.InitialContext; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.koit.web.beans.UserBean; import com.koit.web.mybatis.SqlMapConfig; public class UserDAO { SqlSessionFactory factory = SqlMapConfig.getFactory(); SqlSession sqlsession; public UserDAO() { //생성자 sqlsession = factory.openSession(true); // true : auto commit } public boolean join(UserBean user) { boolean result = false; int count = 0; count = sqlsession.insert("User.join", user); if(count >= 1) { result= true; }else { result= false; } return result; } public UserBean login(String userid, String userpw) { HashMap<String, String> datas = new HashMap<>(); datas.put("userid", userid); datas.put("userpw", userpw); UserBean user = sqlsession.selectOne("User.login", datas); return user; } public boolean checkId(String userid) { boolean result = false; int count; count = sqlsession.selectOne("User.checkId", userid ); if(count >= 1) { // 이미 가입한 사람이 있다. result = true; } return result; } }