在一个查询里,针对各种不同数据库,有时候只是一部分 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 会根据数据库的不同而自行选择执行合适的片段。

Mybatis Sql片段的应用的更多相关文章

  1. MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)

    一.字段名与属性名(数据库的名字)不一样怎么办? 方案一:在小配置中配置一个resultMapper <!--方案一:resultMapper 字段名与属性名不一致 --> <res ...

  2. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)

    动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...

  3. mybatis动态SQL中的sql片段

    在mybatis中通过使用SQL片段可以提高代码的重用性,如下情景: 1.创建动态SQL <sql id="sql_count">select count(*)< ...

  4. java:Mybatis框架2(基于mapper接口的开发,多种查询,复合类型查询,resultMap定义,多表联查,sql片段)

    1.mybatis02: mybatis-config.xml: <?xml version="1.0" encoding="UTF-8"?> &l ...

  5. mybatis中的动态SQL(IF Chooes When Where Set ForEach SQL片段)

    mapper: public interface BlogMapper { List<Blog> getBlogByIF(Map map); } IF <select id=&quo ...

  6. mybatis if else if 条件判断SQL片段表达式取值和拼接

    前言 最近在开发项目的时候涉及到复杂的动态条件查询,但是mybaits本身不支持if elseif类似的判断但是我们可以间接通过 chose when otherwise 去实现其中choose为一个 ...

  7. SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 简单概述一下本讲 别名,sql片段简单写一下,模糊查询多写一点 一.别名 <typeAliases> ...

  8. 使用mybatis提供的各种标签方法实现动态拼接Sql。使用sql片段提取重复的标签内容

    Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下: <select id="findUserByNameAndSex" par ...

  9. mybatis动态sql中的sql标签——抽取可重用的sql片段

    1.用<sql>标签抽取可重用的sql片段 <!-- 抽取可重用的SQL片段,方便后面引用           1.sql抽取,经常将要查询的列名,或者插入用的列名,之后方便引用   ...

随机推荐

  1. alert执行顺序

    <p><span id="span1">Hello World!</span></p> <script type=" ...

  2. css3 如何实现圆边框的渐变

    使用 css 实现下面效果: 把效果分解. 代码一: <style> .helper1 { height: 40px; padding: 15px; background: -webkit ...

  3. 【Java线程】Java内存模型总结

    学习资料:http://www.infoq.com/cn/articles/Java-memory-model-1 Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态, ...

  4. 我的Spring学习记录(一)

    spring是一个框架,一个我理解为对象的大熔炉,它生产着各种bean,还可以对生产的对象进行加工. 这里有些概念需要理解一下,就是IOC和DI以及AOP,接下来,我们进入主题. spring简介 上 ...

  5. mariadb自带命令行客户端指令笔记

    mysql -H 主机IP -u 用户名 -p -p表示要输密码,不要直接输了,要回车后在程序里输入 显示数据库列表: show databases; 选择XX数据库: use XX; 显示数据库里的 ...

  6. 【BBED】BBED模拟并修复ORA-08102错误

    [BBED]BBED模拟并修复ORA-08102错误 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...

  7. 技巧收集-M1709

    2017.09 在macOS中直接复制文件路径,在Finder中选中文件,按下快捷键:Command + Option + C *** 以KB,MB,GB方式显示文件大小 ls -lh 删除超大文本文 ...

  8. PYTHON 函数局部变量和全局变量

    有这样一段PYTHON代码,从事C语言开发的人都知道,如果定义了全局变量,而函数内没有定义同名的函数变量的话,那么在函数内对该变量的赋值就是对全局变量空间数值的修改, 然后在PYTHON中却不尽相同, ...

  9. BZOJ-1012-[JSOI2008]最大数maxnumber(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  10. DotNetCore跨平台~linux上还原自主nuget包需要注意的问题

    问题的产生的背景 由于我们使用了jenkins进行部署(jenkins~集群分发功能和职责处理),而对于.net core项目来说又是跨平台的,所以对它的项目拉取,包的还原,项目的编译和项目的发布都是 ...