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中Collection的一些常用方法总结
Jun 13 Java/Android
解决SpringCloud Feign传对象参数调用失败的问题
Jun 23 Java/Android
Spring Data JPA的Audit功能审计数据库的变更
Jun 26 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
SpringBoot快速入门详解
Jul 21 Java/Android
用Java实现简单计算器功能
Jul 21 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
Java练习之潜艇小游戏的实现
Mar 16 Java/Android
springboot 自定义配置 解决Boolean属性不生效
Mar 18 Java/Android
Java 超详细讲解IO操作字节流与字符流
Mar 25 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
SpringBoot详解执行过程
Jul 15 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 return语句的另一个作用
2014/07/30 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
javascript简单写的判断电话号码实例
2017/05/24 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
有关Python的22个编程技巧
2018/08/29 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
Pytorch释放显存占用方式
2020/01/13 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
python关于倒排列的知识点总结
2020/10/13 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
学生实习介绍信
2014/01/15 职场文书
学籍证明模板
2014/11/21 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
趣味运动会赞词
2015/07/22 职场文书
基于Python实现股票收益率分析
2022/04/02 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python