在一个查询里,针对各类不一样数据库,有时候只是一部分 SQL 是不相同的,为避免相同的部分复制屡次,因此将不相同的部分进行适当的隔离,再重用就能够了。javascript
在 MyBatis 里声明两段
<sql databaseId="sqlserver" id="GetListByPaging-Fragment"> </sql> <sql databaseId="postgresql" id="GetListByPaging-Fragment"> </sql>
能够发现,id 属性的值是相同的,而 databaseId 不一样。在引用时将该 id 值赋给 include 的 refid,这样 MyBatis 就能够根据数据库的不一样来选择相符的 Sql 片断。mysql
<include refid="GetListByPaging-Fragment" />
接下来完整配置步骤以下:git
<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 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