Mybatis动态查询

mybatis 中的动态查询

😎
多条件的查询

if

if 根据标签中test的属性所对应的表达式决定标签中的内容是否拼接到sql语句中

  <select id="getUserByCondition" resultType="User">
        select * from t_user where 'cwlz'='cwlz'

        <if test="userName != null and userName != '' ">
            and user_name = #{userName}
        </if>
        <if test="age != null and age != '' ">
            and age = #{age}
        </if>


    </select>

上面的where后面的 1=1 是细节,因为当where后面的条件都为空时就成了 select * from t_user where
显然这种sql语句是有问题的,还有一种情况就是当userName为null时语句就成了 select * from t_user where and age=#{age}
这也是错的,所以在where后加一个恒成立的条件不仅不会影响查询结果,而且没有会在特定情况时sql语句是会报错的所以很有必要

where

where 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and 或者or去掉
当where中没有内容时,此时where标签没有任何效果 就是不会生成关键字注意:在写条件时不能在后面加and or 这个在下一条语句无效时mybatis不会帮你去掉!

trim

  • prifix|suffix : 将trim标签中在内容前面或后面添加指定内容
  • suffixOverrides|prefixOverrides: 将trim标签中内容前面或后面去掉指定内容
    <select id="getUserByCondition" resultType="User">
        select * from t_user
        <trim prefix="where" suffix="" prefixOverrides="" suffixOverrides="and|or" >
            <if test="userName != null and userName != '' ">
                user_name = #{userName} and
            </if>
            <if test="age != null and age != '' ">
                age = #{age} and
            </if>
            <if test="password != null and password !=''">
               password = #{password}
            </if>

        </trim>
    </select>

choose when otherwise

相当于 if else

  • choose:用于包when otherwise
  • when: 相当于if
  • otherwise: else
    <select id="getUserByCondition" resultType="User">
        select * from t_user
       <where>
            <choose>
                <when test="userName != null and userName != '' ">
                    user_name = #{userName}
                </when>
                <when test="age != null and age != '' ">
                    age = #{age}
                </when>
                <when test="password != null and password != '' ">
                    password = #{password}
                </when>

                <otherwise>
                    did = 1
                </otherwise>

            </choose>
        </where>
    </select>

foreach

一个案例 -->就是当我们需要批量删除一些东西时(参数以数组的形式传入)

  <delete id="deletesByIds" >
       delete from t_user where id in
        (
            <foreach collection="ids" item="id" separator=",">
                #{id}
            </foreach>
            )
   </delete>
  • collection 是需要遍历的集合
  • item 代表当前的
  • separator 分隔
  • open 以什么开始,在上面案例中的括号可以 open="(" 这样写
  • close 以什么结束,在上面案例中的括号可以 open=")" 这样写
  <delete id="deletesByIds" >
       delete from t_user where id in
            <foreach collection="ids" item="id" separator="or" open="(" close=")">
                id = #{id}
            </foreach>
   </delete>

sql

sql 片段: 在我们的查询语句不能在实际开发中也一直写 *;因为我们要按需查找,不必将不需要的也查询出来,我们可以将我们平常查询次数较多的字段
放在sql片段内,可以在需要查询时直接进行引用!

 <sql id="sqldept"> id,dept_name</sql>
<select id="getDeptAndById" resultMap="m2">
select <include refid="sqldept"></include> from t_dept where id = #{did}
</select>
posted @ 2022-04-28 15:17  kobedu  阅读(1519)  评论(0编辑  收藏  举报