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 11 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
springboot项目以jar包运行的操作方法
Jun 30 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 Java/Android
简述Java中throw-throws异常抛出
Aug 07 Java/Android
Spring Security中用JWT退出登录时遇到的坑
Oct 16 Java/Android
Java 在线考试云平台的实现
Nov 23 Java/Android
解析探秘fescar分布式事务实现原理
Feb 28 Java/Android
Spring依赖注入多种类型数据的示例代码
Mar 31 Java/Android
springboot 全局异常处理和统一响应对象的处理方式
Jun 28 Java/Android
OpenFeign实现远程调用
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
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
5 cool javascript apps
2007/03/24 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
Python文件处理
2016/02/29 Python
详细介绍Python的鸭子类型
2016/09/12 Python
django文档学习之applications使用详解
2018/01/29 Python
Python yield与实现方法代码分析
2018/02/06 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
企业业务员岗位职责
2014/03/14 职场文书
大学学习计划书范文
2014/05/02 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python