Mybatis Sql片段的应用
在一个查询里,针对各种不同数据库,有时候只是一部分 SQL 是不相同的,为避免相同的部分复制多次,所以将不相同的部分进行适当的隔离,再重用就可以了。
在 MyBatis 里声明两段
<sql databaseId="sqlserver" id="GetListByPaging-Fragment">
</sql>
<sql databaseId="postgresql" id="GetListByPaging-Fragment">
</sql>
可以发现,id 属性的值是相同的,而 databaseId 不同。在引用时将该 id 值赋给 include 的 refid,这样 MyBatis 就可以根据数据库的不同来选择相符的 Sql 片段。
为主 SQL 先声明好 引用:
<include refid="GetListByPaging-Fragment" />
接下来完整配置步骤如下:
为 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 引用。
在 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 会根据数据库的不同而自行选择执行合适的片段。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?