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 相关文章推荐
Win10系统下配置Java环境变量
Jun 13 Java/Android
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Aug 02 Java/Android
Java移除无效括号的方法实现
Aug 07 Java/Android
Java使用Unsafe类的示例详解
Sep 25 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
mybatis 获取更新记录的id
May 20 Java/Android
httpclient调用远程接口的方法
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
星际争霸任务指南——人族
2020/03/04 星际争霸
apache php模块整合操作指南
2012/11/16 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
Java中final关键字详解
2015/08/10 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
python取余运算符知识点详解
2019/06/27 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
python 利用toapi库自动生成api
2020/10/19 Python
python 写一个性能测试工具(一)
2020/10/24 Python
selenium自动化测试入门实战
2020/12/21 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
Linux机考试题
2015/10/16 面试题
生产管理的三大手法
2013/11/11 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
自我鉴定标准格式
2014/03/19 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python