티스토리 뷰
Mybatis 프레임워크 특징
- 한두 줄의 자바코드로 DB 연동을 처리한다.
- SQL 명령어를 자바 코드에서 분리하여 XML 파일에 따로 관리한다.
1. Java ORM Plugin 설치
- Mybatis와 관련된 복잡한 XML 설정 파일들을 자동으로 만들고 관리할 수 있다.
- Eclipse Marketplace에서 설치
2. 프로젝트 생성
1) file > new > Spring Legacy Project > project name : MybatisProject
2) 프로젝트 우클릭 > properties > project Facets > convert to faceted form > java : 1.8 선택 > runtimes : jdk1.8.~~ 선택
3) DB 연동을 위한 H2 Driver, mybatis, iBatis 라이브러리들을 내려받는다.
> 교재엔 1.4.191로 나와 있는데 이걸로 하면
Cause: org.apache.ibatis.transaction.TransactionException: Error configuring AutoCommit. Your driver may not support getAutoCommit() or setAutoCommit(). Requested setting: false.
위와 같은 에러가 발생하여 실행이 되지 않는다. 이것 때문에 몇일을 삽질했네ㅡㅡ^
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <!-- pom.xml --> <!-- H2 Driver --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.196</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.1</version> </dependency> <!-- Ibatis --> <dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-core</artifactId> <version>3.0</version> </dependency> | cs |
3. VO(Value Object) 클래스 작성
- 기존 게시판 프로젝트에서 사용하던 BoardVO와 같은 내용이다.
- getter/setter 부분만 있으면 된다.
4. SQL Mapper XML 파일 작성
1) 프로젝트 우클릭 > new > other > Java ORM Plugin > Mybatis Mapper XML > MyBatis Mapper name : board-mapping.xml
2) 위의 파일을 src/main/resources의 mappings 패키지 생성 후 이동시킨다.
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 | <!-- board-mapping.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="BoardDAO"> <insert id="insertBoard"> insert into board(seq, title, writer, content) values((select nvl(max(seq), 0)+1 from board),#{title},#{writer},#{content}) </insert> <update id="updateBoard"> update board set title=#{title}, content=#{content} where seq=#{seq} </update> <delete id="deleteBoard"> delete board where seq=#{seq} </delete> <select id="getBoard" resultType="board"> select * from board where seq=#{seq} </select> <select id="getBoardList" resultType="board"> select * from board where title like '%'||#{searchKeyword}||'%' order by seq desc </select> </mapper> | cs |
5. Mybatis 환경설정 파일
1) 프로젝트 우클릭 > new > other > Java ORM Plugin > Mybatis Configuration XML > Container : /MybatisPorject , MyBatis Configuration name : sql-map-config.xml
2) src폴더에 db.properties / sql-map-config.xml 파일이 생성되는데 src/main/resource 폴더로 이동시킨다.
- <properties> 엘리먼트는 XML 설정에서 사용할 프로퍼티를 선언하거나 외부 프로퍼티 파일을 참조할 때 사용한다. 이렇게 선언된 프로퍼티는 {프로퍼티 이름}"으로 참조하여 사용한다.
- <typeAliases> 엘리먼트는 <typeAlias>를 여러 개 가질 수 있으며, 특정 클래스의 별칭을 선언할 수 있다. 이 별칭은 SqlMapper에서 사용할수 있으며 Sql Mapping 파일의 크기를 줄여주기도 하고 설정을 간단히 처리할 수도 있다.
- <mappers> 엘리먼트는 여러 <mapper>를 가질 수 있으며, SQL 명령어들이 저장된 SQL파일들을 등록할 수 있다.
1 2 3 4 5 6 | <!-- db.properties --> jdbc.driverClassName=org.h2.Driver jdbc.url=jdbc:h2:tcp://localhost/~/test jdbc.username=sa jdbc.password= | cs |
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 | <!-- sql-map-config --> <?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> <!-- Properties 파일 설정 --> <properties resource="db.properties" /> <!-- Alias 설정 --> <typeAliases> <typeAlias alias="board" type="com.springbook.biz.board.BoardVO"></typeAlias> </typeAliases> <!-- DataSource 설정 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- Sql Mapper 설정 --> <mappers> <mapper resource="mappings/board-mapping.xml" /> </mappers> </configuration> | cs |
6. SqlSession 객체 생성하기
- Mybatis를 이용하여 DAO를 구현하려면 SqlSession 객체가 필요하다. 그런데 이 객체를 얻으려면 SqlSessionFactory 객체가 필요하다.
- Mybatis 메인 설정 파일인 sql-map-config.xml 파일로부터 설정 정보를 읽어 들이기 위한 입력 스트림을 생성한다.
- 그리고 나서 입력 스트림을 통해 sql-map-config.xml 파일을 읽어 SqlSessionFactory 객체를 생성한다.
- getSqlSessionInstance() 메소드는 SqlSessionFactory 객체로부터 SqlSession 객체를 얻어내어 리턴하는 메소드다.
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 | // SqlSessionFactoryBean.java package com.springbook.biz.util; import java.io.Reader; 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 SqlSessionFactoryBean { private static SqlSessionFactory sessionFactory = null; static { try { if(sessionFactory == null) { Reader reader = Resources.getResourceAsReader("sql-map-config.xml"); sessionFactory = new SqlSessionFactoryBuilder().build(reader); } } catch (Exception e) { e.printStackTrace(); } } public static SqlSession getSqlSessionInstance() { return sessionFactory.openSession(); } } | cs |
7. DAO 클래스 작성
- BoardDAO 클래스는 생성자에서 SqlSessionFactoryBean을 이용하여 SqlSession 객체를 얻어내고 있다.
- 각 메소드의 첫번째 인자는 실행될 SQL의 id정보이다. SQL Mapper에 선언된 네임스페이스와 아이디를 조합하여 아이디를 지정한다. 두번째 인자는 parameterType 속성으로 지정된 파라미터 객체이다. 단 건과 목록 조회는 selectOne(), selectList()메소드로 처리한다.
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 | // BoardDAO.java package com.springbook.biz.board.impl; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.springbook.biz.board.BoardVO; import com.springbook.biz.util.SqlSessionFactoryBean; public class BoardDAO { private SqlSession mybatis; public BoardDAO() { mybatis = SqlSessionFactoryBean.getSqlSessionInstance(); } public void insertBoard(BoardVO vo) { mybatis.insert("BoardDAO.insertBoard", vo); mybatis.commit(); } public void updateBoard(BoardVO vo) { mybatis.update("BoardDAO.updateBoard", vo); mybatis.commit(); } public void deleteBoard(BoardVO vo) { mybatis.delete("BoardDAO.deleteBoard", vo); mybatis.commit(); } public BoardVO getBoard(BoardVO vo) { return (BoardVO) mybatis.selectOne("BoardDAO.getBoard", vo); } public List<BoardVO> getBoardList(BoardVO vo) { return mybatis.selectList("BoardDAO.getBoardList", vo); } } | cs |
8. 테스트 클라이언트 작성 및 실행
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 | // BoardServiceClient.java package com.springbook.biz.board; import java.sql.SQLException; import java.util.List; import com.springbook.biz.board.BoardVO; import com.springbook.biz.board.impl.BoardDAO; public class BoardServiceClient { public static void main(String[] args) throws SQLException { BoardDAO boardDAO = new BoardDAO(); BoardVO vo = new BoardVO(); vo.setTitle("myBatis 제목3"); vo.setWriter("홍길동3"); vo.setContent("myBatis 내용입니다...3"); boardDAO.insertBoard(vo); vo.setSearchCondition("TITLE"); vo.setSearchKeyword(""); List<BoardVO> boardList = boardDAO.getBoardList(vo); for(BoardVO board : boardList) { System.out.println("---> " + board.toString()); } } } | cs |
'spring' 카테고리의 다른 글
day5 class03 스프링과 MyBatis 연동 (0) | 2019.02.24 |
---|---|
day5 class02 Mapper XML 파일 설정 (0) | 2019.02.22 |
day4 class07 데이터 변환 (0) | 2019.02.17 |
day4 class07 다국어 처리 (0) | 2019.02.16 |
day4 class05 파일 업로드 및 예외 처리 (0) | 2019.02.12 |
- Total
- Today
- Yesterday
- setter 인젝션
- 어노테이션
- NoClassDefFoundError
- ViewResolver
- java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
- @Autowired
- 의존성 주입
- LoggingEvent
- 횡단 관심
- JoinPoint
- 의존성
- Class path contains multiple SLF4J bindings
- blocking
- handlermapping
- 스프링 컨테이너
- afterCompletion
- #java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent삭제
- postHandler
- exclude-mapping
- servlet context
- XmlWebApplicationContext
- multiple SLF4J bindings
- 컨트롤러
- preHandler
- application context
- Controller
- 검색
- aspect oriented programming
- aop
- SqlSessionFactoryBean
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |