在一个查询里,针对各种不同数据库,有时候只是一部分 SQL 是不相同的,为避免相同的部分复制多次,所以将不相同的部分进行适当的隔离,再重用就可以了。
在 MyBatis 里声明两段 片段,它们分别对应不同数据库:
可以发现,id 属性的值是相同的,而 databaseId 不同。在引用时将该 id 值赋给 include 的 refid,这样 MyBatis 就可以根据数据库的不同来选择相符的 Sql 片段。
为主 SQL 先声明好 引用:
接下来完整配置步骤如下:
为 MyBatis 准备好基础配置(mybatis.cfg.xml)
sqlserver db2 oracle mysql h2 postgresql dialect=sqlserver
配置好 PropertiesFactoryBean 和 VendorDatabaseIdProvider,然后为 SqlSessionFactoryBean 的 databaseIdProvider 属性加上 ref 引用。
在 Mapper 的 xml 文件里就可以应用 Sql 片段了(IOrgGradeCategoryDao.xml)
and orgGradeCategoryName like '%' + #{orgGradeCategoryName} + '%' and orgGradeCategoryName like '%' || #{orgGradeCategoryName} || '%'
上述代码已针对 sqlserver 和 postgresql 两个数据库声明了 Sql 片段,在运行时,Mybatis 会根据数据库的不同而自行选择执行合适的片段。