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 相关文章推荐
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
JavaWeb 入门:Hello Servlet
Jul 16 Java/Android
SpringRetry重试框架的具体使用
Jul 25 Java/Android
MyBatis自定义SQL拦截器示例详解
Oct 24 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
OpenCV实现反阈值二值化
Nov 17 Java/Android
alibaba seata服务端具体实现
Feb 24 Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 14 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Android开发手册自定义Switch开关按钮控件
Jun 10 Java/Android
springboot实现string转json json里面带数组
Jun 16 Java/Android
Mybatis 一级缓存和二级缓存原理区别
Sep 23 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 日漫
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
PHP PDO操作总结
2014/11/17 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
为Python的web框架编写前端模版的教程
2015/04/30 Python
python读取文件名称生成list的方法
2018/04/27 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
Python 实现一个简单的web服务器
2021/01/03 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
公司综合部的成员自我评价分享
2013/11/05 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
太太口服液广告词
2014/03/20 职场文书
毕业论文评语大全
2014/04/29 职场文书
中国梦团日活动总结
2014/07/07 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书