aplication.properties에 내용추가.
이는 연결정보를 java클래스로 작성했던것을 대체한다.
server.port=80
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#mariadb server connect
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123
#myBatis
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
mapper.xml
- mapper의 내용이다. mybatis를 이용한 쿼리문 작성구간.
- selectSearch는 검색용 쿼리문이며 FormBean의 searchValue가 #{}파라미터로 들어간다.
<mapper namespace="pack.model.DataMappingInterface">
<select id="selectAll" resultType="pack.model.SangpumDto">
select * from sangdata
</select>
<select id="selectSearch" parameterType="pack.controller.FromBean"
resultType="pack.model.SangpumDto">
select code,sang,su,dan from sangdata where sang like concat('%',#{searchValue},'%')
</select>
</mapper>
@Mapper : interface
- 처리할 모델을 추상화한다.
- 추상메소드의 이름은 mapper.xml의 id와 일치시켜야한다.
@Mapper
public interface DataMappingInterface {
List<SangpumDto> selectAll();
List<SangpumDto> selectSearch(FormBean bean); //검색용 bean
}
//FormBean....
@Data //lombok
public class FormBean {
private String searchValue;
}
@Repository : DataDao
- 인터페이스의 DB출력모델용 자식클래스를 이곳에서 액세스한다.
- Logger를 사용했다.
@Repository
public class DataDao {
private Logger logger = LoggerFactory.getLogger(DataDao.class);
@Autowired
private DataMappingInterface mappingInterface; //자동 pooling. HikariPool
public List<SangpumDto> getDataAll(){
List<SangpumDto> list = mappingInterface.selectAll();
logger.info("datas : " + list.size() + "개 ");
return list;
}
}
이제 컨트롤러의 요청처리와 출력을 해보자.
@Controller : ListController.java
- index에서오는 testdb요청처리.
@Controller
public class ListController {
@Autowired
private DataDao dataDao;
@GetMapping("testdb")
public String listProcess(Model model) {
ArrayList<SangpumDto> list = (ArrayList<SangpumDto>)dataDao.getDataAll();
model.addAttribute("datas",list);
return "show";
}
}
검색창 페이지 jsp
<td colspan="4">
<form action="/search" method="get"> <!-- formbean과 통일 -->
상품명 : <input type="text" name="searchValue" placeholder="상품명 입력"/>
<input type="submit" value="검색"/>
</form>
</td>
요청명 search의 메소드에게 검색문 searchValue를 가져간다.
@Controller
@GetMapping("/search")
public String searchProcess(FormBean bean,Model model) {
ArrayList<SangpumDto> slist = (ArrayList<SangpumDto>)dataDao.getDataSearch(bean);
model.addAttribute("datas",slist);
return "show";
}
이곳에서 getDataSearch
는 DataMappingInterface
인터페이스속 메소드이며
@Mapper
public interface DataMappingInterface {
// 추상메소드의 이름은 mapper.xml의 id와 일치 시킨다.
List<SangpumDto> selectAll();//전체자료 읽기
List<SangpumDto> selectSearch(FormBean bean);//검색용
}
@Mapper 어노테이션에 의해 쿼리문을 작성한 mapper.xml과 자동 pooling된다.
mapper는 위에서 설명한 것처럼 sql을 메소드로 쓰기 위해, sql 결과를 정의해놓은 모델로 매핑하기 위한 이름 그대로의 매퍼이다.
repository는 위의 매퍼들을 포함해서 mapper처럼 sql을 메소드랑 매핑해서 쓰든 아니든 db를 조회 및 조작하는 것에 중점을 둔 개념이다.
그래서 repository는 mapper를 포함하는 것이다.