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 会根据数据库的不同而自行选择执行合适的片段。
Mybatis Sql片段的应用的更多相关文章
- MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)
一.字段名与属性名(数据库的名字)不一样怎么办? 方案一:在小配置中配置一个resultMapper <!--方案一:resultMapper 字段名与属性名不一致 --> <res ...
- 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)
动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...
- mybatis动态SQL中的sql片段
在mybatis中通过使用SQL片段可以提高代码的重用性,如下情景: 1.创建动态SQL <sql id="sql_count">select count(*)< ...
- java:Mybatis框架2(基于mapper接口的开发,多种查询,复合类型查询,resultMap定义,多表联查,sql片段)
1.mybatis02: mybatis-config.xml: <?xml version="1.0" encoding="UTF-8"?> &l ...
- mybatis中的动态SQL(IF Chooes When Where Set ForEach SQL片段)
mapper: public interface BlogMapper { List<Blog> getBlogByIF(Map map); } IF <select id=&quo ...
- mybatis if else if 条件判断SQL片段表达式取值和拼接
前言 最近在开发项目的时候涉及到复杂的动态条件查询,但是mybaits本身不支持if elseif类似的判断但是我们可以间接通过 chose when otherwise 去实现其中choose为一个 ...
- SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 简单概述一下本讲 别名,sql片段简单写一下,模糊查询多写一点 一.别名 <typeAliases> ...
- 使用mybatis提供的各种标签方法实现动态拼接Sql。使用sql片段提取重复的标签内容
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下: <select id="findUserByNameAndSex" par ...
- mybatis动态sql中的sql标签——抽取可重用的sql片段
1.用<sql>标签抽取可重用的sql片段 <!-- 抽取可重用的SQL片段,方便后面引用 1.sql抽取,经常将要查询的列名,或者插入用的列名,之后方便引用 ...
随机推荐
- 新CCIE笔记之'口口相传'路由协议
//由于思科所有命令行中没有尖括号"<>"这样的关键字,所以本文中出现命令行中的尖括号中的内容均为注释提示信息,代表此处应该填入那一类数据. 请容许我将RIP和EIGR ...
- 团队项目beta 汇总
一.冲刺计划安排 http://www.cnblogs.com/KKlist/p/6864124.html 二.七天的敏捷冲刺 第一天(2017.05.19) http://www.cnblogs.c ...
- [2017BUAA软工助教]评论汇总
一 邹欣 周筠 飞龙 二 学校 课程 教师 助教1 助教2 助教3 福州 软件工程1715K 柯逍 谢涛 软件工程1715Z 张栋 刘乾 汪培侨 软件工程1715W 汪璟玢 曾逸群 卞倩虹 李娟 集美 ...
- 201521123065 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 1.ArrayList只能存放对象: 2.对象包装类之间使用equals进行比较 ...
- 201521123098 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 1. Input Stream -- 数据提供者可从其中读数据输出流:Output Stream -- 数据接 ...
- 201521123106 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- 201521123089 《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-21.1 截图你的提交结果(出现 ...
- Hyperledger Fabric 1.0 从零开始(六)——创建Fabric多节点集群
4:创建Fabric多节点集群 4.1.配置说明 首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过 ...
- Python学习笔记008_类_对象_继承_组合_类相关的BIF
# 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...
- Eclipse将引用了第三方jar包的Java项目打包成jar文件
第一步:建议手动 Eclipse插件fatjar 安装方法:1:下载地址:http://downloads.sourceforge.net/fjep/net.sf.fjep.fatjar_0.0.27 ...