zoukankan      html  css  js  c++  java
  • Mybatis动态SQL简单了解 Mybatis简介(四)

    动态SQL概况

    MyBatis 的强大特性之一便是它的动态 SQL
    在Java开发中经常遇到条件判断,比如:
    if(x>0){
    //执行一些逻辑........
    }
     
    Mybatis应用中,SQL映射通常位于XML文件内,在执行前需要将XML中的映射转换为最终要执行的SQL
    在转换中是否可以根据输入动态的处理SQL?这就是动态SQL,比如
    <select id="findActiveBlogWithTitleLike"
    resultType="Blog">
    SELECT * FROM BLOG
    WHERE state = ‘ACTIVE’
    <if test="title != null">
    AND title like #{title}
    </if>
    </select>
    上面的<if test="title != null"> 就是动态SQL处理,将会根据实际传递的title的值,动态的决定SQL的内容,是否包含最后面的AND

    Mybatis的动态SQL元素不多,但是简单高效,Mybatis的动态SQL元素类似JSTL

    类型主要有三种:
    • 条件判断
    • 内容处理
    • 循环处理
    image_5c564f01_19a3
    对于每种不同的类型又有各自的格式和属性
    image_5c564f01_51d9
     


    条件处理

    if是最基本的一种形式,语意为:如果xxx就xxx
    通过最基本的if可以构造很复杂的条件测试语句,相当于
    if(){
    }
    choose是特殊化的if,相当于
    if(){
    }else{
    }
    你可以添加多个if,比如
    if(){
    }if(){
    }if(){
    }else{
    } 
    通常对于一个choose是可以拆分为多个if条件的,但是很显然,某些场景下,使用if else的形式比多个if 要更加简单清晰
    if和choose里面when后的条件都是使用test进行设置的

    内容处理

    trim用于动态内容头尾的处理,可以添加前缀prefix或者添加后缀suffix
    也可以移除匹配的指定的前缀prefixOverrides,或者移除匹配的指定的后缀suffixOverrides
    简言之可以借助于trim对拼接内容的头尾进行处理
    where相当于
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
    表示在最前面添加where,如果最开始是AND 或者OR 将会进行删除
    set相当于<trim prefix="SET" suffixOverrides=",">
    表示在最前面添加set,如果最后面是一个逗号,   将他删除

    循环遍历

    foreach用于动态的循环拼接,相当于for循环动态拼接内容
    forint i =0;i<list.size;i++){
    String s +=“...”;
    }
    对于foreach,需要指明需要遍历循环的参数名称,通过collection指定
    需要指定循环变量,也就是在循环中使用哪个变量指代,相当于Object o = list.get(i);  使用item指定的就是这个o
    还可以指定变量用于记录索引,通过这个索引变量可以获得迭代的次数索引,通过index
    对于open, separator, close,就是在字符串拼接的开头,中间,结尾,添加的分割符信息。

    总结

    在实际项目应用中,总是有很多的查询条件或者关联语句,但是并不是每一次的查询都需要完整的语句,难道每种场景都重新写一个SQL吗?
    显然是效率低下的,Mybatis的动态SQL就是解决这种问题的
    动态SQL就是根据条件动态的处理SQL语句,进而达到不同场景不同SQL的作用,也就是写一次SQL,然后经过条件分支或者内容的处理,能够在多个场景进行使用
    从上面的介绍也可以看得出来,动态SQL的本质在于根据条件,对SQL语句处理,可以理解为文本处理工作
    他只是Mybatis一次执行时实际执行的SQL语句,不管是if还是choose 还是where还是trim,再或者是foreach,都是简单的对SQL进行拼接、处理、优化
    对于程序员来说,最重要的就是条件的判断,也就是test后面的语句的书写,再就是确认各种条件判断后处理后的SQL语句不会出现什么问题就够了
    但是还需要注意,尽管Mybatis有动态SQL功能,可以灵活的拼接SQL,但是也不要滥用,尽可能业务逻辑比较相似的,通过条件进行控制
    试想,如果一整个表的所有逻辑全都是一个SQL,通过各种if choose拼接起来,可读性是一个很大的问题,所以也要合理
    简单说几点就是:
    • 动态SQL本质就是SQL语句的文本处理工作,无他
    • 要注意条件语句的设置
    • 不要滥用动态SQL,该分开还是得分开
    对于动态SQL根本仍旧是SQL的编写,所以需要具有良好的SQL语句编写能力,动态SQL只是可以让他更加灵活,并不能解决你SQL中的任何问题,或者性能问题
    要始终记住,他只是处理需要执行的SQL
     
  • 相关阅读:
    Mybatis批量插入
    easyui中datagrid常见功能
    mysql下载和安装方式
    Mybatis注意事项
    ol3对地图上某些特定的经纬度进行标注
    ol3开发离线地图
    java利用poi生成excel文件后下载本地
    log4j的基本使用方法
    tomcat8.5之后版本,远程无法登录管理页面
    但构造函数返回对象时
  • 原文地址:https://www.cnblogs.com/noteless/p/10349745.html
Copyright © 2011-2022 走看看