spring 3
MyBatis
- SqlMapper Framework
- 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스(영속성) 프레임워크
- JDBC코드와 수동으로 셋팅하는 파라미터(전달 타입)와 결과(리턴값) 매핑을 제거
- 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정하고 매핑하기 위해 XML과 어노테이션을 사용
MyBatis 사용하기
-
WEB-INF/spring/root-context.xml
-
Namspaces에서 context 선택 후 dao, repo, service 등을 포함하는 패키지명을 다음과 같이 추가해준다
<context:component-scan base-package="패키지명"/>
-
MyBatis 사용에 필요한 객체들을 등록해준다
-
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://127.0.0.1:3306/데이터베이스명?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8"></property> <!-- 속성으로 "" 안쪽에 < or & 기호가 들어가면 안된다, 특수 기호로 변경해서 사용해야 함 & --> <property name="username" value="mysql아이디"></property> <property name="password" value="mysql비밀번호"></property> </bean> <!-- XML내에 작성된 sql문을 호출하는 객체: SqlMapClient(iBatis), SqlSession(MyBatis) --> <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:/mybatis-config.xml"></property> <!-- sql문 작성된 mapperXML문서 등록 --> <property name="mapperLocations" value="classpath:mappers/*.xml"></property> </bean> <!-- SqlSession 객체 --> <bean class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"> <constructor-arg ref="sqlSessionFactory"></constructor-arg> </bean> <!-- 모든 DAO, DAOImpl클래스는 repository 패키지 밑에 작성하겠음!! --> <context:component-scan base-package="패키지명"/> <!-- 모든 Service, ServiceImpl클래스는 service 패키지 밑에 작성하겠음!! --> <context:component-scan base-package="패키지명"/>
-
-
pom.xml
에 dependency를 추가해준다-
<!-- MySQL 드라이버추가 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <!-- 스프링 JDBC연동 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- MyBatis라이브러리 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!-- mybatis.3.4.1.jar --> <!-- 스프링 MyBatis연동 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!-- 스프링 Transaction 처리 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency>
-
-
src/main/resorces/mappers/product.xml
에 sql문으로 사용될 것들을 입력해준다-
namespace 필수
-
태그명이 DML이 된다
-
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="product"> <insert id="insert"> insert into product (pid, pname) values (#{pid}, #{pname}) </insert> <select id="selectAll" resultType="Product"> select * from product </select> </mapper>
-
-
src/main/resources/mybatis-config.xml
에 모델로 쓰일 클래스가 있는 패키지를 등록한다-
<configuration> <!-- mybatis-config.xml --> <typeAliases> <package name="모델이 있는 패키지명"/> </typeAliases> </configuration>
-
-
repoImple이나 daoImpl에서 메서드를 구성한다
-
클래스에
@Repogitory
어노테이션 사용 -
SqlSession에
@Autowired
를 사용하여 sql문을 호출할 수 있도록 해준다 -
SqlSession 아래에 메서드들이 많은데 적당한 것을 골라 product.xml에서 지정한 namespace.id로 접근한다
-
sqlSession.selectList()
: 다수의 결과값 리턴 -
sqlSession.selectOne()
: 하나의 결과값 리턴 -
@Repogitory public class ProductRepoImpl implements ProductRepo { @Autowired private SqlSession sqlSession; // sql문 호출하는 객체 public List<Product> selectAll() { return sqlSession.selectList("product.selectAll"); } }
-
-
serviceImpl 에서 메서드를 구현해준다
-
@Service public class ProductServiceImpl implements ProductService { @Autowired ProductRepo repo; public List<Product> findAll() { return repo.selectAll(); } }
-
-
controller에서 알맞게 호출해준다
-
@Controller public class ProductController { @Autowired private ProductService service; @PostMapping("/form") public String form(Product product, Model model) throws SQLException { service.registry(product); model.addAttribute("product", product); return "product/result"; } @RequestMapping("list") public String list(Model model) throws SQLException { List<Product> productList = new ArrayList<Product>(); model.addAttribute("products", service.findAll()); return "product/list"; } }
-
@PostMapping("form")
은@RequestMapping(value="/form", method = RequestMethod.POST)
와 같다 @GetMapping("/form")
과@RequestMapping(value="/form", method = RequestMethod.GET)
와 같다
-
Spring 구조
- pom.xml
- 필요한 라이브러리를 센터저장소에서 로컬로 다운받아, 현재 프로젝트에 사용할 수 있게 넣어줌
- 디펜던시 복사해서 추가하는 방법
- WEB-INF/web.xml
- 설정파일의 위치
- 객체관리 컨테이너의 설정파일 위치 root-context.xml
- 컨트롤러의 위치 servlet-context.xml
- DispatcherServlet의 위치
- 한글 처리 필터
- 설정파일의 위치
- spring/appServlet/servlet-context.xml
- 리소스 위치 설정
- ViewResolver 설정
- 컨트롤러들을 설정
- Controller
- @Component
- @Repository : DB 관련 클래스
- @Service : Service 관련 클래스
- @Controller : MVC Controller 클래스
- @Component
- spring/root-context.xml
- DB 설정
- sqlMapper의 위치 : mappers/*.xml
- 네임스페이스 위치 : mybatis-config.xml
- 컨트롤러를 제외한 나머지 모든 객체의 관리
- context 사용 시 Namespaces -> context 체크 필수
- DB 설정
- resources/mappers/guest.xml
- sql 문장
- resources/mybatis-config.xml
- 네임스페이스 : sql 문장에서 사용해야하는 패키지 등록
- service, dao …