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基础之this关键字的使用
Jun 30 Java/Android
详细了解java监听器和过滤器
Jul 09 Java/Android
Java日常练习题,每天进步一点点(38)
Jul 26 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
Sep 25 Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
Sep 25 Java/Android
SpringBoot中HttpSessionListener的简单使用方式
Mar 17 Java/Android
Spring this调用当前类方法无法拦截的示例代码
Mar 20 Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 Java/Android
解决springboot druid数据库连接失败后一直重连的方法
Apr 19 Java/Android
Java Spring Boot 正确读取配置文件中的属性的值
Apr 20 Java/Android
Java设计模式之代理模式
Apr 22 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
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
经验几则 推荐
2006/09/05 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
实例Python处理XML文件的方法
2015/08/31 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
大学总结自我鉴定
2014/01/18 职场文书
最美护士演讲稿
2014/08/27 职场文书
公务员培的训心得体会
2014/09/01 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
高二英语教学反思
2016/03/03 职场文书
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server