关于mybatis的动态sql

动态SQL

SQL的结构不是一层不变的,根据具体的需求和情况动态生成的SQL即动态SQL,可以提高程序的灵活性、扩展性

常见的标签有:< where >、< if>、< choose >、< when >、< set >、< foreach>

在这里插入图片描述

  • 根据CNO查询用户信息
  • 根据CNO和NAME查询用户信息
  • 根据CNO和CLASS查询用户信息

常规写法:

    <select id="findByCno" resultType="Card">
        select * from card where CNO = #{CNO}
    </select>

    <select id="findByCnoandName" parameterType="java.lang.String" resultType="Card">
        select * from card where CNO = #{arg0} and NAME = #{arg1}
    </select>

    <select id="findByCnoandClass" parameterType="java.lang.String" resultType="Card">
        select * from card where CNO = #{arg0} and CLASS = #{arg1}
    </select>

动态SQL:

    <select id="findByCard" parameterType="Card" resultType="Card">
        select * from card
        <where>
            <if test="CNO!=null">
                 CNO = #{CNO}
            </if>
            <if test="NAME!=null">
              and  NAME = #{NAME}
            </if>
            <if test="CLASS!=null">
               and CLASS = #{CLASS}
            </if>
        </where>
    </select>do

常规写法需要实体类对应接口中定义三个方法,而动态接口只需要定义一个方法

public interface CardMapper {
    //普通sql
    public Card findByCno(String CNO);
    public Card findByCnoandName(String CNO,String NAME);
    public Card findByCnoandClass(String CNO,String CLASS);

    //动态sql
    public Card findByCard(Card card);

}

定义需要传入对象的参数便可动态生成所需的SQL语句

        //普通sql
        System.out.println(cardMapper.findByCno("sx001"));
        System.out.println(cardMapper.findByCnoandClass("sx001", "c01"));
        System.out.println(cardMapper.findByCnoandName("sx007", "宝乐"));

        //动态sql语句 传入的参数是Card
        Card card = new Card();
        card.setCNO("sx001");
        card.setNAME("宝乐01");
        System.out.println(cardMapper.findByCard(card));     

以上为动态sql与普通sql的对比

——————————————————————————————

< when > 和 < if > 区别

< where > < if > 搭配使用,if 标签用来处理流程控制,动态判断是否添加某个表达式, where 标签结合多条件判断语句使用,而且动态处理sql语句中的 … where and … ,当 where 直连 and 的时候,自动删除 and

< choose > < when> 跟 < where > < if > 作用基本无差,但区别在于,当第一个 when 成立时,后面的 when 不做判断直接忽略 ,类似 switch case break

 <select id="findByCard2" parameterType="Card" resultType="Card">
        select * from card
        <where>
        <choose>
            <when test="CNO!=null">
                CNO = #{CNO}
            </when>
            <when test="NAME!=null">
                and NAME = #{NAME}
            </when>
            <when test="CLASS!=null">
                CLASS = #{CLASS}
            </when>
        </choose>
        </where>
    </select>

< set > 标签

作用于 update 操作,会根据参数选择生成修改的SQL语句

<update id="update" parameterType="Card" >
        <!--update card set NAME = #{NAME},CLASS = #{CLASS} where CNO = #{CNO}-->
        update card
        <set>
            <if test="NAME!=null">
                  NAME = #{NAME}
            </if>
            <if test="CLASS!=null">
                and CLASS = #{CLASS}
            </if>
        </set>
         where  CNO = #{CNO}
    </update>

< foreach > 标签

迭代生成一系列值,主要用于 in 查询

<select id="findByCard3" parameterType="Card" resultType="Card">
        select * from card
        <where>
            <foreach collection="IDS" open="CNO in (" close=")" item="CNO" separator=",">
                #{CNO}
            </foreach>
        </where>;
    </select>
  1. collection :实体类对象定义的集合名字
    在这里插入图片描述

  2. open、close :对应拼接SQL条件的开始和结尾的字符串
    在这里插入图片描述

  3. index :自定义的变量名

  4. separator :数据之间的分隔符号
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值