动态sql和连表查询

1.动态sql

(1.1)SET标签

配合if一起用,一般用在修改语句。如果传递的值为null,那么应该不修改该列的值

(1.2)foreach循环标签

批量查询:

    <select id="finds" resultMap="r">
        <!-- select * from user where id in(2,3,5,7,0)
        如果你使用的为数组array  如果你使用的为集合 那么就用list
        collection:类型
        item:数组中每个元素赋值的变量名
        open: 以谁开始
        close:以谁结束
        separator:分割符
        -->
        select * from user where id in 
        <foreach collection="array" item="i" open="(" separator="," close=")">
            #{i}
        </foreach>
    </select>

批量删除:

    <delete id="deletes">
        delete from user where id in 
        <foreach collection="array" open="(" separator="," close=")" item="i">
            #{i}
        </foreach>
    </delete>

批量添加:

    <insert id="saveBatch">
       // insert into account(name,isdeleted) values
        <foreach collection="list" item="i" separator=",">
            (#{i.name},#{i.isdeleted})
        </foreach>
    </insert>

(1.3)trim标签

trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码:

  1、

  select * from user 

  <trim prefix="WHERE" prefixoverride="AND |OR">

    <if test="name != null and name.length()>0"> AND name=#{name}</if>

    <if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>

  </trim>

  假如说name和gender的值都不为null的话打印的SQL为:select * from user where    name = 
    'xx' and gender = 'xx'

  在红色标记的地方是不存在第一个and的,上面两个属性的意思如下:

  prefix:前缀      

  prefixoverride:去掉第一个and或者是or

 

  2、

  update user

  <trim prefix="set" suffixoverride="," suffix=" where id = #{id} ">

    <if test="name != null and name.length()>0"> name=#{name} , </if>

    <if test="gender != null and gender.length()>0"> gender=#{gender} ,  </if>

  </trim>

  假如说name和gender的值都不为null的话打印的SQL为:update user set name='xx' , gender='xx'     where id='x'

  在红色标记的地方不存在逗号,而且自动加了一个set前缀和where后缀,上面三个属性的意义如下,其中prefix意义如上:

  suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)

  suffix:后缀

2.sql片段

sql片段主要是解决冗余的代码片段,减少开发,使代码整洁、高效

3. mybatis映射文件处理特殊字符

(3.1)转义字符:&gt;(>)

                        &lt;(<)...

(3.2)因为在解析xml文件时候,我们如果书写了特殊字符,在没有特殊处理的情况下。这些字符会被转义,但我们并不希望它被转义,所以我们要使用<![CDATA[ ]]>来解决。

那为什么要这样书写呢?<![CDATA[ ]]> ,不言而喻:这是XML语法。在CDATA内部的所有内容都会被解析器忽略。

有个问题需要注意的就是在我们的mybatis的映射文件中,以下 等这些标签都不会被解析,所以我们只把有特殊字符的语句放在 <![CDATA[ ]]>中,尽量缩小 <![CDATA[ ]]> 的范围。

 <where>
               <if test="targetId != null">
                    and (t.busi_sys_order = #{targetId,jdbcType=VARCHAR}
                        or t.busi_intf_seq = #{targetId,jdbcType=VARCHAR}
                    )
                </if>
                <if test="targetId == null and shardingTotal > 0">
                    and (t.task_status = '0'
                        OR (t.task_status = '3'
                            AND t.task_count <![CDATA[ < ]]> ${@com.asiainfo.bst.common.Constant@max_handle_count()}
                        )
                    )
                    and MOD(t.msg_id,#{shardingTotal,jdbcType=NUMERIC}) = #{shardingIndex,jdbcType=NUMERIC}
               </if>
 </where>

4. mybatis完成模糊查询

  (4.1) sql中字符串拼接

   SELECT * FROM user WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%');

(4.2)使用 ${...} 代替 #{...}

   SELECT * FROM user WHERE name LIKE '%${text}%';

  (4.2.1)${}与#{}的区别

使用${}实际上是字符串拼接,它不能防止sql注入, 而#{}它是预编译,它可以防止sql注入问题,#{}实际使用的PreparedStatement。

5.连表查询

多对一

 

 

    <resultMap id="r" type="User">
        <id column="id" property="u_id"/>
        <result column="username" property="u_username" />
        <result column="password" property="u_password" />
        <result column="name" property="u_name" />
        <!--association: 表示一的一方
                property: 它表示属性名
                javaType: 该属性名对应的数据类型
           -->
        <association property="clazz" javaType="Clazz" >
            <id column="cl_id" property="cl_id"/>
            <result column="cl_name" property="cl_name"/>
        </association>
    </resultMap>
    <select id="findByClazzAfter" resultMap="r">
        select * from user join class on c_id=cl_id where id=#{id}
    </select>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值