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 相关文章推荐
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 Java/Android
详解Java实现数据结构之并查集
Jun 23 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
Jul 16 Java/Android
OpenCV实现普通阈值
Nov 17 Java/Android
利用Sharding-Jdbc进行分库分表的操作代码
Jan 22 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Java 死锁解决方案
May 11 Java/Android
Java实现简单小画板
Jun 10 Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 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
关于尾递归的使用详解
2013/05/02 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
Python2与Python3的区别实例总结
2019/04/17 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
三个python爬虫项目实例代码
2019/12/28 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
如何对python的字典进行排序
2020/06/19 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
介绍下Java的输入输出流
2014/01/22 面试题
银行职员思想汇报
2013/12/31 职场文书
打架检讨书400字
2014/01/17 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
公司新年寄语
2014/04/04 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
详解Python中下划线的5种含义
2021/07/15 Python
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技