230315 Spring DB Mybatis

kangjuju·2023년 3월 15일
0

Spring

목록 보기
9/13

Mybatis 초기설정

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
  • resources 폴더에 classpath에 해당하는 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";
	}

이곳에서 getDataSearchDataMappingInterface 인터페이스속 메소드이며

@Mapper
public interface DataMappingInterface {
	// 추상메소드의 이름은 mapper.xml의 id와 일치 시킨다.
	List<SangpumDto> selectAll();//전체자료 읽기
	List<SangpumDto> selectSearch(FormBean bean);//검색용
}

@Mapper 어노테이션에 의해 쿼리문을 작성한 mapper.xml과 자동 pooling된다.

@Mapper / Repository 차이

mapper는 위에서 설명한 것처럼 sql을 메소드로 쓰기 위해, sql 결과를 정의해놓은 모델로 매핑하기 위한 이름 그대로의 매퍼이다.

repository는 위의 매퍼들을 포함해서 mapper처럼 sql을 메소드랑 매핑해서 쓰든 아니든 db를 조회 및 조작하는 것에 중점을 둔 개념이다.

그래서 repository는 mapper를 포함하는 것이다.

0개의 댓글