Mybatis Sql片斷的應用

Markdown

在一個查詢裏,針對各類不一樣數據庫,有時候只是一部分 SQL 是不相同的,爲避免相同的部分複製屢次,因此將不相同的部分進行適當的隔離,再重用就能夠了。javascript

在 MyBatis 裏聲明兩段 片斷,它們分別對應不一樣數據庫: java

<sql databaseId="sqlserver" id="GetListByPaging-Fragment">
</sql>

<sql databaseId="postgresql" id="GetListByPaging-Fragment">
</sql>

能夠發現,id 屬性的值是相同的,而 databaseId 不一樣。在引用時將該 id 值賦給 include 的 refid,這樣 MyBatis 就能夠根據數據庫的不一樣來選擇相符的 Sql 片斷。mysql

爲主 SQL 先聲明好 引用:

<include refid="GetListByPaging-Fragment" />

接下來完整配置步驟以下:git

爲 MyBatis 準備好基礎配置(mybatis.cfg.xml)

<bean id="vendorProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="SQL Server">sqlserver</prop>
            <prop key="DB2">db2</prop>
            <prop key="Oracle">oracle</prop>
            <prop key="MySQL">mysql</prop>
            <prop key="H2">h2</prop>
            <prop key="PostgreSQL">postgresql</prop>
        </props>
    </property>
</bean>

<bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
    <property name="properties" ref="vendorProperties"/>
</bean>
 
<!--配置 sqlSessionFactory 解析數據源、別名等等 -->
<!-- sqlserver ,postgresql ,oracle ,mysql ,sqlite ,db2 ,mariadb ,hsqldb ,informix -->
<bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource"          ref="dataSource-Default" />
    <property name="databaseIdProvider"  ref="databaseIdProvider" />
    <property name="typeAliasesPackage"  value="ruanxi.queen.model" />
    <property name="typeHandlersPackage" value="ruanxi.mybatis3.typeHandlers" />
    <property name="mapperLocations"     value="classpath*:mapper/*.xml" />
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageHelper">
                <property name="properties">                    
                    <value>
                        dialect=sqlserver
                    </value>
                </property>
            </bean>
        </array>
    </property>
</bean>

配置好 PropertiesFactoryBean 和 VendorDatabaseIdProvider,而後爲 SqlSessionFactoryBean 的 databaseIdProvider 屬性加上 ref 引用。github

在 Mapper 的 xml 文件裏就能夠應用 Sql 片斷了(IOrgGradeCategoryDao.xml)

<mapper namespace="ruanxi.queen.iDao.IOrgGradeCategoryDao">
    <!-- 分頁查詢 -->
    <select id="GetListByPaging" parameterType="orgGradeCategorySearch" resultType="orgGradeCategoryGrid">
        Select orgGradeCategoryId, orgGradeCategoryName, orgGradeCategoryCode, sortCode, description, isEnabled, createTime
        From BaseOrgGradeCategory
 
        <!-- 使用 trim 語法代替 where,它最大的好處是能智能判斷 where/and/or 的出現時機,避免動態 SQL 的語法錯誤。 -->
        <!-- Order by 依然放在最後,確保分頁能正常使用 -->
        <trim prefix="WHERE" prefixOverrides="AND|OR">
            <include refid="GetListByPaging-Fragment" />
        </trim>
        Order By sortCode DESC
    </select>

    <sql databaseId="sqlserver" id="GetListByPaging-Fragment">
        <if test="orgGradeCategoryName != null and orgGradeCategoryName != '' ">and orgGradeCategoryName like '%' + #{orgGradeCategoryName} + '%'</if>
    </sql>

    <sql databaseId="postgresql" id="GetListByPaging-Fragment">
        <if test="orgGradeCategoryName != null and orgGradeCategoryName != '' ">and orgGradeCategoryName like '%' || #{orgGradeCategoryName} || '%'</if>
    </sql>
 
</mapper>

上述代碼已針對 sqlserver 和 postgresql 兩個數據庫聲明瞭 Sql 片斷,在運行時,Mybatis 會根據數據庫的不一樣而自行選擇執行合適的片斷。spring

相關文章
相關標籤/搜索