Mybatis는 업계에서 매우 인기있는 지속적인 계층 프레임 워크입니다. 가볍고 사용하기 쉽습니다. 그것은 금융 IT 분야에서 완전히 이끌고 있습니다. 그것은 많은 장점으로 최대 절전 모드보다 더 인기가 있으며 학습 할 가치가 있습니다. 그러나 Mybatis는 완벽하지 않으며 자체 디자인과 코딩에는 여전히 많은 단점이 있으며 결함이 있습니다. 이 기사는 이러한 결함에 대해 간단히 설명합니다.
1. MyBatis는 XML 구성 파일의 검증 파일로 DTD를 사용하지만 DTD는 거의 지워진 기술이라는 것은 분명합니다. 기능이 매우 제한적이며 확장 성이 매우 열악하며 확장 성이 매우 열악하며 확장 성이 매우 좋지 않으며 가독성이 떨어집니다. Spring은 DTD에서 XSD로 화려하게 변할 수 있지만 Mybatis는이 용기가 없었습니다.
2. 버전 호환성이 제대로 수행되지 않으면 3.3.0 -> 3.4.0을 예로 들어 보겠습니다. 업계의 일반 사양에 따라 2 단계 버전 번호를 업그레이드하고 기능을 추가 할 수 있지만 뒤로 호환성을 보장해야합니다. 그러나 Mybatis의 접근 방식은 이것과 똑같지 않습니다. StateHandler의 주요 방법을 살펴 보려면 다음을 준비하십시오.
// 3.3.0STATEMENT 준비 (연결 연결) SQLEXCEPTION 던지기; // 3.4.0STATEMENT 준비 (연결 연결, 정수 트랜잭션 타임 아웃)는 SQLEXCEPTION을 던집니다.
여기에는 메소드가 추가되지 않지만 매개 변수는 원래 메소드에 직접 추가됩니다! 비슷한 예제가 많이 있으므로 하나씩 나열하지 않습니다.
3. MyBatis 플러그인은 @Intercepts 및 @Signature와 같은 주석과 함께 일반 인터셉터 인터페이스를 사용하여 여러 구성 요소의 여러 차단 방법을 구현합니다. 매우 유연 해 보입니다. 제 생각에는 구조는 실제로 명확하지 않습니다. 실제 개발 중에 StateHandler 및 ResultsEthandler의 인터 셉션 향상을 한 클래스에 넣을 것입니까? 옳지 않습니까 (예? 당신은 단일 책임 원칙과 오프닝 및 마감 원리 모두 똥입니까?) 왜 동일한 인터페이스를 강요해야합니까?
또한 @Signature 주석을 사용하여 인터셉트 해야하는 구성 요소 메소드를 지정하십시오. 주석이 잘못되면 컴파일은 오류를보고하지 않습니다. 당신은 그것을 발견하기 위해 달릴 때까지 기다릴 수 있습니다. 위의 예를 살펴 보겠습니다.
버전 3.3.0 용 플러그인을 구현했다고 가정 해 봅시다 :
@InterCepts ({@signature (type = stationhandler.class, method = "repary", args = {connection.class}}) public class station haterHandlerInterceptor interceptor {@OverRidePublic 객체 intercept (return invoction.plugin (object plugin)}}} this);}@attrementpublic void setProperties (속성 속성) {}}그런 다음 3.4.0으로 업그레이드되었습니다. 결과적으로 컴파일은 정상 이었지만 실행되면 예외가 발생했습니다.
4. MyBatis의 캐시는 단순히 쓸모가 없으며 구성이 있는지 여부에 관계없이 캐시를 사용하거나 캐시를 업데이트해야합니다. 캐시 키를 계산해야합니다. 캐시가 없거나 캐시를 업데이트하지 않으면이 계산은 폐기물입니다.
5. MyBatis의 배치 실행은 다음 JDBC 예를 참조하십시오.
public void testjdbcbatch (Connection Conn)는 예외를 {try {conn.setautocommit (false); batchupdate (conn); cleartestdata (conn); conn.commit (); conn.setautocommit (true);} catch (Exception e) {conn.rollback (); Throw whorl void void void rection (connection}}} ps = null; try {ps = conn.preparestatement ( "field_name1 =?"); ps.setString (1, "test"); int d = ps.executeupdate (); system.out.println ( "삭제 :" + d); {pss.close (예외}}}}}} void batchupdate (Connection Conn) sqlexception {preparedstatement ps = null; try {String Sql = "table_name2에 삽입 (field_name1, field_name2, field_name2) 값 (?, ?,?)"; ps = conn.preparestatement (sql); RandomStringUtils.randomalphabetic (8); ps.SetString (1, "test"); // field_name1ps.setString (2, "data" + random); // field_name2ps.setString (3, " + random); // random); 마지막으로 {try {ps.close ();} catch (예외 e) {}}}코드는 불일치가 없으며 정상적으로 실행할 수 있으며 예상대로 롤백 할 수도 있습니다. 즉, 동일한 트랜잭션에서 동일한 연결이 일반 SQL을 실행하고 동시에 배치 할 수 있지만 동일한 트랜잭션의 SQLSESSION에서 시도해보십시오. 피드백은 동일한 트랜잭션에서 실행 방법을 전환 할 수 없다는 것입니다!
6. 데이터베이스 제품의 호환성 : MyBatis는 개발자에게 SQL의 제어를 전달하여 지휘 높이를 도덕적으로 점령했습니다. 쓴 것은 호환되지 않습니다. 즉, 자신의 수준입니다! 그러나 이것이 정말 좋은 프레임을위한 올바른 자세입니까? 일부 보조 호환 구현이 제공 될 수없는 이유는 무엇입니까? 예를 들어, Oracle에서 신으로 간주되는 디코드 함수에 SQLMPAPPER에 <ceode> 태그가 제공되고 나중에는 경우에 대해 조용히 수정 될 수 있습니까? 다시 말해, 공무원이 그것을 제공하지 않는지는 중요하지 않지만 확장 방법을 제공해야하므로 다시 돌아옵니다. 확장 성이 매우 열악하고 확장 성이 매우 열악하고 확장 성이 매우 열악합니다. 나는 중요한 것들을 세 번 말했지만 6 번 말했다.
위의 것은 편집자가 당신에게 소개 한 Mybatis의 결함입니다. 나는 그것이 당신에게 도움이되기를 바랍니다!