2015-11-10 18 views
5

erzeugen Ich benutze mybatis-spring 1.2.3 zusammen mit Spring4, um eine Webanwendung zu erstellen. Der Hauptdatenspeicher ist MySQL in der Produktionsumgebung, aber ich verwende auch die In-Memory-Datenbank H2 im Komponententest.MyBatis Wie kann ich verschiedene SQL für verschiedene Datenbank Backend

MyBatis funktioniert gut sowohl mit MySQL und H2 in Test und Produktion, aber ich stoße auf ein Problem, dass ich eines Tages force index(idx1) in einer Abfrage zu MySQL verwenden muss, die einen Syntaxfehler in Komponententests als H2 hasn verursachen wird unterstützt nicht force index. Als Ergebnis ist der Komponententest vollständig unterbrochen.

Ich möchte wissen, gibt es eine Möglichkeit, dass MyBatis mit einer solchen Situation umgehen kann? (Art der Datenbank unterscheidet sich in Test und Produktion, und ihre Unterstützung von SQL-Grammatik sind nicht identisch.)

Hier ist meine Mapper-Datei:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mapper 
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="myproject.mapper.UserMapper"> 
    <select id="getGameUsersForDate" resultType="myproject.dao.domain.GameUser"> 
    select 
    * 
    from game_user 
    force index(idx1) 
    where 
    game_id in 
    <choose> 
     <when test="gameIds.size() > 0"> 
     <foreach item="gameId" collection="gameIds" open="(" separator="," close=")"> 
      #{gameId} 
     </foreach> 
     </when> 
     <otherwise> 
     (null) 
     </otherwise> 
    </choose> 
    and uid in 
    <choose> 
     <when test="uids.size() > 0"> 
     <foreach item="uid" collection="mids" open="(" separator="," close=")"> 
      #{mid} 
     </foreach> 
     </when> 
     <otherwise> 
     (null) 
     </otherwise> 
    </choose> 
    and `date` = #{date} 
    </select> 
</mapper> 

Antwort

2

Mybatis bietet Multi-DB-Anbieter-Support, der Ihnen erlaubt zu strukturieren Ihr SQL unterscheidet sich je nach dem von Ihnen verwendeten Datenbankanbieter. So können Sie den problematischen Code in einem Test wickeln wie:

<if test="_databaseId == 'mysql'"> 
    force index(idx1) 
</if> 

Siehe die entsprechenden Stücke der Dokumentation here und here.

+0

Vielen Dank für Ihren Vorschlag, es funktioniert wie ein Charme. Aber als ein Seitenknoten, für Benutzer von mybatis-spring, hat die Einstellung 'databaseIdProvider' in mybatis-config.xml keinen Effekt (ich habe nicht gefunden, warum), sondern die Einstellung' databaseIdProvider' in SqlSessionFactoryBean funktioniert. – dyng

Verwandte Themen