몇 밤 동안 프로그램을 디버깅하고 여러 블로그를 작성하고 마침내 MyBatis 구성을위한 확장 메커니즘을 설정 한 후. 확장 메커니즘이 중요하지만 진정으로 실용적인 확장 기능이 없다면 최소한 고무적이지 않습니다. 이 블로그는 확장의 몇 가지 예를 제공합니다.
소스 코드에 대한이 연구의 이유는 Oracle과 MySQL 데이터베이스 간의 호환성 때문입니다. 예를 들어, 이중 수직선을 Oracle의 커넥터로 사용하고 MySQL에서 CONCAT 기능을 사용합니다. 예를 들어, Oracle에서 Decode 기능을 사용하는 동안 MySQL에있을 때만 표준 케이스를 사용합니다. 예를 들어, Field1 in (field2 =?)을 실행할 수있는 Field1 in (Select Field1 양식 테이블)을 삭제하지만 예외는 MySQL 등에 발생합니다.
이러한 호환성 문제를 해결하여 시작하겠습니다. 먼저 구성에 데이터베이스 아이덴티티 관련 구성을 추가해야합니다.
<!-혼자서 구성 객체 빌드-> <bean id = "mybatisconfig"/> <bean id = "sqlsessionfactory"p : dataSource-ref = "dataSource"> <!-MyBatis 구성 개체-> <property name = "configuration"ref = "mybatisconfig"/> <!-자동 SQLMPORPIGRUSTURE " 이름 = "mapperlocations"> <array> <value> classpath*: **/*. sqlmapper.xml </value> </array> </property> </property> <!-데이터베이스 제품 식별 구성-> <property name = "databaseIdprovider"> <bean> <property name = "properties"> <!-데이터 값이 포함 된 경우, 제품이 포함 된 경우, 제품이 uccouals가 포함 된 경우, MySQL은 구성에서 데이터베이스로 사용됩니다. Mybatis 기본 구현 키워드는 사례에 민감합니다. Oracle과 DB2-> <prop key = "mysql"> mysql </prop> <prop key = "Oracle"> Oracle </prop> <prop key = "h2"> h2 </prop> <prop key = "db2"> db2 </prop> </props> </bean>을 테스트하지 않았습니다.
1. 커넥터 문제
1. SQL 구성 기능 구현 클래스를 쓰십시오
public class concatsqlconfigfunction actracts AbstractSqlConfigFigNect {// 기본 순서 레벨은 추상적 인 부모 클래스 @OverRidePublic String @OverRidePublic String getName () {return "concat";} @attrraderPublic String Eval (String DatabaseId, String [] args) {if (args.length <2) {Throw excement가 필요합니다. Arguments. ");} if ("mysql ".equalsignorecase (databaseid)) {return"concat ( "+thool.string.join (args,"), "+");} else {return thool.string.join (args, "||")}}2. Schemahandlers 클래스의 정적 코드 블록에 등록하거나 시작 초기화 클래스에서 Schemahandlers 메소드를 호출하십시오.
static {// register stateHandlerRegister ( "Cache-Ref", new CachereFStatementHandler ()); register ( "캐시", New CachestatementHandler ()); register ( "ParametErmap", new ParametErmapStatementementmanler ()); register ( "resultMap", new resultMapStatementHandler ()); Register ( "SQL", New ", New" sqlstatementHandler ()); register ( "선택 | 삽입 | 삽입 | 삭제 | 삭제 | 삭제", new crudStatementHandler ()); // 기본 네임 스페이스 ScripThandLerRegister ( "trim", new TrimScriptThandler ()); register ( "Where", new wherescripThandler ()); "set", new spcriptAndler ( "); foreachScriptAndler ()); register ( "if | when", new ifscriptHandler ()); register ( "선택", new 선택 ScriptThandler ()); // register ( "when", new ifscriptThandler ()); register ( "그렇지 않으면") new dbstatementhandler (), new dbscripthandler ()); // register sqlConfigFigFigFinction (); register (new concatsqlConfigFigFunction ()); // register sqlConfigFigFignectoryRegister (new likesQlConfigFigftOctory ());ConcatsqlConfigFunction을 등록하는 것 외에도 위의 코드에는 다른 등록 코드가 있으며 여기에는 여기에 제공되며 아래에서 생략됩니다.
3. sqlmapper 구성을 수정하십시오
<select id = "selectString"resultType = "string"> select param_name, $ concat {param_code, param_name} bf_param_enum_def에서 code_name as as as test = "null! = paramname and ''! = paramname"> 여기서 paramname {{paramname, jdbctype, jdbctype, '%'} </if> </select>4. 인터페이스 클래스를 쓰십시오
@RepositoryPublic Interface IExampleDao {public String selectString (@param ( "paramname") String Paramname);}5. 테스트 클래스를 작성하십시오
@RunWith (springJunit4classRunner.class) @ContextConfiguration (locations = { "classPath : Spring/ApplicationContext.xml"})@componentPublic Class emaxPledaotest {@ResourcePrivate IExampleDao dao; @TestPublic void testSeltring () {string a =. dao.selectstring ( "show"); assert.assertequals ( "show area", a);}}6. MySQL 및 H2에서 각각 실행됩니다 (MyBatis 로그 레벨을 추적으로 조정).
(1) MySQL
20161108 00 : 12 : 55,235 [main]-[debug] ==> 준비 : param_name, concat (param_code, param_name)을 선택하여 bf_param_enum_def에서 code_name에서 code_name을 선택합니다. (String) 20161108 00 : 12 : 55,287 [Main]-[TRACE] <== 열 : Param_Name, Code_Name20161108 00 : 12 : 55,287 [Main]-[Trace] <== Row : Display_AREA 디스플레이 영역 20161108 00 : 12 : 55,289 [Main] <== 1 1 1 1.
(2) H2
20161108 00 : 23 : 08,348 [main]-[debug] ==> 준비 : param_name, param_code || param_name은 bf_param_enum_def에서 code_name as '%'||? || '%'20161108 00 : 23 : 08,364 [mave] ==> paramets (paramets : paramets :). 00 : 23 : 08,411 [Main]-[Trace] <== 열 : Param_name, Code_name20161108 00 : 23 : 08,411 [Main]-[Trace] <== Row : Display_AREA Display Area20161108 00 : 23 : 08,411 [MAIN]-[DEBUG] <== 1 = 1 1.
보시다시피 커넥터의 호환성 문제가 해결되었습니다.
또한 키워드와 같은 키워드를 사용할 때 쓰기가 더 번거 롭다는 것을 알았으므로 새로운 SQL 구성 기능 세트를 제공하겠습니다.
public class likesqlconfigFunctionFactory는 ISQLCONFIGFINCTIONFACTORY {@OVERRIDEPUBLIC COLLECTION <ISQLCONFIGFINCTION> GETSQLCONFIGFINCTIONS () {return arrays.AsList (getLeftLikesQlConfigFigFigNction (getLeftLikesQlConfigFigTection) getLikesQlConfigFigFunction ();} private isqlConfigFunction getLeftLikesqlConfigFunction () {return new acc $ concat { '%', "+arg+"} ";}};} private isqlConfigFunction getRightLikesQlConfigNect () {return new acc $ concat { "+arg+", '%'} ";}};} private isqlconfigFunction getLikesqlConfigFigNction () {return new acc $ concat { '%', "+arg+", '%'} ";}};} 개인 추상 클래스 AbstractLikesqlConfigFigFinction은 AbstractSqlConfigFignction {@OverRidePublic String (String DatabaseId, String [] arg! = 1) {throwex를 필요로합니다. Argument. ");} return eval (args [0]);} 보호 된 추상 문자열 평가 (String arg);}}여기서, SQL 구성 함수 세트는 왼쪽 유사성, 오른쪽 유사성 및 중간 유사성 일치와 함께 정의되며 SQL 구성 함수도 중첩 될 수 있습니다. 따라서 SQLMAPPER의 구성 파일이 단순화됩니다.
<select id = "selectString"resulttype = "string"> select param_name, $ concat {param_code, param_name} bf_param_enum_def에서 code_name as as test = "null! = paramname and ''! = paramname"> where {#}}} </if>}실행 결과는 정확히 동일합니다.
Param_name과 Paramname이 낙타와 같은 서신이기 때문에 여전히 문제가있는 경우 여전히 문제가있는 경우 필드와 같은 기능을 추가하고 구성을 수정할 수도 있습니다.
여기서 $ field like {#{param_name, jdbctype = varchar}}데이터 사전과 결합하면 JDBCTYPE 구성도 자동으로 생성 될 수 있습니다.
여기서 $ field like {#{param_name}}이 경우 여러 매개 변수가있는 경우 모호성이 없거나 (또는 새로 정의 된 구성 함수 $ 좋아요 {}가 모호성을 제거하는 데 사용됩니다) 여러 조건을 단순화 할 수 있습니다.
여기서 $는 {#{param_name, param_name2, param_name3}를 좋아합니다.물론, 더 이상 호환성의 범위에 있지 않은 더 많은 디그 가능한 단순화가 있으므로 여기서는 더 이상 가지 않을 것입니다.
2. decode function/case ... 언제
Oracle의 디코드 기능은 매우 편리하며 구문은 다음과 같습니다.
DECODE (조건, 값 1, 리턴 값 1, 값 2, return value 2, ... 값 n, 반환 값 n [, 기본값]))))
동등한 표준 쓰기 :
값 1 인 경우 사례 조건 값 1 값 1 값 2 값 2 다음 반환 값 2 ... 값 n이면 값 n [else default] 끝을 반환 할 때
이제 $ decode 구성 함수를 구현하겠습니다.
public class decodesqlconfigFignction은 AbstractSqlConfigFigFunction {@OverRidePublic String getName () {return "decode";}@atredridepublic string eval (string databaseid, string [] args) {if (args.length <3) {tash.throwexception ( "Decode 함수가 최소 3 개 이상 필요합니다. Arguments. ");} if ("h2 ".equalsignorecase (databaseid))) {// 테스트 할 때 Oracle 대신 H2를 사용하여 공식 프로그램"Decode ( "+thool.string.join (args");} else {stringbuffer sb = new stringbuffer (); ") .append (args [0]); int i = 2, l = args.length; for (; i <l; i = i+2) {sb.append ("shen ") .append (args [i-1]). Append ("when ") sb.append ( "else") .append (args [l-1]);} sb.append ( "end"); return sb.tostring ();}}}}그런 다음 skemahandlers를 사용하여 sqlmapper에서 구성을 등록하고 수정하십시오.
<select id = "selectString"resulttype = "string"> select param_name, $ decode {#{paramname}, '1', 'a', '2', 'b', 'c'} bf_param_enum_def < "null! = paramname 및 '' ''> = paramname"> where {#{##{#{##{##{##{##{##{paramname. jdbctype = varchar}} </if> </select>테스트는 다음과 같습니다.
(1) H2 (Oracle을 H2로 대체)
20161108 06 : 53 : 29,747 [Main]-[Debug] ==> 준비 : Bf_Param_enum_def에서 decode_test에서 '%'||? || '%'에서 decode_test로 decode_test로 param_name, decode (?, '1', 'a', '2', 'b', 'c')를 선택하십시오.
(2) MySQL에서
20161108 06 : 50 : 55,998 [Main]-[Debug] ==> 준비 : Param_Name, CASE를 선택 하시겠습니까? '1' 'a'a 'a'way '2'는 'b'else 'c'가 bf_param_enum_def에서 decode_test로 끝납니다.
위의 내용은 편집자가 소개 한 MyBatis에서 SQLMAPPER 구성의 확장 및 응용 프로그램에 대한 자세한 소개입니다 (1). 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!