mybatis入门-动态sql

Posted 精品唯居

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis入门-动态sql相关的知识,希望对你有一定的参考价值。

 什么是动态sql

  判断的动态sql

    mybatis核心就是对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

    现有需求如下:需要查询用户,输入的是用户类,如果用户的性别类不为空,则将性别作为查询条件之一,如果用户的姓名不为空,则将用户姓名作为查询条件之一。如果用户两个属性都为空,则查询所有用户。

    我们知道,在mapper中,我们的传入参数只有一个,多个参数只能通过包转类来实现,现在这种问题怎么解决呢?答案就是在xml文件中加入判断,使sql语句动态生成。刚才的需求所对应的mapper.xml文件代码如下:

    

    sql片段

    将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。

    定义一个sql片段

    

    引用一个sql片段

    

  foreach

    在我们的sql语句中,有时候会出现这种情况:

    SELECT * FROM USER WHERE id=1 OR id=10 OR id=16

    SELECT * FROM USER WHERE id IN(1,10,16)

    我们要用foreach来解决这个问题,代码如下:

    

 1 <sql id="query_user_where">
 2         <if test="userCustom!=null">
 3             <if test="ids!=null">
 4             <!-- 使用 foreach遍历传入ids
 5             collection:指定输入 对象中集合属性
 6             item:每个遍历生成对象中
 7             open:开始遍历时拼接的串
 8             close:结束遍历时拼接的串
 9             separator:遍历的两个对象中需要拼接的串
10              -->
11              <!-- 使用实现下边的sql拼接:
12               AND (id=1 OR id=10 OR id=16) 
13               -->
14             <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
15                 <!-- 每个遍历需要拼接的串 -->
16                 id=#{user_id}
17             </foreach>
18             
19             <!-- 实现  “ and id IN(1,10,16)”拼接 -->
20             <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=",">
21                 每个遍历需要拼接的串
22                 #{user_id}
23             </foreach> -->
24             
25             </if>
26         </if>
27     </sql>
View Code

 

以上是关于mybatis入门-动态sql的主要内容,如果未能解决你的问题,请参考以下文章

mybatis学习(39):动态sql片段

mybatis快速入门

mybatis动态sql片段与分页,排序,传参的使用

Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取

mybatis动态sql之利用sql标签抽取可重用的sql片段

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段