Nachdem sie mehrere Nächte hart gearbeitet hatten, um das Programm zu debuggen, mehrere Blogs zu schreiben und schließlich den Expansionsmechanismus für die MyBatis -Konfiguration festzulegen. Obwohl der Erweiterungsmechanismus wichtig ist, ist er zumindest nicht so inspirierend, wenn es keine wirklich praktische Erweiterungsfunktion gibt. In diesem Blog gibt Ihnen einige Beispiele für Erweiterungen.
Der Grund für diese Studie mit Quellcode ist die Kompatibilität zwischen Oracle- und MySQL -Datenbanken. Beispielsweise verwenden Sie doppelte vertikale Linien als Anschlüsse in Oracle und die Verwendung der Concat -Funktion in MySQL; Beispielsweise verwenden Sie die Decode -Funktion in Oracle, während Sie nur den Standardfall in MySQL verwenden; Beispielsweise löschen Sie die Form Tabelle, in der Feld1 in (SELECT FELD1 -TABELLE WOLLEN, WO FIELD2 =?) Ausgestellt werden, aber Ausnahmen werden in mySQL usw. geworfen.
Beginnen wir mit der Lösung dieser Kompatibilitätsprobleme. Zunächst müssen Sie der Konfiguration Datenbankidentitätskonfigurationen hinzufügen:
<!-Konfigurationsobjekt selbst erstellen-> <bean id = "mybatisconfig"/> <bean id = " name = "mapperlocations"> <array> <wert> classPath*: **/*. MySQL wird als Datenbasis in der Konfiguration verwendet. MyBatis native Implementierungsschlüsselwörter sind fallempfindlich. Ich habe Oracle und DB2 -> <Prop Key = "mysql"> mysql </prop> <prop key = "oracle"> oracle </prop> <propt key = "h2"> h2 </prop> </prop> </props> </props> </Anne> </props> </Anne> </prop> </prop> </ande> oracle getestet.
1. Problem
1. Schreiben Sie die Implementierungsklasse der SQL -Konfigurationsfunktion
öffentliche Klasse concatsqlconFigfunction erweitert die AbstractSQLConFigfunction {// Die Standardauftragsebene wird in der abstrakten übergeordneten Klasse @OverridePublic String eingestellt und return "concat"} @oversidePublic String eval (String databasId, String [] args) {ids (args. Argumente. ");} if (" mySQL ".EqualSignoreCase (databaseId)) {return" concat ("+tool.string.join (args,", ")+") ";} else {return tool.string.join (args," || ");2. Registrieren Sie sich im statischen Codeblock der Schemahandlers -Klasse oder rufen Sie die Schemahandlers -Methode in der Startup -Initialisierungsklasse an.
static {// Register StatementHandlerRegister ("Cache-Ref", neuer cacherefstatementHandler ()); Register ("Cache", neuer CachestatementHandler (); Register ("Parametermap", neuer ParametermapstatementHandler ()); Register ("Ergebnismap", New ErgebnismapStatler (); SQLStatementHandler ()); Register ("SELECT | Einfügen | Update | löschen", New crudStatementHandler ()); // Registrieren Sie den Standard -Namespace ScriptHandlerRegister ("Trim", New TRIMSCRIPHANDSHANDER (); ForeachScripTHandler ()); Register ("if | wenn", neu ifScripTHandler ()); Register ("wählen", New ChoosescripTHandler (); // Register ("wenn", neu ifScripTHandler ()); Register ("Ansonsten", New OtherWisesCripTHandler ()). DBStatementHandler (), New dbscripTHandler ()); // Register SQLConFigFunctionRegister (neue decodesqlconFigfunction ();Neben der Registrierung von ConcatsqlconFigfunction verfügt der obige Code auch über andere Registrierungscodes, die hier angegeben und unten weggelassen werden.
3. Ändern Sie die SQLMapper -Konfiguration
<select id = "selectString" resultType = "string"> select param_name, $ concat {param_code, param_name} als code_name aus bf_param_enum_def <if test = "null! = paramname und ''! '%'} </if> </select>4. Schreiben Sie die Schnittstellenklasse
@RepositoryPublic Interface iexampledao {public String selectString (@param ("ParamName") String -ParamName);};};5. Testklassen schreiben
@Runwith (SpringJunit4ClASSRunner.class) @ContextConfiguration (SOLITIONEN = {"CLASSPATH: Spring/ApplicationContext.xml"})@componentpublic class exampleDaOtest {@resourcePrivate iExampledao dao; @TestPublic void testSing () {String A = @TestPublic voidsting () {String A = @TestPublic voidsting () {String a = @TestPublic voidsting () {String a = @TestPublic voidsting () {String a = @TestPublic voidsting () {String a = @Testpublic voidstring () {String a = TESTPUPLIC VOIDSETSELT () {{String a = Dao.Selectstring ("Show");S.
(1) Mysql
20161108 00: 12: 55,235 [Haupt]-[Debug] ==> Vorbereitung: Select Param_Name, concat (param_code, param_name) als code_name aus bf_param_enum_def wobei param_name wie concat ('%' ig ') 20161108 00: 12: 55,269 [Main]-[Main]-[Debugge]; (String)20161108 00:12:55,287 [main]-[TRACE] <== Columns: PARAM_NAME, CODE_NAME20161108 00:12:55,287 [main]-[TRACE] <== Row: Display area, DISPLAY_AREA Display area20161108 00:12:55,289 [main]-[DEBUG] <== Total: 1(2) H2
20161108 00:23:08,348 [main]-[DEBUG] ==> Preparing: select PARAM_NAME, PARAM_CODE||PARAM_NAME AS CODE_NAME from BF_PARAM_ENUM_DEF where PARAM_NAME LIKE '%'||?||'%' 20161108 00:23:08,364 [main]-[DEBUG] ==> Parameters: Display (String)20161108 00:23:08,411 [main]-[TRACE] <== Columns: PARAM_NAME, CODE_NAME20161108 00:23:08,411 [main]-[TRACE] <== Row: Display area, DISPLAY_AREA Display area20161108 00:23:08,411 [main]-[DEBUG] <== Total: 1
Wie Sie sehen können, wurde das Kompatibilitätsproblem von Connectors gelöst.
Darüber hinaus haben wir auch festgestellt, dass das Schreiben bei Verwendung wie Schlüsselwörter problematischer ist. Geben wir ihm also einen neuen Satz von SQL -Konfigurationsfunktionen an:
öffentliche Klasse LikesqlconFigFunctionFactory Implements ISQLConFigFunctionFactory {@Overridepublic Collection <isqlconfigFunction> GetsQlconFigFunctions () {return Arrays.aslist (getleftlikesqlconFigfunction getlikesqlconFigfunction ());} private isqlconFigfunction getleftlikesqlconFigfunction () {return New AbstractLikesqlConFigFunction () {@oversidepublic String getName () {return "l like"; $concat{'%',"+arg+"}";}};} private ISqlConfigFunction getRightLikeSqlConfigFunction(){return new AbstractLikeSqlConfigFunction(){@Overridepublic String getName() {return "rlike";}@Overrideprotected String eval(String arg) {return "LIKE $concat{"+arg+", '%'}";}};} private ISqlConfigFunction getLikeSqlConfigFunction(){return new AbstractLikeSqlConfigFunction(){@Overridepublic String getName() {return "like";}@Overrideprotected String eval(String arg) {return "LIKE $concat{'%',"+arg+", '%'}";}};} private abstract class AbstractLikeSqlConfigFunction extends AbstractSqlConfigFunction{@Overridepublic String eval(String databaseId, String[] args) {if(args.length != 1){Throw.throwException("the like function requires one and only one Argument. ");} return eval (args [0]);} geschützte abstrakte String eval (String arg);}}Hier werden eine Reihe von SQL -Konfigurationsfunktionen definiert, wobei die linke Ähnlichkeit, die rechte Ähnlichkeit und die mitteen Ähnlichkeitsanpassung und die SQL -Konfigurationsfunktionen ebenfalls verschachtelt werden können. Daher ist die Konfigurationsdatei von SQLMapper vereinfacht zu:
<select id = "selectString" resultType = "String"> select param_name, $ concat {param_code, param_name} als code_name aus bf_param_enum_def <if test = "null! = paramname und ''! = paramname"> wobDie Laufergebnisse sind genau gleich.
Wenn Sie es weiterhin problematisch finden, da param_name und paramname camelähnliche Korrespondenzen sind, können Sie sogar eine feldähnliche Funktion hinzufügen und die Konfiguration zu ändern
wobei $ feldähnlich {#{param_name, jdbctype = varchar}}In Kombination mit dem Data Dictionary kann die JDBCType -Konfiguration auch automatisch generiert werden:
wobei $ feldähnlich {#{param_name}}In diesem Fall gibt es bei mehreren Parametern keine Unklarheit (oder eine neu definierte Konfigurationsfunktion $ Likes {} wird verwendet, um Mehrdeutigkeiten zu beseitigen), sodass mehrere Bedingungen vereinfacht werden können:
Wo $ mag {#{param_name, param_name2, param_name3}}Natürlich gibt es mehr graubare Vereinfachungen, die nicht mehr nur im Rahmen der Kompatibilität liegen, sodass wir hier nicht weiter gehen werden.
2. Dekodieren Sie die Funktion/den Fall ... wenn
Die Dekodierungsfunktion in Oracle ist sehr bequem und die Syntax ist wie folgt:
Decodieren (Bedingung, Wert 1, Rückgabewert 1, Wert 2, Rückgabewert 2, Wert N, Rückgabewert n [, Standardwert])
Standardschreiben von Äquivalenten:
Fallbedingung Wenn Wert 1 dann Rückwert 1 zurückgibt 1 Wenn Wert 2 dann Wert 2 ... Wenn Wert n ist, dann der Wert n [sonst Standard] Ende zurücksend
Implementieren wir nun eine Konfigurationsfunktion von $ decode:
öffentliche Klasse decodesqlconFigfunction erweitert AbstractSQLConFigfunction {@Overridepublic String getName () {return "decode";}@oversidepublic String eval (String DatabaseId, String [] args) {if (args.length <3) {throws. throwexcept Argumente. ");} if (" H2 ".EqualSignoreCase (DataBaseId)) {// beim Testen, verwenden Sie H2 anstelle von Oracle und ändern Sie es an Oraclereturn im offiziellen Programm" Decode ("+Tool.string.join (Args,", ")") ")"; ") .Append (args [0]); int i = 2, l = argsgth; für (; i <l; i = i+2) {sb.append (" wenn ") .And (args [i-1]). Append (" dann ") .And (args [i]);} if (i == l) {// //. sb.append ("else") .Append (args [l-1]);} sb.append ("end"); return sb.toString ();}}}Verwenden Sie dann Schemahandler, um die Konfiguration in SQLMapper zu registrieren und zu ändern:
<select id = "selectString" resultType = "String"> select param_name, $ decode {#{paramname}, '1', 'a', '2', 'b', 'c'} als decode_test aus bf_param_enum_def <if test = "null! jdbctype = varchar}} </if> </select>Die Tests sind wie folgt:
(1) in H2 (Ersetzen Sie Oracle durch H2)
20161108 06: 53: 29,747 [Main]-[Debug] ==> Vorbereitung: Wählen Sie Param_name, decode (?, '1', 'A', '2', 'b', 'c') als decode_test aus bf_param_enum_def wob
(2) in MySQL
20161108 06: 50: 55,998 [Main]-[Debug] ==> Vorbereitung: Wählen Sie Param_name, Fall? Wenn '1' dann 'a' wenn '2' dann 'b' else 'c' endet als decode_test von bf_param_enum_def wo param_name wie '%' ||? || '%'
Das obige ist eine detaillierte Einführung in die Erweiterung und Anwendung der SQLMapper -Konfiguration in MyBatis, die Ihnen vom Editor vorgestellt wurde (1). Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!