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 相关文章推荐
SpringAop日志找不到方法的处理
Jun 21 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
Spring-cloud Config Server的3种配置方式
Sep 25 Java/Android
MyBatis自定义SQL拦截器示例详解
Oct 24 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
关于MybatisPlus配置双数据库驱动连接数据库问题
Jan 22 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
关于EntityWrapper的in用法
Mar 22 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Apr 26 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
Jun 01 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
大学学年自我鉴定
2013/10/28 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python
sql server 累计求和实现代码
2022/02/28 SQL Server