05 Mybatis的动态Sql

作者: better_future | 来源:发表于2020-04-24 21:57 被阅读0次

Mybatis的动态Sql

Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。

动态 SQL 之<if> 标签
List<User> findByUser(User user);
<select id="findByUser" resultType="com.it.pojo.User" parameterType="com.it.pojo.User">
            select * from user where 1=1
            <if test="username!=null and username != ''">
                and username like #{username}
            </if>
            <if test="address != null">
                and address like #{address}
            </if>
        </select>

注意:<if>标签的test属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。
另外要注意 where 1=1的作用~!
测试:

    @Test
    public void testFindUser(){
        User user = new User();
        user.setUsername("%王");
        user.setAddress("北京");
        List<User> users = userDao.findByUser(user);
        System.out.println(users);
    }
动态 SQL 之<where> 标签

为了简化上面 where 1=1的条件拼装,我们可以采用<where>标签来简化开发。

<select id="findByUser" resultType="com.it.pojo.User" parameterType="com.it.pojo.User">
            select * from user
            <where>
                <if test="username!=null and username != ''">
                    and username like #{username}
                </if>
                <if test="address != null">
                    and address like #{address}
                </if>
            </where>
 </select>

有代码片段拼接的时候不要使用分号;

动态标签之<foreach> 标签

传入多个 id 查询用户信息,用下边两个 sql 实现:

SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%张%' AND id IN (10,89,16)
public class QueryIdVo implements Serializable {

    private List<Integer> ids;
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}
List<User> findInIds(QueryIdVo vo);
<select id="findInIds" resultType="com.it.pojo.user" parameterType="com.it.vo.QueryIdVo">
            select * from user
      <where>
         <if test="ids !=null and ids.size() > 0">
              <foreach  open="id in (" close=")"  collection="ids"  item="uid" separator=",">
                        #{uid}
             </foreach>
         </if>
     </where>
 </select>

先判断pojo中的ids属性是否为空,然后执行sql语句,将ids进行遍历,获得所有id的值再ids中的数据。
SQL 语句:
select 字段 from user where id in (?)
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符

 @Test
    public void testFindInds(){
        QueryIdVo queryIdVo = new QueryIdVo();
        ArrayList<Integer> ids = new ArrayList<Integer>();
        ids.add(41);
        ids.add(42);
        ids.add(43);
        ids.add(46);
        ids.add(57);
        queryIdVo.setIds(ids);
        List<User> users = userDao.findInIds(queryIdVo);
        for(User user:users){
            System.out.println(user);
        }
    }

相当于

select * from user where id in (41,42,43,46,57)

Mybatis 中简化编写的 SQL

<!-- 抽取重复的语句代码片段 -->
<sql id="defaultSql">
select * from user
</sql>

引用代码片段

<!-- 配置查询所有操作 -->
<select id="findAll" resultType="user">
<include refid="defaultSql"></include>
</select>

相关文章

  • MyBatis动态SQL

    MyBatis 动态SQL 内容 Mybatis动态SQL在XML中支持的几种标签: if chose trim、...

  • MyBatis核心知识点

    (1)Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不? Mybatis动...

  • MyBatis 动态SQL(*.xml)

    原文参考MyBatis 动态SQL MyBatis的动态SQL大大减少了拼接SQL语句时候的各种格式问题,这里摘录...

  • Mybatis动态SQL

    MyBatis Mybatis笔记连载上篇连接MyBatis缓存Mybatis笔记连载下篇连接 动态SQL 动态S...

  • MyBatis的动态SQL与日志Log4J、SQL语句构造器

    一、MyBatis动态SQL 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似...

  • MyBatis学习:动态sql

    1.动态sql 动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通...

  • 第八章 动态SQL

    动态SQL中的元素介绍 动态SQL有什么作用 MyBatis提供了对SQL语句动态组装的功能 动态SQL中的元素 ...

  • JavaEE基础知识学习----MyBatis(四)动态SQL

    MyBatis的动态SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似...

  • 关于Mybatis的一些问题讨论

    Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理 动态sql的用途 Mybat...

  • IT 每日一结

    mybatis动态sql 动态sql绝对是mybatis排列前几的闪光点之一。传统代码中的sql语句需要经过多个字...

网友评论

    本文标题:05 Mybatis的动态Sql

    本文链接:https://www.haomeiwen.com/subject/mdiqwhtx.html