MyBatis在注解上使用动态SQL方式(@select使用if)


Posted in Java/Android onJuly 07, 2022

MyBatis在注解上使用动态SQL

1、用script标签包围

然后像xml语法一样书写

@Select({"<script>",
                "SELECT * FROM tbl_order",
                "WHERE 1=1",
                "<when test='title!=null'>",
                "AND mydate = #{mydate}",
                "</when>",
                "</script>"})

2、用Provider去实现SQL拼接

例如:

public class OrderProvider {
    private final String TBL_ORDER = "tbl_order"; 
    public String queryOrderByParam(OrderPara param) {
        SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER);
        String room = param.getRoom();
        if (StringUtils.hasText(room)) {
            sql.WHERE("room LIKE #{room}");
        }
        Date myDate = param.getMyDate();
        if (myDate != null) {
            sql.WHERE("mydate LIKE #{mydate}");
        }
        return sql.toString();
    }
}
 
public interface OrderDAO {    
    @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam")
    List<Order> queryOrderByParam(OrderParam param); 
}

注意:方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。

复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似Spring JDBC Template。

3、说明

如果XML元素嵌入在<script>XML元素中,则可以在注释值中为动态SQL使用XML元素:

@Select("<script>SELECT ...</script>")

但是使用<include>元素会触发SQL Mapper配置解析异常,由以下原因引起:

org.apache.ibatis.builder.BuilderException: Unknown element in SQL statement. at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags

如果nodeHandlers在课堂中检查方法org.apache.ibatis.builder.BuilderException,将注意到支持的元素有:

  • trim
  • where
  • set
  • foreach
  • if
  • choose
  • when
  • otherwise
  • bind

然而,包括基于注释的查询中的片段是不可能的。

MyBatis xml注释SQL的注意事项

说明:在mybatis 的sql里不是不能写注释,而是注释不能有#{},mybatis仍旧会把#{}算成一个带注入的参数

如代码段2所示,mysql数据库更换为oracle数据库时,#{date}需要明确jdbcType,而该代码段中仅将适用于mysql的sql注释,依旧会报同样的错,最好是将注释的sql删除。

 <select id="slectSlagsteelRatioByDate" resultType="java.lang.Double">
 
--         select slagsteel_ratio FROM process_history WHERE r furnace_num = #{furnaceNum}
--         ORDER BY real_time DESC limit 0,1
 
select slagsteel_ratio FROM(
 select slagsteel_ratio FROM process_history WHERE real_time &lt;= #{date,jdbcType=TIMESTAMP}
 ORDER BY real_time DESC ) WHERE ROWNUM = 1
</select>

注意事项

1、where语句等用到大于小于等符号时候,需要使用 <![CDATA[ > ]]>或者 <![CDATA[ < ]]>进行识别。

2、如果sql文中有动态sql文标签,比如sql文,此时wwww为传递的参数,不需用#{wwww }取值,直接使用即可。

3、如果超过一个参数,需要在接口方法的每个参数定义时候使用@Param注解。

4、order by语句可以使用动态sql

ORDER BY eeee ORDER BY rrrrrr

5、SELECT

           CASE
           WHEN  条件1 THEN 字段1

WHEN 条件2 THEN 字段2

           ELSE    字段3
           END
  FROM.....

只要满足一个WHEN,后面的WHEN就不会执行了,跳出CASE WHEN 语句

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。


Tags in this post...

Java/Android 相关文章推荐
详解Java实践之建造者模式
Jun 18 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
看完这篇文章获得一些java if优化技巧
Jul 15 Java/Android
Java spring单点登录系统
Sep 04 Java/Android
springboot 多数据源配置不生效遇到的坑及解决
Nov 17 Java/Android
解析探秘fescar分布式事务实现原理
Feb 28 Java/Android
Java生成日期时间存入Mysql数据库的实现方法
Mar 03 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Netty客户端接入流程NioSocketChannel创建解析
Mar 25 Java/Android
Springboot-cli 开发脚手架,权限认证,附demo演示
Apr 28 Java/Android
Java 数组的使用
May 11 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
Jul 23 Java/Android
一文了解Java动态代理的原理及实现
Jul 07 #Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 #Java/Android
Spring中bean集合注入的方法详解
java中如何截取字符串最后一位
Jul 07 #Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 #Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 #Java/Android
利用Java连接Hadoop进行编程
Jun 28 #Java/Android
You might like
oracle资料库函式库
2006/10/09 PHP
PHP中的use关键字概述
2014/07/23 PHP
php生成html文件方法总结
2014/12/01 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
python中import reload __import__的区别详解
2017/10/16 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
西雅图的买手店:Totokaelo
2019/10/19 全球购物
网络安全方面的面试题
2015/11/04 面试题
编辑找工作求职信分享
2014/01/03 职场文书
自我评价的写作规则
2014/01/06 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
大学生村官个人总结
2015/02/15 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript