2015-11-10 40 views
5

Używam mybatis-spring 1.2.3 wraz z Spring4 do tworzenia aplikacji internetowych. Głównym składnikiem danych jest MySQL w środowisku produkcyjnym, ale używam również bazy danych H2 w pamięci w testach jednostkowych.MyBatis w jaki sposób mogę wygenerować różne sql dla różnych baz danych backend

MyBatis działa dobrze zarówno z MySQL, jak i H2 w testowaniu i produkcji, ale napotykam problem, że pewnego dnia muszę użyć force index(idx1) w zapytaniu do MySQL, co spowoduje błąd składniowy w testowaniu jednostkowym jako H2 hasn 't obsługiwane force index. W rezultacie testowanie jednostki jest całkowicie zepsute.

Chciałbym wiedzieć, czy istnieje sposób, w jaki MyBatis poradzi sobie z taką sytuacją? (Typ bazy danych różni się w testowaniu i produkcji, a ich wsparcie gramatyki SQL nie są identyczne).

Oto mój plik odwzorowujący:

<?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> 

Odpowiedz

2

MyBatis zapewnia multi-db wsparcia dostawcy, który pozwala uporządkować Twój SQL różni się w zależności od dostawcy bazy danych, z którego korzystasz. Więc można owinąć problematyczny kod w badaniu, takie jak:

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

Zobacz odpowiednich fragmentów dokumentacji here i here.

+0

Dziękuję za sugestię, działa jak urok. Ale jako węzeł boczny, dla użytkownika mybatis-spring, ustawienie 'databaseIdProvider' w pliku mybatis-config.xml wydaje się nie mieć żadnego skutku (nie wiem dlaczego), a raczej ustawienie' databaseIdProvider' w SqlSessionFactoryBean działa. – dyng