jsp 10강 mybatis, 한줄메모장(목록,글쓰기,수정,삭제)
https://www.youtube.com/watch?v=6BLEkwVIMVs&list=PLY9pe3iUjRrSyS0L2w9p7D0Okt1I5inys&index=10
MyBatis
1) 개발자가 지정한 SQL, 저장 프로시저를 지원하는 프레임워크
2) 프로그램 소스 안에 SQL문을 작성하던 기존 JDBC 방식과 달리 SQL문을 프로그램에서 분리하여
XML 파일에 별도로 작성
3) mybatis 의 장점
- 코딩량 절감
- 간편한 유지보수 :
SQL을 변경하고자 할 경우 기존처럼 프로그램을 수정하는 것이 아니라
XML 파일의 SQL문만을 변경하면 되기 때문에 SQL 변환이 자유로움
4) ibatis 라는 이름으로 2.5까지 개발
MyBatis 설정방법
1) mybatis jar파일 lib폴더에 복사 ( maven 방식이면 X )
2) MybatisManager.java : mybatis framework 실행할 수 있는 세션 생성 코드(여기서 sqlSession 객체 생성)
3) sqlMapConfig.xml : mybatis 기본 설정 파일 //설정 파일
4) mapper 파일 : 실제 sql query 문장을 입력 //쿼리 파일
jsp04 프로젝트 (한줄 메모장) 구조 : MVC
web.xml ( 배치 기술서 )
Controller
- MemoController.java
Model
- MemoDTO / MemoDAO
View
- index.jsp : ajax 요청 페이지, 메모 입력
- list.jsp : 메모목록
- view.jsp : 메모 보기, 수정, 삭제 기능
+★★★★★
sqlmap.sqlMapConfig.xml : MyBatis기본 설정 파일
sqlmap.MubatisManager.java : sqlMapConfig.xml 설정파일을 읽어들여서 sql을 실행할 수 있는 객체(sqlSession) 생성
memo.xml을 인식할 수 있도록 맵핑
+ memo.xml : sql이 모여있다. namespace와 태그 id로 구별
sqlmap.sqlMapConfig.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | //현재 문서가 XML 문서라는 XML 지시어 <?xml version="1.0" encoding="UTF-8"?> // xml은 1. 데이터 전달 목적의 xml 2. 설정 정보 저장하는 xml // DOCTYPE!은 문서에 대한 정보를 기록하는 문서 규약 (mybatis의 설정파일이라는 것을 알려줌) <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> // 알리아스 : 클래스 이름이 길때 줄임말 설정해줌. 이 프로젝트에선 사용 X <typeAliases> </typeAliases> //DB연결 참조. 여기서 연결 설정해도되지만 context.xml에 커넥션풀 설정해놓은게 있으므로 가져다쓴다. <environments default=""> <environment id=""> <transactionManager type="JDBC" /> <dataSource type="JNDI"> <property name="data_source" value="java:comp/env/oraDB" /> </dataSource> </environment> </environments> //실제 sql 쿼리 맵핑 //서버가 올라올때 이 sqlMapConfig를 가장 먼저 읽어들여 매퍼 리소스를 읽고 쿼리를 맵핑한다. <mappers> <mapper resource="memo/mapper/memo.xml" /> </mappers> </configuration> <!-- <mapper resource="emp/mapper/emp.xml" /> <mapper resource="student/mapper/student.xml" /> <mapper resource="student/mapper/dept.xml" /> <mapper resource="student/mapper/prof.xml" /> <mapper resource="student/mapper/lecture.xml" /> <mapper resource="memo/mapper/memo.xml" /> --> | cs |
*Server의 context.xml에 커넥션풀 등록돼있음
1 2 3 4 5 6 7 8 9 | <Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> <Resource name="oraDB" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver" loginTimeout="10" maxWait="5000" username="system" password="123456" url="jdbc:oracle:thin:@localhost:1521:xe"/> </Context> | cs |
sqlmap.MybatisManager.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package sqlmap; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisManager { //싱글톤 패턴으로 sqlSession 객체 하나만 만들기 private static SqlSessionFactory instance; // 필드와 생성자 모두 프라이빗 처리로 외부 접근 막는다. private MybatisManager() {} //생성자 public static SqlSessionFactory getInstance() { Reader reader=null; try { reader=Resources.getResourceAsReader("sqlmap/sqlMapConfig.xml"); instance=new SqlSessionFactoryBuilder().build(reader); } catch (Exception e) { e.printStackTrace(); } finally { try { if(reader != null) reader.close(); } catch (Exception e2) { e2.printStackTrace(); } } return instance; } } | cs |
SqlSessionFactory와 SqlSession은 MyBatis.jar 내에 정의된 클래스
(reader로 DB연동 등 mybatis 설정 정보를 읽고 SqlSessionFactory객체에 reader정보를 준다.)
Reader타입 reader 변수에 리소스를 담고 ( Resources.getResourceAsReader ( " 읽어들일 리소스 " ) )
SqlSessionFactoryBuilder()로 생성된 객체의 build메서드로 리소스를 담은 reader 객체를 읽어들인 후
sqlSessionFactory타입 instance 변수에 담는다.
mybatis 설정 정보를 담은 이 싱글톤 객체(sqlFactory)를 사용하여 sqlSession을 생성할 수 있다.
//공장은 하나만 있으면되니까 싱글톤으로 생성 (메모리 절약)
MemoDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class MemoDAO { public List<MemoDTO> list(){ //sqlSession 객체 생성 SqlSession session=MybatisManager.getInstance().openSession(); //DTO형식의 리스트 변수에 sqlsession.selectList("네임스페이스.sql명령어의 id") //selectList는 레코드셋을 리스트로 리턴한다. List<MemoDTO> items=session.selectList("memo.list"); //memo.xml에서 <select resultType="memo.dto.MemoDTO" id="list">가 sql을 담고있음 session.close(); return items; } } | cs |
memo namespace의 태그id=list를 실행
( memo.xml의 namespace를 읽을 수 있도록 sqlMapConfig.xml(mybatis 설정파일)에서 memo.xml를 맵핑했다.)
memo.xml (sql을 모아놓음)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"> //데이터만 담긴 xml은 !DOCTYPE 필요 없다. 설정 정보를 담을 때만 사용 //List<MemoDTO> items=session.selectList("memo.list"); -<mapper namespace="memo"> <!-- id="태그의 id" resultType="결과자료형" --> <!-- 달러{변수명} ==> 따옴표 처리를 하지 않음, 샵{변수명} ==> 따옴표 처리를 함 --> <select resultType="memo.dto.MemoDTO" id="list"> //List에 담기는 타입(resultType), 변수명(id) SELECT idx,writer,memo,post_dateFROM memowhere ${searchkey} like '%' ||#{search} || '%'ORDER BY idxdesc </select> <select resultType="memo.dto.MemoDTO" id="listAll"> SELECT idx,writer,memo,post_dateFROM memowhere writer like '%' || #{search}|| '%'or memo like '%' ||#{search} || '%'ORDER BY idx desc </select> <!-- 메모 갯수를 계산하는 구문 --> <select resultType="int" id="count"> select count(*) from memowhere${searchkey} like '%' || #{search} || '%' </select> <select resultType="int" id="countAll"> select count(*) from memowherewriter like '%' || #{search} || '%'or memolike '%' || #{search}|| '%' </select> <!-- 게시물 번호에 대한 메모 레코드 정보 --> <select resultType="memo.dto.MemoDTO" id="view"> select * from memo whereidx=#{idx} </select> <!-- resultType="결과 자료형" parameterType="입력매개변수 자료형" 달러{변수명} 달러{writer} ==>MemoDto.java의 getWriter() 호출 --> <insert id="insert">insert into memo ( idx,writer, memo ) values( (selectnvl(max(idx)+1, 1) from memo),#{writer}, #{memo} ) </insert> <update id="update">update memo setwriter=#{writer}, memo=#{memo}whereidx=#{idx} </update> <delete id="delete">delete from memo whereidx=#{idx} </delete> </mapper> | cs |
'JSP > JSP & Servlet ' 카테고리의 다른 글
JSTL : varStatus (0) | 2019.07.11 |
---|---|
JSTL : 조건문 <c:if> <c:choose> <c:when> <c:otherwise> 태그 (0) | 2019.07.11 |
MVC패턴 게시판 만들기 - 답글달기 (0) | 2019.05.26 |
MVC패턴 게시판 만들기 - 글보기 (0) | 2019.05.24 |
MVC패턴 게시판 만들기 - 글쓰기 (0) | 2019.05.24 |