mybatis의 결함 문제를 깊이 있게 분석하다

4076 단어 mybatis결함
Mybatis는 업계에서 매우 유행하는 지구층 구조로 경량급이고 사용하기 쉬우며 금융 IT 분야에서 완전히 선두적인 위치를 차지하고 Hibernate보다 더 인기가 있으며 장점이 매우 많으며 우리가 배울 만한 것이다.그러나 Mybatis는 완벽하지 않고 그 자체의 디자인, 인코딩도 부족하고 심지어 결함도 많다. 이 글은 이러한 결함을 간단명료하게 토론한다.
1. Mybatis는 DTD를 XML 프로필의 검사 파일로 사용하지만 DTD의 차이가 많지 않다. 곧 도태될 기술이다. 기능이 매우 제한적이고 확장성이 매우 나쁘다. 확장성이 매우 나쁘고 가독성도 좋지 않다. Spring은 DTD에서 XSD로 화려하게 전환할 수 있지만 Mybatis는 이런 박력이 없다.
2. 버전 호환성이 좋지 않으면 3.3.0―>3.4.0으로 말하자면 업계에서 통용되는 규범에 따라 2급 버전 번호로 업그레이드하면 기능을 추가할 수 있지만 아래로 호환성을 확보해야 한다. 그러나 Mybatis의 방법은 완전히 이렇지 않다. 관건적인 인터페이스 StatementHandler의 관건적인 방법prepare를 보자.

// 3.3.0
Statement prepare(Connection connection)
throws SQLException;
// 3.4.0
Statement prepare(Connection connection, Integer transactionTimeout)
throws SQLException;
여기에 방법을 추가하지 않고 원래 방법에 파라미터를 추가했습니다!유사한 예가 아직 적지 않으니 일일이 열거하지 않겠다.
3. Mybatis의 플러그인은 일반적인 Interceptor 인터페이스를 사용하고 @Intercepts, @Signature 등 설명을 곁들여 여러 구성 요소에 대한 다양한 방법의 차단을 실현한다. 매우 유연해 보인다. 내가 보기에 구조가 명확하지 않다. 실제 개발할 때 당신은 Statement Handler와Result Set Handler에 대한 차단 강화를 한 종류에 넣을 수 있습니까?설마 (회? 네가 단일 직책 원칙, 개폐 원칙이 모두 개똥이라고 생각하니) 같은 인터페이스를 강제로 사용할 필요가 있겠니?
또한 @Signature 메모를 사용하여 차단해야 하는 구성 요소를 구분하는 방법을 설정합니다. 메모가 틀리면 컴파일도 틀리지 않고 실행될 때만 발견할 수 있습니다. 위의 예를 보십시오.
3.3.0 버전에 대해 플러그인을 구현했다고 가정합니다.

@Intercepts({ 
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class })
})
public class StatementHandlerInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
그리고 3.4.0으로 업그레이드했는데 결과는 컴파일이 정상적이었지만 실행될 때까지 기다렸다가 이상이 발생했습니다.
4. Mybatis의 캐시는 그야말로 계륵이다. 그리고 캐시를 사용해야 하는지, 캐시를 갱신해야 하는지에 상관없이 CacheKey를 계산해야 한다. 캐시를 사용하지 않고 캐시를 갱신하지 않는 상황에서 이런 계산은 완전히 낭비이다.
5. Mybatis의 대량 실행은 다음 JDBC 예제를 참조하십시오.

public void testJdbcBatch(Connection conn) throws Exception {try{
conn.setAutoCommit(false);
batchUpdate(conn);
clearTestData(conn);
conn.commit();
conn.setAutoCommit(true);
}catch(Exception e){
conn.rollback();
throw e;
}
}
private void clearTestData(Connection conn) throws SQLException {
PreparedStatement ps = null;
try{
ps = conn.prepareStatement("delete TABLE_NAME1 where FIELD_NAME1 = ? ");
ps.setString(1, "TEST");
int d = ps.executeUpdate();
System.out.println("delete counts : " + d);
}finally{
try{
ps.close();
}catch(Exception e){}
}
}
private void batchUpdate(Connection conn) throws SQLException {
PreparedStatement ps = null;
try{
String sql = "INSERT INTO TABLE_NAME2(FIELD_NAME1, FIELD_NAME2, FIELD_NAME2)VALUES(?,?,?)";
ps = conn.prepareStatement(sql);
for(int i = 0; i < 10; i++){
String random = RandomStringUtils.randomAlphabetic(8);
ps.setString(1, "TEST");//FIELD_NAME1
ps.setString(2, " " + random);//FIELD_NAME2
ps.setString(3, " " + random);//FIELD_NAME3
ps.addBatch();
}
int[] rs = ps.executeBatch();
}finally{
try{
ps.close();
}catch(Exception e){}
}
}
코드는 위화감이 없고 정상적으로 실행할 수 있으며 예상대로 굴러갈 수도 있습니다. 즉, 같은 업무의 같은 연결은 일반 sql과batch를 동시에 실행할 수 있습니다. 그러나 같은 업무의 Sql Session에서 피드백을 해 보세요. 같은 업무에서 실행 방식을 바꿀 수 없습니다!
6. 데이터베이스 제품의 호환성: Mybatis는 SQL의 통제권을 개발자에게 넘겨주었기 때문에 도덕적으로 높은 점을 차지했다. 당신이 쓴 것은 호환되지 않는다. 그것은 당신 자신의 수준으로는 안 된다!그러나 이것이 진정한 우수한 틀의 올바른 자세인가?왜 보조적인 호환 실시를 제공할 수 없습니까?예를 들어 Oracle에서 신명으로 여겨지는 DECODE 함수는 SqlMapper에서 라벨을 제공하여 뒤에서 묵묵히 CASE WHEN으로 수정할 수 있습니까?아니면 정부에서 제공하지 않아도 상관없지만 확장 방식을 제공해야 돼요. 그래서 다시 돌아왔어요. 확장성이 매우 나쁘고, 확장성이 매우 나쁘고, 확장성이 매우 나빠요.중요한 일은 세 번 말하지만, 나는 이미 여섯 번 말했다.
위에서 말한 것은 편집자가 여러분께 소개한 Mybatis의 결함 문제입니다. 여러분께 도움이 되었으면 합니다!

좋은 웹페이지 즐겨찾기