MyBatis的动态SQL

MyBatis的动态SQL

别问为什么要用动态sql,如果没用就不会有人开发
mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
下面我介绍一下几种sql标签
先建立一个比较的类QueryBean

public class QueryBean {
    private String keyWord;//关键字,(执行按照学生名字模糊查询)
    private Integer beginAge; //开始年龄
    private Integer endAge;
   }
   getset方法我就不写了,不然太长了,看的厌烦。
< if>标签

使用if标签时,必须要在查询语句后加上 where 1=1 ,这样避免了链接sql语句时出现语句错误

<!--    使用动态SQL  if 
id:接口方法
parameterType:传入参数
resultType:结果类型
-->
    <select id="findByQueryBean" parameterType="QueryBean" resultType="student">
        select  * from tb_stu where 1=1
        <!--test中的变量名 和 #{}中的变量名 都属于当前参数类型中的属性名-->
        <if test="keyWord!=null">
            and  name  like #{keyWord} //对名字模糊查询
        </if>
        <if test="beginAge!=null">
            and age &gt; #{beginAge}<!--&gt;表示大于>--> //查询条件大于该数的年龄
        </if>
        <if test="endAge!=null">
            and age &lt;=  #{endAge}<!--&gt;表示小于<&gt;=表示小于等于--> //查询条件小于该数的年龄
        </if>
    </select>
< where>标签

使用动态SQL where代表 查询后面的where 1=1

    <select id="findByQueryBean" parameterType="QueryBean" resultType="student">
        select  * from tb_stu 
            test中的变量名 和 #{}中的变量名 都属于当前参数类型中的属性名
        <where>
            <if test="keyWord!=null">
            and  name  like #{keyWord}
            </if>
            <if test="beginAge!=null">
            and age &gt; #{beginAge}<!--&gt;表示大于>-->
            </if>
            <if test="endAge!=null">
              and age &lt;= #{endAge}<!--&gt;表示小于<&gt;=表示小于等于-->
            </if>
        </where>
    </select>
< trim>标签前缀和前缀覆盖
  <!--使用动态SQL  trim的使用,它可以代替where (trim的前缀覆盖)
    prefix:前缀
    prefixOverrides:前缀覆盖
    -->
    <select id="findByQueryBean" parameterType="QueryBean" resultType="student">
        select  * from tb_stu
        <!--test中的变量名 和 #{}中的变量名 都属于当前参数类型中的属性名-->
        <trim prefix="where" prefixOverrides="and|or">//前缀:where ,覆盖后面and name like #{keyWord}的and
            <if test="keyWord!=null">
                and  name  like #{keyWord}
            </if>
            <if test="beginAge!=null">
                and age &gt; #{beginAge}<!--&gt;表示大于>-->
            </if>
            <if test="endAge!=null">
                and age &lt;= #{endAge}<!--&gt;表示小于<&gt;=表示小于等于-->
            </if>
        </trim>
    </select>
< set>标签

set:大多用于更新语句,相当于sql语句中的set

    <!--更新学生-->
    <update id="update" parameterType="Student">
        update tb_stu
        <set>
            <if test="name!=null">
                name = #{name},
            </if>
            <if test="age!=null">
                age = #{age},
            </if>
        </set>
        where id = #{id};
    </update>

< trim>标签后缀和后缀覆盖
<!--更新学生  trim的后缀覆盖,因为逗号位于后面,需要被位于前面的set替换-->
    <update id="update" parameterType="Student">
        update tb_stu
        <trim suffixOverrides="," prefix="set">//suffixOverrides:在name = #{name}后缀覆盖逗号,
            <if test="name!=null">
                name = #{name},
            </if>
            <if test="age!=null">
                age = #{age},
            </if>
        </trim>
        where id = #{id};
    </update>
< foreach>标签
 <!--foreach的使用-->
    <select id="findById" parameterType="int" resultType="student">
        select * from tb_stu where id in
        <!--select * from tb_stu where id in (1,2,3)-->//原本写法:查询id等于1,2,3,的数据
        <foreach collection="list" open="(" close=")" separator="," item="abc">//item:代表便利取出的每一个对象,变量名随意
            #{abc}
        </foreach>
    </select>
SQL片段

在上面实例中都有select * from tb_stu这段代码为了代替这段代码,引出了这个标签

<sql id="sql1">
        select * from tb_stu
    </sql>

只需要引用这段代码就可以了。

 <include refid="sql1"></include>

使用方法:以foreach为实例。

<select id="findById" parameterType="int" resultType="student">
        <include refid="sql1"></include>
          where id in
        <!--select * from tb_stu where id in (1,2,3)-->
        <foreach collection="list" open="(" close=")" separator="," item="abc">
            #{abc}
        </foreach>
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值