소개 : mybatis는 무엇입니까?
(이전의 iBatis) MyBatis는 SQL, 저장 프로 시저 및 고급 매핑을 사용자 정의 할 수있는 지속성 계층 프레임 워크입니다. MyBatis는 거의 모든 JDBC 코드 및 매개 변수의 수동 설정과 결과 세트의 검색을 제거합니다. MyBatis는 구성 및 원래 매핑, 맵핑 인터페이스 및 Java의 Pojos (일반 Old Java Objects)를 데이터베이스의 레코드로 사용하기 위해 간단한 XML 또는 주석을 사용할 수 있습니다.
1. Mapper 레이어 매개 변수는 맵이며 서비스 계층은 과부하를 담당합니다.
메커니즘 문제로 인해 맵을 과부하 할 수 없습니다. 매개 변수는 일반적으로 매핑되도록 설정되지만 매개 변수가 흐려집니다. 코드를 명확하게하려면 서비스 계층을 통해 과부하의 목적을 달성 할 수 있습니다. 외부에 제공된 서비스 계층이 과부하되지만 이러한 과부하 된 서비스 방법은 실제로 동일한 맵퍼를 조정하는 것이지만 해당 매개 변수는 일관되지 않습니다.
어쩌면 어떤 사람들은 왜 서비스 계층에 매핑하도록 설정하지 않았습니까? 나는 개인적으로 이것을 추천하지 않습니다. 편의를 위해 이전 프로젝트 에서이 방법을 채택했지만 향후 유지 보수 작업에 문제가 발생할 것입니다. 이렇게하면 전체 MVC가 맵 모델에 의존하게됩니다. 이 모델은 실제로 프레임 워크를 구축하는 데 매우 좋고 편리하지만 문제가 있습니다. 메소드 서명을 살펴보면 맵으로 표시되는 각 매개 변수의 숫자, 유형 및 의미를 알지 못합니다.
서비스 계층이나 DAO 계층 만 변경하면 전체 프로세스에서지도가 전달되는 매개 변수에 대해 명확해야한다고 상상해보십시오. 댓글을 달거나 좋은 문서가 없으면 어떤 매개 변수가 전달되는지 알기 전에 각 계층의 코드를 명확하게 이해해야합니다. 간단한 MVC의 경우 괜찮지 만 레벨이 복잡하면 코드가 매우 복잡해지고 매개 변수를 추가하면 각 레이어에 대한 주석을 추가해야합니다. 주석과 비교할 때, 주석이 구식이 될 수 있지만 방법 서명은 일반적으로 부실하지 않을 수 있기 때문에이 코드 제어 가능성을 보장하기 위해 메소드 서명을 사용하는 것이 더 적합합니다.
2. 유지 보수의 어려움을 줄이기 위해 가능한 한 적은 선택 및 기타 진술을 사용해보십시오.
mybatis에서 SQL을 구성 할 때는 선택한 경우와 같은 적은 레이블을 사용해보십시오. SQL을 사용하여 판단을 결정할 수있는 경우 나중에 유지 보수를 위해 SQL (Case, Decode 등)을 사용해보십시오. 그렇지 않으면, 일단 SQL Bloat가되면, 그것은 매우 구역질입니다. Mybatis에서 SQL을 디버그 해야하는 경우 매우 번거로운 판단 진술을 제거해야합니다. 반면에, 많은 IF 판단으로 인해 생성 된 SQL에 많은 수의 공간이 포함되어 네트워크 전송 시간이 증가하여 바람직하지 않습니다.
더욱이, 불가피하게 생성 된 SQL은마다 매번 일치하지 않을 경우 많은 수의 선택 진술은 오라클에 대한 많은 수의 어려운 구문 분석으로 이어질 것입니다.
다음과 같이 SQL을 살펴 보겠습니다.
<코드 스타일 = "패딩 : 0.5EM; 마진 : 0px; 디스플레이 : 블록; 색상 : rgb (101,123,131); 오버 플로우 -x : 자동; 배경 : RGB (253,246,227)"> <스팬 스타일 = "패딩 : 0px; 마진 : 0px"> <패딩 : 0px; 0px; rgb (133,153,0) "> </span> <패딩 : 0px; 스타일 = "패딩 : 0px; 마진 : 0px; 색상 : rgb (42,161,152)"> 1 </span> = <span style = "padding : 0px; margin : 0px; color : rgb (42,161,152)"> 1 </spy> <span style = "padding : 0px; rgb (133,153,0)> 1 </span spant style = 0px; 스타일 = "패딩 : 0px; 마진 : 0px; 색상 : rgb (42,161,152)"> "startDate! = null and startDate! = 'and endDate! = null and endate! =' '"</span <span style = "padding : 0px; margin : 0px : rgb (133,1)". #{startDate} <span style = "패딩 : 0px; 여백 : 0px; 색상 : rgb (133,153,0) "> 및 </ span> publishtime <= #{enddate} </ <span style ="패딩 : 0px; 여백 : 0px; 색상 : rgb (133,153,0) "> if </span> <sool> <span style ="패딩 : 0px; 여백 : 0px; 색상 : RGB (133,153,0) "> 및 </span> publishtime> = <span style ="패딩 : 0px; 여백 : 0px; 색상 : RGB (133,153,0) "> sysdate </span> - <span style ="패딩 : 0px; 여백 : 0px; 색상 : RGB (42,161,152) "> 7 </span> <span style ="패딩 : 0px; 여백 : 0px; 색상 : RGB (133,153,0) "> 및 </span> publishtime <= <span style ="패딩 : 0px; 여백 : 0px; 색상 : RGB (133,153,0) "> sysdate </span> </elose> </<span style ="패딩 : 0px; 여백 : 0px; 색상 : RGB (133,153,0) "> sysdate </span> </elose> </<span style ="패딩 : 0px; 여백 : 0px; 색상 : RGB (133,153,0) "> 선택 </span>> </span>판단이 실제로 완전히 불필요하다면. 단순히 디코드를 사용하여 기본값 문제를 해결할 수 있습니다.
<코드 스타일 = "패딩 : 0.5EM; 마진 : 0px; 디스플레이 : 블록; 색상 : rgb (101,123,131); 오버 플로우 -x : 자동; 배경 : RGB (253,246,227)"> <스팬 스타일 = "패딩 : 0px; 마진 : 0px"> <패딩 : 0px; 0px; rgb (133,153,0) "> </span> <패딩 : 0px; <span style = "padding : 0px; 마진 : 0px; 색상 : rgb (133,153,0)"> decode </span> (#{startDate}, <span style = "padding : 0px; 마진 : 0px"> null </span>, <span style = "패딩 : 0px; 색상 : RGB (133,153,0) "sysdate </span>-<패딩 : 0px; 색상 : RGB (133,153,0) "및 </span> publishtime <= <span style ="padding : 0px; 마진 : 0px "> null </span>, <span style ="패딩 : 0px; 여백 : 0px; 여백 : 0px; 색상 : RGB (133,153,0) "> sysdate </span>,#{enddate}) </span> </code>물론 어떤 사람들은 언제와 디코딩시기와 디코딩에 사례를 도입하려면 Oracle 함수 구문 분석이 필요할 것이라고 생각할 수 있습니다. 관심있는 학생들은 돌아가서 큰 영향을 미칠지 확인하기 위해 테스트를 수행 할 수 있습니다. 개인적인 경험에 관한 한, 나는 기능 구문 분석으로 인해 SQL의 둔화를 찾지 못했습니다. 일반적으로 테이블 구조 설계와 밀접한 관련이있는 Join, Order By, Distratity By By E. 등과 같은 작업. 이들의 효율의 영향과 비교하여 SQL 실행 속도에 대한 기능 구문 분석의 영향은 무시할 수 있어야합니다.
또 다른 요점은 위의 SQL과 같은 일부 기본값 할당의 경우 현재 날짜 등의 기본값 등을 실제로 처리 할 수있는 서비스 계층 또는 컨트롤러 계층을 완전히 언급 할 수 있다는 것입니다. 이러한 판단은 mybatis에서 덜 사용되어야합니다. 이 경우 처리를 캐시하기가 어렵 기 때문입니다. STARTDATE가 비어 있고 SQL에서 Dynamic SysDate를 사용하는 경우 Cache StartDate 날짜의 키가 무엇인지 결정하는 것은 불가능합니다. 따라서 mybatis에 전달되기 전에 매개 변수를 처리하는 것이 가장 좋습니다. 따라서 Mybatis 층이 선택한 경우 일부를 줄일 수 있으며 캐시 처리에 편리합니다.
물론 선택한 경우 사용하지 않는 것은 절대적이지 않습니다. 때로는 SQL을 최적화하기 위해서는 문장과 같은 문의와 같은 해결 해야하는 경우. 물론, 일반적으로 권장되지 않습니다. 그러나 사용할 시나리오가있는 경우 쿼리 효율을 향상시키기 위해 기사 제목을 쿼리하는 것과 같이 사용할 필요가 없을 때마다 제거하십시오. 가장 좋은 방법은 Lucence와 같은 검색 엔진을 사용하여 전체 텍스트 인덱싱 문제를 해결하는 것입니다.
일반적으로, 지점을 판단하는 경우와 판단을 선택하는 것은 완전히 제거하는 것이 불가능하지만, 판단 지점이 너무 복잡하고 유지하기가 어렵 기 때문에 동적 지점의 판단을 완료하기 위해 Mybatis에 전적으로 의존하기보다는 SQL 기본 방법을 사용하여 동적 문제를 해결하는 것이 좋습니다.
3. SQL 주석을 XML 주석으로 바꾸십시오.
Mybatis Central SQL의 의견을 유지하지 마십시오. 의견은 몇 가지 문제를 일으킬 것입니다. 주석을 사용해야하는 경우 XML에서 <!->를 사용하여 주석을 달아 생성 된 SQL에 SQL 주석이 없도록하여 문제의 가능성을 줄일 수 있습니다. 이 작업의 또 다른 장점은 IDE의 SQL과 주석을 명확하게 구별 할 수 있다는 것입니다.
이제 의견으로 인한 문제에 대해 이야기합시다. 내가 작업중 인 프로젝트에서 Pagination 구성 요소는 Mybatis를 기반으로합니다. SELECT COUNT (*) rownum_의 다른 레이어를 (...)에서 (...)에서 총 레코드 수를 계산하기 위해 작성한 SQL 스크립트 외부에 배치됩니다. 동시에, rownum> 10과 ronnum <10 * 2가 페이징 정보를 생성하는 또 다른 중첩 선택 *에서 (...)가 있습니다. 스크립트의 마지막 줄에 의견이 있으면 추가 된 부분이 주석의 일부가되고 오류 가보고됩니다. 또한 일부 조건은 다음과 같은 일부 조건을 무시할 수 있습니다.
<코드 스타일 = "패딩 : 0.5EM; 마진 : 0px; 디스플레이 : 블록; 색상 : rgb (101,123,131); 오버 플로우 -x : 오버 플로 X : 배경 : RGB (253,246,227)"> <스팬 스타일 = 패딩 : 0px; 마진 : 0px; color : rgb (133,153,0) "> select </span> *. 스타일 = "패딩 : 0px; 마진 : 0px; 색상 : rgb (133,153,0)"> from </span> test <span style = "padding : 0px; margin : 0px; color : rgb (133,153,0)"> 여기서 </span> col1> <span style = "padding : 0px; rgb (42,161,152) "> 1 << span style ="padding : 0px; A! ''</span <span style = 0px; rgb; 여백 : 0px "> if </span >> </span> </code>
전달 된 매개 변수에 해당 매개 변수가 있더라도 다음 컨텐츠가 실제로 완전히 댓글을 달기 때문에 실제로 영향을 미치지 않습니다. 이러한 종류의 오류는 엄격한 테스트 없이는 감지하기가 어렵습니다. 일반적으로 XML 주석은 SQL 주석을 완전히 대체 할 수 있으므로이 동작은 금지되어야합니다.
4. 가능할 때마다 $ {}를 사용하십시오.
mybatis에서 $ {}를 사용하지 마십시오. 이 작업을 수행하는 것이 매우 편리합니다. 그러나 많은 양의 사용으로 인해 Oracle의 단단한 구문 분석을 유발하여 데이터베이스 성능을 늦추는 문제가 있습니다. 데이터베이스 성능이 길수록 데이터베이스 성능이 악화됩니다. 다중 문자열 INS의 일반적인 처리는 다음 솔루션을 참조 할 수 있습니다. http://www.myexception.cn/sql/849573.html은 기본적으로 $ {}의 대부분을 해결할 수 있습니다.
$ {}에 관해서는 또 다른 오용은 비슷합니다. 예를 들어, 일부 트리 메뉴, 노드는 '01', '0101'으로 설계되며, 2 비트 노드는 계층 구조를 구별하는 데 사용됩니다. 현재 Node 01의 모든 노드를 쿼리 해야하는 경우 가장 간단한 SQL은 다음과 같습니다. 이런 종류의 SQL은 실제로 인덱스를 사용할 수 있으므로 특수 처리가 필요하지 않으므로 직접 사용하기 때문에 실제로 이해할 수 있습니다. 그러나 기사의 제목이라면 추가주의를 기울여야합니다. '%OSC%'와 같은 제목의 T_NEWS_TEXT에서 *를 선택하십시오. 이것은 인덱싱을 사용하는 방법이 아닙니다. 위에서 언급했듯이 전체 텍스트 검색을 사용하는 것이 가장 좋습니다. 그러나 마음에 들지 않으면 할 수 없다면 사용 방법에주의를 기울여야합니다. #{id} || 하드 파싱의 가능성을 줄이기 위해 '$ {id}%'와 같은 ID 대신 '%'.
어떤 사람들은 ||를 사용한다고 생각합니다 Oracle 처리 시간이 증가합니다. 오라클을 너무 멍청하게 생각하지 않는다고 생각합니다. 때로는 정말 어리석은 일이지만 시간이있을 때 어리 석고 쓰레기가 아닌 쓰레기를 요약 할 수 있지만, 약간의 테스트 후에는이 연결 방법이 전체 SQL의 구문 분석 및 실행에 매우 얇아야한다는 것을 알게 될 것입니다.
물론, 열 이름, 테이블 이름 등의 동적 주입 등을 처리 할 수없는 특별한 경우가 있습니다. 이러한 상황에서는 어렵고 편리한 수단이 발견되지 않습니다. 이 상황이 발생할 가능성이 적기 때문에 $ {}를 사용하면 큰 영향을 미치지 않습니다. 물론 코드 이환율이있는 경우 Oracle의 동적 SQL 실행 메커니즘이 즉시 실행하여 $ {}의 가능성을 완전히 피할 수 있습니다. 이것은 더 복잡한 모델을 소개 할 것이며, 현재로서는 선택을해야합니다.
위의 동적 SQL로 인한 문제에 대한 응답으로 가장 급진적 인 방법은 저장된 절차를 사용하여 개발 및 디버깅을 용이하게하기 위해 데이터베이스 기본 방식으로 해결하는 것입니다. 물론 문제가 발생할 것입니다. 개발자, 저장된 절차 관리 등에 대한 요구 사항이 더 높아질 것입니다. 내 프로젝트는이 방법을 채택하지 않았으므로 여기에서 더 많이 확장하지 않을 것입니다.
5. mybatis의 간단한 사용.
Mybatis의 기능은 상대적으로 약하며 필요한 보조 라이브러리, 문자열 처리 등이 부족하며 확장하기가 어렵 기 때문에 일반적으로 일부 수익을 처리 할 수 있습니다. 따라서 간단한 SQL 구성 파일과 간단한 ORM 프레임 워크로 사용하는 것이 가장 좋습니다. mybatis에서 너무 많은 동적 SQL을 시도하지 마십시오. 그렇지 않으면 후속 유지 보수가 매우 역겨워집니다.
위는 편집자가 소개 한 Mybatis 학습 요약입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!