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 相关文章推荐
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 Java/Android
SpringBoot生成License的实现示例
Jun 16 Java/Android
Java并发编程必备之Future机制
Jun 30 Java/Android
java解析XML详解
Jul 09 Java/Android
mybatis 获取无数据的字段不显示的问题
Jul 15 Java/Android
dubbo集成zipkin获取Traceid的实现
Jul 26 Java/Android
springboot 自定义配置 解决Boolean属性不生效
Mar 18 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
Java中的继承、多态以及封装
Apr 11 Java/Android
Java 轮询锁使用时遇到问题
May 11 Java/Android
Android开发手册TextInputLayout样式使用示例
Jun 10 Java/Android
java获取一个文本文件的编码(格式)信息
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
详细介绍PHP应用提速面面观
2006/10/09 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
php获取linux命令结果的实例
2017/03/13 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
Python3基础之list列表实例解析
2014/08/13 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
会计实习生工作总结的自我评价
2013/10/07 职场文书
音乐教育感言
2014/03/05 职场文书
建筑管理专业求职信
2014/07/28 职场文书
学期个人自我总结
2015/02/13 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python