一步步学Mybatis-怎么样实现动态SQL查询(6)
2013-12-27 17:34
666 查看
上一章我们已经讲完了关于Mybatis的分页用法,其实MyBatis 还具有的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用 JDBC 或其他 相似框架的经验,你就明白要动态的串联 SQL 字符串在一起是十分纠结的,确保不能忘了空格或在列表的最后省略逗号。Mybatis中的动态 SQL 可以彻底处理这种痛苦。对于动态SQL,最通俗简单的方法就是我们自己在硬编码的时候赋予各种动态行为的判断,而在Mybatis中,用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。动态 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本处理器相似。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
本章中我们利用前几章构建的实例,假设几种应用情况,通过实践了解这几种动态SQL标签的用法,毕竟学习最快的途径就是动手实践~
我们常用的几个节点元素有if,choose(when, otherwise),trim(where, if),foreach。真正使用下来我感觉有点像XSLT的用法。详细用法说明(点我)
(1)if 的用法
还记得上一章中我们有再ViisitMapper的分页配置中看到if节点吗,如果pageIndex>-1 and pageSize>-1的时候就加入相应的分页SQL,否则就不添加(默认取全部),如下:
因为我们的参数pageIndex与pageSize都是int值所以可以这样直接判断,如果是对象实例我们可以利用null判断来进行一些动态逻辑的控制,具体实际开发中就要看业务需求了。这里我认为要注意的是别十分顺手的吧and写成&&,这个在配置中不会被识别~。
(2)choose (when, otherwise)的用法
choose when 主要在多个条件的情况下只满足其中一个条件的应用场景中使用,例如这里就构建一个query条件,分别传递id,name与createTime。假设我们查询Visitor表时,如果VisitorId有值则,使用Id查询,如果VisitorName有值则采用VisitName查询,如下,还是在david.mybatis.demo.IVisitorOperation接口类中添加List<Visitor> getListChooseWhenDemo(BasicQueryArgs args)方法。在VisitorMapper中添加相应的的select节点配置:
DemoRun方法
最后一章会讲述,怎么MybatisGenerator生成工具生成这些配置与文件~
本章中我们利用前几章构建的实例,假设几种应用情况,通过实践了解这几种动态SQL标签的用法,毕竟学习最快的途径就是动手实践~
我们常用的几个节点元素有if,choose(when, otherwise),trim(where, if),foreach。真正使用下来我感觉有点像XSLT的用法。详细用法说明(点我)
(1)if 的用法
还记得上一章中我们有再ViisitMapper的分页配置中看到if节点吗,如果pageIndex>-1 and pageSize>-1的时候就加入相应的分页SQL,否则就不添加(默认取全部),如下:
<select id="getListByPagenate" parameterType="PagenateArgs" resultType="Visitor"> select * from ( <include refid="getListSql" /> <include refid="orderBySql"/> ) t <!-- #{}表示参数化输出,${}表示直接输出不进行任何转义操作,自己进行转移 --> <if test="pageStart>-1 and pageSize>-1"> limit #{pageStart}, #{pageSize} </if> </select> <sql id="getListSql"> select * from Visitor where status>0 </sql> <sql id="orderBySql"> order by ${orderFieldStr} ${orderDirectionStr} </sql>
因为我们的参数pageIndex与pageSize都是int值所以可以这样直接判断,如果是对象实例我们可以利用null判断来进行一些动态逻辑的控制,具体实际开发中就要看业务需求了。这里我认为要注意的是别十分顺手的吧and写成&&,这个在配置中不会被识别~。
(2)choose (when, otherwise)的用法
choose when 主要在多个条件的情况下只满足其中一个条件的应用场景中使用,例如这里就构建一个query条件,分别传递id,name与createTime。假设我们查询Visitor表时,如果VisitorId有值则,使用Id查询,如果VisitorName有值则采用VisitName查询,如下,还是在david.mybatis.demo.IVisitorOperation接口类中添加List<Visitor> getListChooseWhenDemo(BasicQueryArgs args)方法。在VisitorMapper中添加相应的的select节点配置:
/* * 动态查询foreach实例 */ public static void getListForeachDemo(List<Integer> ids) { SqlSession session = MybatisUtils.getSqlSession(); IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class); List<Visitor> ls = vOperation.getListForeachDemo(ids); for (Visitor visitor : ls) { System.out.println(visitor); } } /* * 动态查询where if实例 */ public static void getListWhereCondition(int id, String name, Date createTime) { name = name == "" ? null : name; SqlSession session = MybatisUtils.getSqlSession(); BasicQueryArgs args = new BasicQueryArgs(id, name, createTime); IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class); List<Visitor> ls = vOperation.getListWhereDemo(args); if (ls.size() == 0) System.out.println("查无匹配!"); else { for (Visitor visitor : ls) { System.out.println(visitor); } } } /* * 动态查询choose when实例 */ public static void getListChooseWhenDemo(int id, String name, Date createTime) { name = name == "" ? null : name; SqlSession session = MybatisUtils.getSqlSession(); BasicQueryArgs args = new BasicQueryArgs(id, name, createTime); IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class); List<Visitor> ls = vOperation.getListChooseWhenDemo(args); if (ls.size() == 0) System.out.println("查无匹配!"); else { for (Visitor visitor : ls) { System.out.println(visitor); } } }
DemoRun方法
最后一章会讲述,怎么MybatisGenerator生成工具生成这些配置与文件~
相关文章推荐
- Spring+Mybatis实现动态SQL查询
- spring多数据源的处理 mybatis实现跨库查询 实现Myibatis动态sql跨数据库的处理 Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样
- MyBatis入门07--实现sql动态模糊查询
- MyBatis中的动态SQL,实现不确定条件的CRUD-----使用Map来传递查询的参数
- Spring+Mybatis实现动态SQL查询
- 一步步学Mybatis-实现多表联合查询(4)
- MyBatis中动态sql的实现方法示例
- 自己动手实现mybatis动态sql的方法
- 多数据源,动态配置SQL实现灵活的查询
- MyBatis的动态SQL的模糊查询
- mybatis动态sql查询
- 【Mybatis学习总结六】动态SQL与模糊查询
- mybatis_动态sql 查询、更新
- Mybatis实例 简单查询 事务处理 关联、集合查询 鉴别器 动态SQL及各种标签实例
- SQL SERVER 动态SQL实现 多条件查询数据
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- JSP Servlet 实现模糊动态查询并分页(拼接Sql)
- 【Maven+SSM】Mybatis基础使用及动态SQL拼接根据对象查询数据
- kettle中实现动态SQL查询
- 6.1 Mybatis实现动态SQL——<if></if>使用